From fd28d276992824558aaa27dcc6a34f8d5ea9f51a Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Tue, 31 Aug 2021 23:00:47 -0700 Subject: [PATCH 01/34] adding client factory, context and middleware files --- http/typescript/fetch/src/httpClient.ts | 36 +-- .../typescript/fetch/src/httpClientFactory.ts | 69 +++++ http/typescript/fetch/src/middleware.ts | 6 +- .../src/middleware/AuthenticationHandler.ts | 102 ++++++++ .../fetch/src/middleware/FetchMiddlware.ts | 31 +++ .../fetch/src/middleware/IMiddleware.ts | 18 ++ .../fetch/src/middleware/MiddlewareControl.ts | 64 +++++ .../fetch/src/middleware/MiddlewareFactory.ts | 61 +++++ .../fetch/src/middleware/MiddlewareUtil.ts | 144 +++++++++++ .../fetch/src/middleware/RedirectHandler.ts | 237 ++++++++++++++++++ .../fetch/src/middleware/RetryHandler.ts | 208 +++++++++++++++ .../fetch/src/middleware/TelemetryHandler.ts | 103 ++++++++ .../options/AuthenticationHandlerOptions.ts | 46 ++++ .../middleware/options/IMiddlewareOptions.ts | 14 ++ .../options/RedirectHandlerOptions.ts | 80 ++++++ .../middleware/options/RetryHandlerOptions.ts | 128 ++++++++++ .../options/TelemetryHandlerOptions.ts | 86 +++++++ .../typescript/fetch/src/middlewareContext.ts | 29 +++ 18 files changed, 1430 insertions(+), 32 deletions(-) create mode 100644 http/typescript/fetch/src/httpClientFactory.ts create mode 100644 http/typescript/fetch/src/middleware/AuthenticationHandler.ts create mode 100644 http/typescript/fetch/src/middleware/FetchMiddlware.ts create mode 100644 http/typescript/fetch/src/middleware/IMiddleware.ts create mode 100644 http/typescript/fetch/src/middleware/MiddlewareControl.ts create mode 100644 http/typescript/fetch/src/middleware/MiddlewareFactory.ts create mode 100644 http/typescript/fetch/src/middleware/MiddlewareUtil.ts create mode 100644 http/typescript/fetch/src/middleware/RedirectHandler.ts create mode 100644 http/typescript/fetch/src/middleware/RetryHandler.ts create mode 100644 http/typescript/fetch/src/middleware/TelemetryHandler.ts create mode 100644 http/typescript/fetch/src/middleware/options/AuthenticationHandlerOptions.ts create mode 100644 http/typescript/fetch/src/middleware/options/IMiddlewareOptions.ts create mode 100644 http/typescript/fetch/src/middleware/options/RedirectHandlerOptions.ts create mode 100644 http/typescript/fetch/src/middleware/options/RetryHandlerOptions.ts create mode 100644 http/typescript/fetch/src/middleware/options/TelemetryHandlerOptions.ts create mode 100644 http/typescript/fetch/src/middlewareContext.ts diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index 98a59d4a58..ac94bdf64c 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -1,6 +1,5 @@ import { Middleware } from "./middleware"; -import { fetch } from 'cross-fetch'; -import { MiddlewareOption } from "@microsoft/kiota-abstractions"; +import { MiddlewareContext } from "./middlewareContext"; /** Default fetch client with options and a middleware pipleline for requests execution. */ export class HttpClient { @@ -9,10 +8,9 @@ export class HttpClient { * @param middlewares middlewares to be used for requests execution. * @param defaultRequestSettings default request settings to be used for requests execution. */ - public constructor(private readonly middlewares: Middleware[] = HttpClient.getDefaultMiddlewares(), private readonly defaultRequestSettings: RequestInit = HttpClient.getDefaultRequestSettings()) { - this.middlewares = [...this.middlewares, new FetchMiddleware()]; + public constructor(private readonly middlewares: Middleware[] = HttpClient.getDefaultMiddlewares()) { this.middlewares.forEach((middleware, idx) => { - if(idx < this.middlewares.length) + if (idx < this.middlewares.length) middleware.next = this.middlewares[idx + 1]; }); } @@ -22,32 +20,10 @@ export class HttpClient { * @param options request options. * @returns the promise resolving the response. */ - public fetch(url: string, options?: RequestInit, middlewareOptions?: MiddlewareOption[]): Promise { - const finalOptions = {...this.defaultRequestSettings, ...options} as RequestInit; - if(this.middlewares.length > 0 && this.middlewares[0]) - return this.middlewares[0].execute(url, finalOptions, middlewareOptions); + public fetch(context: MiddlewareContext): Promise { + if (this.middlewares.length > 0 && this.middlewares[0]) + return this.middlewares[0].execute(context: MiddlewareContext); else throw new Error("No middlewares found"); } - /** - * Gets the default middlewares in use for the client. - * @returns the default middlewares. - */ - public static getDefaultMiddlewares(): Middleware[] { - return []; //TODO add default middlewares - } - /** - * Gets the default request settings to be used for the client. - * @returns the default request settings. - */ - public static getDefaultRequestSettings(): RequestInit { - return {}; //TODO add default request settings - } -} -/** Default middleware executing a request. Internal use only. */ -class FetchMiddleware implements Middleware { - next: Middleware | undefined; - public execute(url: string, req: RequestInit, _?: MiddlewareOption[]): Promise { - return fetch(url, req); - } } \ No newline at end of file diff --git a/http/typescript/fetch/src/httpClientFactory.ts b/http/typescript/fetch/src/httpClientFactory.ts new file mode 100644 index 0000000000..608d0f888e --- /dev/null +++ b/http/typescript/fetch/src/httpClientFactory.ts @@ -0,0 +1,69 @@ +/** + * @module HTTPClientFactory + */ + + import { HTTPClient } from "./HTTPClient"; + import { AuthenticationProvider } from "./IAuthenticationProvider"; + import { AuthenticationHandler } from "./middleware/AuthenticationHandler"; + import { HTTPMessageHandler } from "./middleware/FetchHandler"; + import { Middleware } from "./middleware/IMiddleware"; + import { RedirectHandlerOptions } from "./middleware/options/RedirectHandlerOptions"; + import { RetryHandlerOptions } from "./middleware/options/RetryHandlerOptions"; + import { RedirectHandler } from "./middleware/RedirectHandler"; + import { RetryHandler } from "./middleware/RetryHandler"; + + /** + * @private + * To check whether the environment is node or not + * @returns A boolean representing the environment is node or not + */ + const isNodeEnvironment = (): boolean => { + return typeof process === "object" && typeof require === "function"; + }; + + /** + * @class + * Class representing HTTPClientFactory + */ + export class HTTPClientFactory { + /** + * @public + * @static + * Creates HTTPClient with default middleware chain + * @param {AuthenticationProvider} authProvider - The authentication provider instance + * @returns A HTTPClient instance + * + * NOTE: These are the things that we need to remember while doing modifications in the below default pipeline. + * * HTTPMessageHander should be the last one in the middleware pipeline, because this makes the actual network call of the request + * * The best place for AuthenticationHandler is in the starting of the pipeline, because every other handler might have to work for multiple times for a request but the auth token for + * them will remain same. For example, Retry and Redirect handlers might be working multiple times for a request based on the response but their auth token would remain same. + */ + public static createWithAuthenticationProvider(authProvider: AuthenticationProvider): HTTPClient { + const authenticationHandler = new AuthenticationHandler(authProvider); + const retryHandler = new RetryHandler(new RetryHandlerOptions()); + const FetchHandler = new FetchHandler(); + + authenticationHandler.setNext(retryHandler); + if (isNodeEnvironment()) { + const redirectHandler = new RedirectHandler(new RedirectHandlerOptions()); + retryHandler.setNext(redirectHandler); + redirectHandler.setNext(FetchHandler); + } else { + retryHandler.setNext(FetchHandler); + } + return HTTPClientFactory.createWithMiddleware(authenticationHandler); + } + + /** + * @public + * @static + * Creates a middleware chain with the given one + * @property {...Middleware} middleware - The first middleware of the middleware chain or a sequence of all the Middleware handlers + * @returns A HTTPClient instance + */ + public static createWithMiddleware(...middleware: Middleware[]): HTTPClient { + // Middleware should not empty or undefined. This is check is present in the HTTPClient constructor. + return new HTTPClient(...middleware); + } + } + \ No newline at end of file diff --git a/http/typescript/fetch/src/middleware.ts b/http/typescript/fetch/src/middleware.ts index abb6ab84ee..8a002fc190 100644 --- a/http/typescript/fetch/src/middleware.ts +++ b/http/typescript/fetch/src/middleware.ts @@ -1,4 +1,5 @@ -import { MiddlewareOption } from "@microsoft/kiota-abstractions"; +import { Context } from "vm"; +import { MiddlewareContext } from "./middlewareContext"; /** Defines the contract for a middleware in the request execution pipeline. */ export interface Middleware { @@ -10,5 +11,6 @@ export interface Middleware { * @param url The URL of the request. * @return A promise that resolves to the response object. */ - execute(url: string, req: RequestInit, middlewareOptions?: MiddlewareOption[]): Promise; + execute(context: MiddlewareContext): Promise; + setNext?: (middleware: Middleware) => void; } \ No newline at end of file diff --git a/http/typescript/fetch/src/middleware/AuthenticationHandler.ts b/http/typescript/fetch/src/middleware/AuthenticationHandler.ts new file mode 100644 index 0000000000..4f99dbeae0 --- /dev/null +++ b/http/typescript/fetch/src/middleware/AuthenticationHandler.ts @@ -0,0 +1,102 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module AuthenticationHandler + */ + +import { isCustomHost, isGraphURL } from "../GraphRequestUtil"; +import { AuthenticationProvider } from "@microsoft/kiota-abstractions"; +import { AuthenticationProviderOptions } from "../IAuthenticationProviderOptions"; +import { Context } from "../IContext"; +import { Middleware } from "./IMiddleware"; +import { MiddlewareControl } from "./MiddlewareControl"; +import { appendRequestHeader } from "./MiddlewareUtil"; +import { AuthenticationHandlerOptions } from "./options/AuthenticationHandlerOptions"; +import { FeatureUsageFlag, TelemetryHandlerOptions } from "./options/TelemetryHandlerOptions"; + +/** + * @class + * @implements Middleware + * Class representing AuthenticationHandler + */ +export class AuthenticationHandler implements Middleware { + /** + * @private + * A member representing the authorization header name + */ + private static AUTHORIZATION_HEADER = "Authorization"; + + /** + * @private + * A member to hold an AuthenticationProvider instance + */ + private authenticationProvider: AuthenticationProvider; + + /** + * @private + * A member to hold next middleware in the middleware chain + */ + private nextMiddleware: Middleware; + + /** + * @public + * @constructor + * Creates an instance of AuthenticationHandler + * @param {AuthenticationProvider} authenticationProvider - The authentication provider for the authentication handler + */ + public constructor(authenticationProvider: AuthenticationProvider) { + this.authenticationProvider = authenticationProvider; + } + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The context object of the request + * @returns A Promise that resolves to nothing + */ + public async execute(context: Context): Promise { + + // TODO: move authenticate request logic from HttpCore + const url = typeof context.request === "string" ? context.request : context.request.url; + if (isGraphURL(url) || (context.customHosts && isCustomHost(url, context.customHosts))) { + let options: AuthenticationHandlerOptions; + if (context.middlewareControl instanceof MiddlewareControl) { + options = context.middlewareControl.getMiddlewareOptions(AuthenticationHandlerOptions) as AuthenticationHandlerOptions; + } + let authenticationProvider: AuthenticationProvider; + let authenticationProviderOptions: AuthenticationProviderOptions; + if (options) { + authenticationProvider = options.authenticationProvider; + authenticationProviderOptions = options.authenticationProviderOptions; + } + if (!authenticationProvider) { + authenticationProvider = this.authenticationProvider; + } + const token: string = await authenticationProvider.getAccessToken(authenticationProviderOptions); + const bearerKey = `Bearer ${token}`; + appendRequestHeader(context.request, context.options, AuthenticationHandler.AUTHORIZATION_HEADER, bearerKey); + TelemetryHandlerOptions.updateFeatureUsageFlag(context, FeatureUsageFlag.AUTHENTICATION_HANDLER_ENABLED); + } else { + if (context.options.headers) { + delete context.options.headers[AuthenticationHandler.AUTHORIZATION_HEADER]; + } + } + return await this.nextMiddleware.execute(context); + } + + /** + * @public + * To set the next middleware in the chain + * @param {Middleware} next - The middleware instance + * @returns Nothing + */ + public setNext(next: Middleware): void { + this.nextMiddleware = next; + } +} diff --git a/http/typescript/fetch/src/middleware/FetchMiddlware.ts b/http/typescript/fetch/src/middleware/FetchMiddlware.ts new file mode 100644 index 0000000000..de1c4b5977 --- /dev/null +++ b/http/typescript/fetch/src/middleware/FetchMiddlware.ts @@ -0,0 +1,31 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module HTTPMessageHandler + */ + +import { MiddlewareContext } from "../middlewareContext"; +import { Middleware } from "./IMiddleware"; + +/** + * @class + * @implements Middleware + * Class for HTTPMessageHandler + */ +export class HTTPMessageHandler implements Middleware { + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The request context object + * @returns A promise that resolves to nothing + */ + public async execute(context: MiddlewareContext): Promise { + context.response = await fetch(context.request, context.options); + } +} diff --git a/http/typescript/fetch/src/middleware/IMiddleware.ts b/http/typescript/fetch/src/middleware/IMiddleware.ts new file mode 100644 index 0000000000..70dacc7034 --- /dev/null +++ b/http/typescript/fetch/src/middleware/IMiddleware.ts @@ -0,0 +1,18 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +import { Context } from "../IContext"; + +/** + * @interface + * @property {Function} execute - The method to execute the middleware + * @property {Function} [setNext] - A method to set the next middleware in the chain + */ +export interface Middleware { + execute: (context: Context) => Promise; + setNext?: (middleware: Middleware) => void; +} diff --git a/http/typescript/fetch/src/middleware/MiddlewareControl.ts b/http/typescript/fetch/src/middleware/MiddlewareControl.ts new file mode 100644 index 0000000000..93ab7ad9cb --- /dev/null +++ b/http/typescript/fetch/src/middleware/MiddlewareControl.ts @@ -0,0 +1,64 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module MiddlewareControl + */ + +import { MiddlewareOptions } from "./options/IMiddlewareOptions"; + +/** + * @class + * Class representing MiddlewareControl + */ +export class MiddlewareControl { + /** + * @private + * A member holding map of MiddlewareOptions + */ + private middlewareOptions: Map; + + /** + * @public + * @constructor + * Creates an instance of MiddlewareControl + * @param {MiddlewareOptions[]} [middlewareOptions = []] - The array of middlewareOptions + * @returns The instance of MiddlewareControl + */ + public constructor(middlewareOptions: MiddlewareOptions[] = []) { + this.middlewareOptions = new Map(); + for (const option of middlewareOptions) { + const fn = option.constructor; + this.middlewareOptions.set(fn, option); + } + } + + /** + * @public + * To get the middleware option using the class of the option + * @param {Function} fn - The class of the strongly typed option class + * @returns The middleware option + * @example + * // if you wanted to return the middleware option associated with this class (MiddlewareControl) + * // call this function like this: + * getMiddlewareOptions(MiddlewareControl) + */ + public getMiddlewareOptions(fn: Function): MiddlewareOptions { + return this.middlewareOptions.get(fn); + } + + /** + * @public + * To set the middleware options using the class of the option + * @param {Function} fn - The class of the strongly typed option class + * @param {MiddlewareOptions} option - The strongly typed middleware option + * @returns nothing + */ + public setMiddlewareOptions(fn: Function, option: MiddlewareOptions): void { + this.middlewareOptions.set(fn, option); + } +} diff --git a/http/typescript/fetch/src/middleware/MiddlewareFactory.ts b/http/typescript/fetch/src/middleware/MiddlewareFactory.ts new file mode 100644 index 0000000000..f35cd82e96 --- /dev/null +++ b/http/typescript/fetch/src/middleware/MiddlewareFactory.ts @@ -0,0 +1,61 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module MiddlewareFactory + */ + +import { AuthenticationProvider } from "../IAuthenticationProvider"; +import { AuthenticationHandler } from "./AuthenticationHandler"; +import { HTTPMessageHandler } from "./FetchMiddlware"; +import { Middleware } from "./IMiddleware"; +import { RedirectHandlerOptions } from "./options/RedirectHandlerOptions"; +import { RetryHandlerOptions } from "./options/RetryHandlerOptions"; +import { RedirectHandler } from "./RedirectHandler"; +import { RetryHandler } from "./RetryHandler"; +import { TelemetryHandler } from "./TelemetryHandler"; + +/** + * @private + * To check whether the environment is node or not + * @returns A boolean representing the environment is node or not + */ +const isNodeEnvironment = (): boolean => { + return typeof process === "object" && typeof require === "function"; +}; + +/** + * @class + * Class containing function(s) related to the middleware pipelines. + */ +export class MiddlewareFactory { + /** + * @public + * @static + * Returns the default middleware chain an array with the middleware handlers + * @param {AuthenticationProvider} authProvider - The authentication provider instance + * @returns an array of the middleware handlers of the default middleware chain + */ + public static getDefaultMiddlewareChain(authProvider: AuthenticationProvider): Middleware[] { + const middleware: Middleware[] = []; + const authenticationHandler = new AuthenticationHandler(authProvider); + const retryHandler = new RetryHandler(new RetryHandlerOptions()); + const telemetryHandler = new TelemetryHandler(); + const httpMessageHandler = new HTTPMessageHandler(); + + middleware.push(authenticationHandler); + middleware.push(retryHandler); + if (isNodeEnvironment()) { + const redirectHandler = new RedirectHandler(new RedirectHandlerOptions()); + middleware.push(redirectHandler); + } + middleware.push(telemetryHandler); + middleware.push(httpMessageHandler); + + return middleware; + } +} diff --git a/http/typescript/fetch/src/middleware/MiddlewareUtil.ts b/http/typescript/fetch/src/middleware/MiddlewareUtil.ts new file mode 100644 index 0000000000..b346037ca8 --- /dev/null +++ b/http/typescript/fetch/src/middleware/MiddlewareUtil.ts @@ -0,0 +1,144 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module MiddlewareUtil + */ + +import { FetchOptions } from "../IFetchOptions"; + +/** + * @constant + * To generate the UUID + * @returns The UUID string + */ +export const generateUUID = (): string => { + let uuid = ""; + for (let j = 0; j < 32; j++) { + if (j === 8 || j === 12 || j === 16 || j === 20) { + uuid += "-"; + } + uuid += Math.floor(Math.random() * 16).toString(16); + } + return uuid; +}; + +/** + * @constant + * To get the request header from the request + * @param {RequestInfo} request - The request object or the url string + * @param {FetchOptions|undefined} options - The request options object + * @param {string} key - The header key string + * @returns A header value for the given key from the request + */ +export const getRequestHeader = (request: RequestInfo, options: FetchOptions | undefined, key: string): string | null => { + let value: string = null; + if (typeof Request !== "undefined" && request instanceof Request) { + value = (request as Request).headers.get(key); + } else if (typeof options !== "undefined" && options.headers !== undefined) { + if (typeof Headers !== "undefined" && options.headers instanceof Headers) { + value = (options.headers as Headers).get(key); + } else if (options.headers instanceof Array) { + const headers = options.headers as string[][]; + for (let i = 0, l = headers.length; i < l; i++) { + if (headers[i][0] === key) { + value = headers[i][1]; + break; + } + } + } else if (options.headers[key] !== undefined) { + value = options.headers[key]; + } + } + return value; +}; + +/** + * @constant + * To set the header value to the given request + * @param {RequestInfo} request - The request object or the url string + * @param {FetchOptions|undefined} options - The request options object + * @param {string} key - The header key string + * @param {string } value - The header value string + * @returns Nothing + */ +export const setRequestHeader = (request: RequestInfo, options: FetchOptions | undefined, key: string, value: string): void => { + if (typeof Request !== "undefined" && request instanceof Request) { + (request as Request).headers.set(key, value); + } else if (typeof options !== "undefined") { + if (options.headers === undefined) { + options.headers = new Headers({ + [key]: value, + }); + } else { + if (typeof Headers !== "undefined" && options.headers instanceof Headers) { + (options.headers as Headers).set(key, value); + } else if (options.headers instanceof Array) { + let i = 0; + const l = options.headers.length; + for (; i < l; i++) { + const header = options.headers[i]; + if (header[0] === key) { + header[1] = value; + break; + } + } + if (i === l) { + (options.headers as string[][]).push([key, value]); + } + } else { + Object.assign(options.headers, { [key]: value }); + } + } + } +}; + +/** + * @constant + * To append the header value to the given request + * @param {RequestInfo} request - The request object or the url string + * @param {FetchOptions|undefined} options - The request options object + * @param {string} key - The header key string + * @param {string } value - The header value string + * @returns Nothing + */ +export const appendRequestHeader = (request: RequestInfo, options: FetchOptions | undefined, key: string, value: string): void => { + if (typeof Request !== "undefined" && request instanceof Request) { + (request as Request).headers.append(key, value); + } else if (typeof options !== "undefined") { + if (options.headers === undefined) { + options.headers = new Headers({ + [key]: value, + }); + } else { + if (typeof Headers !== "undefined" && options.headers instanceof Headers) { + (options.headers as Headers).append(key, value); + } else if (options.headers instanceof Array) { + (options.headers as string[][]).push([key, value]); + } else if (options.headers === undefined) { + options.headers = { [key]: value }; + } else if (options.headers[key] === undefined) { + options.headers[key] = value; + } else { + options.headers[key] += `, ${value}`; + } + } + } +}; + +/** + * @constant + * To clone the request with the new url + * @param {string} url - The new url string + * @param {Request} request - The request object + * @returns A promise that resolves to request object + */ +export const cloneRequestWithNewUrl = async (newUrl: string, request: Request): Promise => { + const body = request.headers.get("Content-Type") ? await request.blob() : await Promise.resolve(undefined); + const { method, headers, referrer, referrerPolicy, mode, credentials, cache, redirect, integrity, keepalive, signal } = request; + return new Request(newUrl, { method, headers, body, referrer, referrerPolicy, mode, credentials, cache, redirect, integrity, keepalive, signal }); +}; diff --git a/http/typescript/fetch/src/middleware/RedirectHandler.ts b/http/typescript/fetch/src/middleware/RedirectHandler.ts new file mode 100644 index 0000000000..911e408f27 --- /dev/null +++ b/http/typescript/fetch/src/middleware/RedirectHandler.ts @@ -0,0 +1,237 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module RedirectHandler + */ + +import { Context } from "../IContext"; +import { RequestMethod } from "../RequestMethod"; +import { Middleware } from "./IMiddleware"; +import { MiddlewareControl } from "./MiddlewareControl"; +import { cloneRequestWithNewUrl } from "./MiddlewareUtil"; +import { RedirectHandlerOptions } from "./options/RedirectHandlerOptions"; +import { FeatureUsageFlag, TelemetryHandlerOptions } from "./options/TelemetryHandlerOptions"; + +/** + * @class + * Class + * @implements Middleware + * Class representing RedirectHandler + */ +export class RedirectHandler implements Middleware { + /** + * @private + * @static + * A member holding the array of redirect status codes + */ + private static REDIRECT_STATUS_CODES: number[] = [ + 301, // Moved Permanently + 302, // Found + 303, // See Other + 307, // Temporary Permanently + 308, // Moved Permanently + ]; + + /** + * @private + * @static + * A member holding SeeOther status code + */ + private static STATUS_CODE_SEE_OTHER = 303; + + /** + * @private + * @static + * A member holding the name of the location header + */ + private static LOCATION_HEADER = "Location"; + + /** + * @private + * @static + * A member representing the authorization header name + */ + private static AUTHORIZATION_HEADER = "Authorization"; + + /** + * @private + * @static + * A member holding the manual redirect value + */ + private static MANUAL_REDIRECT: RequestRedirect = "manual"; + + /** + * @private + * A member holding options to customize the handler behavior + */ + private options: RedirectHandlerOptions; + + /** + * @private + * A member to hold next middleware in the middleware chain + */ + private nextMiddleware: Middleware; + + /** + * @public + * @constructor + * To create an instance of RedirectHandler + * @param {RedirectHandlerOptions} [options = new RedirectHandlerOptions()] - The redirect handler options instance + * @returns An instance of RedirectHandler + */ + + public constructor(options: RedirectHandlerOptions = new RedirectHandlerOptions()) { + this.options = options; + } + + /** + * @private + * To check whether the response has the redirect status code or not + * @param {Response} response - The response object + * @returns A boolean representing whether the response contains the redirect status code or not + */ + private isRedirect(response: Response): boolean { + return RedirectHandler.REDIRECT_STATUS_CODES.indexOf(response.status) !== -1; + } + + /** + * @private + * To check whether the response has location header or not + * @param {Response} response - The response object + * @returns A boolean representing the whether the response has location header or not + */ + private hasLocationHeader(response: Response): boolean { + return response.headers.has(RedirectHandler.LOCATION_HEADER); + } + + /** + * @private + * To get the redirect url from location header in response object + * @param {Response} response - The response object + * @returns A redirect url from location header + */ + private getLocationHeader(response: Response): string { + return response.headers.get(RedirectHandler.LOCATION_HEADER); + } + + /** + * @private + * To check whether the given url is a relative url or not + * @param {string} url - The url string value + * @returns A boolean representing whether the given url is a relative url or not + */ + private isRelativeURL(url: string): boolean { + return url.indexOf("://") === -1; + } + + /** + * @private + * To check whether the authorization header in the request should be dropped for consequent redirected requests + * @param {string} requestUrl - The request url value + * @param {string} redirectUrl - The redirect url value + * @returns A boolean representing whether the authorization header in the request should be dropped for consequent redirected requests + */ + private shouldDropAuthorizationHeader(requestUrl: string, redirectUrl: string): boolean { + const schemeHostRegex = /^[A-Za-z].+?:\/\/.+?(?=\/|$)/; + const requestMatches: string[] = schemeHostRegex.exec(requestUrl); + let requestAuthority: string; + let redirectAuthority: string; + if (requestMatches !== null) { + requestAuthority = requestMatches[0]; + } + const redirectMatches: string[] = schemeHostRegex.exec(redirectUrl); + if (redirectMatches !== null) { + redirectAuthority = redirectMatches[0]; + } + return typeof requestAuthority !== "undefined" && typeof redirectAuthority !== "undefined" && requestAuthority !== redirectAuthority; + } + + /** + * @private + * @async + * To update a request url with the redirect url + * @param {string} redirectUrl - The redirect url value + * @param {Context} context - The context object value + * @returns Nothing + */ + private async updateRequestUrl(redirectUrl: string, context: Context): Promise { + context.request = typeof context.request === "string" ? redirectUrl : await cloneRequestWithNewUrl(redirectUrl, context.request as Request); + } + + /** + * @private + * To get the options for execution of the middleware + * @param {Context} context - The context object + * @returns A options for middleware execution + */ + private getOptions(context: Context): RedirectHandlerOptions { + let options: RedirectHandlerOptions; + if (context.middlewareControl instanceof MiddlewareControl) { + options = context.middlewareControl.getMiddlewareOptions(RedirectHandlerOptions) as RedirectHandlerOptions; + } + if (typeof options === "undefined") { + options = Object.assign(new RedirectHandlerOptions(), this.options); + } + return options; + } + + /** + * @private + * @async + * To execute the next middleware and to handle in case of redirect response returned by the server + * @param {Context} context - The context object + * @param {number} redirectCount - The redirect count value + * @param {RedirectHandlerOptions} options - The redirect handler options instance + * @returns A promise that resolves to nothing + */ + private async executeWithRedirect(context: Context, redirectCount: number, options: RedirectHandlerOptions): Promise { + await this.nextMiddleware.execute(context); + const response = context.response; + if (redirectCount < options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && options.shouldRedirect(response)) { + ++redirectCount; + if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { + context.options.method = RequestMethod.GET; + delete context.options.body; + } else { + const redirectUrl: string = this.getLocationHeader(response); + if (!this.isRelativeURL(redirectUrl) && this.shouldDropAuthorizationHeader(response.url, redirectUrl)) { + delete context.options.headers[RedirectHandler.AUTHORIZATION_HEADER]; + } + await this.updateRequestUrl(redirectUrl, context); + } + await this.executeWithRedirect(context, redirectCount, options); + } else { + return; + } + } + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The context object of the request + * @returns A Promise that resolves to nothing + */ + public async execute(context: Context): Promise { + const redirectCount = 0; + const options = this.getOptions(context); + context.options.redirect = RedirectHandler.MANUAL_REDIRECT; + TelemetryHandlerOptions.updateFeatureUsageFlag(context, FeatureUsageFlag.REDIRECT_HANDLER_ENABLED); + return await this.executeWithRedirect(context, redirectCount, options); + } + + /** + * @public + * To set the next middleware in the chain + * @param {Middleware} next - The middleware instance + * @returns Nothing + */ + public setNext(next: Middleware): void { + this.nextMiddleware = next; + } +} diff --git a/http/typescript/fetch/src/middleware/RetryHandler.ts b/http/typescript/fetch/src/middleware/RetryHandler.ts new file mode 100644 index 0000000000..36836fecb2 --- /dev/null +++ b/http/typescript/fetch/src/middleware/RetryHandler.ts @@ -0,0 +1,208 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module RetryHandler + */ + +import { Context } from "../IContext"; +import { FetchOptions } from "../IFetchOptions"; +import { RequestMethod } from "../RequestMethod"; +import { Middleware } from "./IMiddleware"; +import { MiddlewareControl } from "./MiddlewareControl"; +import { getRequestHeader, setRequestHeader } from "./MiddlewareUtil"; +import { RetryHandlerOptions } from "./options/RetryHandlerOptions"; +import { FeatureUsageFlag, TelemetryHandlerOptions } from "./options/TelemetryHandlerOptions"; + +/** + * @class + * @implements Middleware + * Class for RetryHandler + */ +export class RetryHandler implements Middleware { + /** + * @private + * @static + * A list of status codes that needs to be retried + */ + private static RETRY_STATUS_CODES: number[] = [ + 429, // Too many requests + 503, // Service unavailable + 504, // Gateway timeout + ]; + + /** + * @private + * @static + * A member holding the name of retry attempt header + */ + private static RETRY_ATTEMPT_HEADER = "Retry-Attempt"; + + /** + * @private + * @static + * A member holding the name of retry after header + */ + private static RETRY_AFTER_HEADER = "Retry-After"; + + /** + * @private + * A member to hold next middleware in the middleware chain + */ + private nextMiddleware: Middleware; + + /** + * @private + * A member holding the retry handler options + */ + private options: RetryHandlerOptions; + + /** + * @public + * @constructor + * To create an instance of RetryHandler + * @param {RetryHandlerOptions} [options = new RetryHandlerOptions()] - The retry handler options value + * @returns An instance of RetryHandler + */ + public constructor(options: RetryHandlerOptions = new RetryHandlerOptions()) { + this.options = options; + } + + /** + * + * @private + * To check whether the response has the retry status code + * @param {Response} response - The response object + * @returns Whether the response has retry status code or not + */ + private isRetry(response: Response): boolean { + return RetryHandler.RETRY_STATUS_CODES.indexOf(response.status) !== -1; + } + + /** + * @private + * To check whether the payload is buffered or not + * @param {RequestInfo} request - The url string or the request object value + * @param {FetchOptions} options - The options of a request + * @returns Whether the payload is buffered or not + */ + private isBuffered(request: RequestInfo, options: FetchOptions | undefined): boolean { + const method = typeof request === "string" ? options.method : (request as Request).method; + const isPutPatchOrPost: boolean = method === RequestMethod.PUT || method === RequestMethod.PATCH || method === RequestMethod.POST; + if (isPutPatchOrPost) { + const isStream = getRequestHeader(request, options, "Content-Type") === "application/octet-stream"; + if (isStream) { + return false; + } + } + return true; + } + + /** + * @private + * To get the delay for a retry + * @param {Response} response - The response object + * @param {number} retryAttempts - The current attempt count + * @param {number} delay - The delay value in seconds + * @returns A delay for a retry + */ + private getDelay(response: Response, retryAttempts: number, delay: number): number { + const getRandomness = () => Number(Math.random().toFixed(3)); + const retryAfter = response.headers !== undefined ? response.headers.get(RetryHandler.RETRY_AFTER_HEADER) : null; + let newDelay: number; + if (retryAfter !== null) { + if (Number.isNaN(Number(retryAfter))) { + newDelay = Math.round((new Date(retryAfter).getTime() - Date.now()) / 1000); + } else { + newDelay = Number(retryAfter); + } + } else { + // Adding randomness to avoid retrying at a same + newDelay = retryAttempts >= 2 ? this.getExponentialBackOffTime(retryAttempts) + delay + getRandomness() : delay + getRandomness(); + } + return Math.min(newDelay, this.options.getMaxDelay() + getRandomness()); + } + + /** + * @private + * To get an exponential back off value + * @param {number} attempts - The current attempt count + * @returns An exponential back off value + */ + private getExponentialBackOffTime(attempts: number): number { + return Math.round((1 / 2) * (2 ** attempts - 1)); + } + + /** + * @private + * @async + * To add delay for the execution + * @param {number} delaySeconds - The delay value in seconds + * @returns Nothing + */ + private async sleep(delaySeconds: number): Promise { + const delayMilliseconds = delaySeconds * 1000; + return new Promise((resolve) => setTimeout(resolve, delayMilliseconds)); + } + + private getOptions(context: Context): RetryHandlerOptions { + let options: RetryHandlerOptions; + if (context.middlewareControl instanceof MiddlewareControl) { + options = context.middlewareControl.getMiddlewareOptions(this.options.constructor) as RetryHandlerOptions; + } + if (typeof options === "undefined") { + options = Object.assign(new RetryHandlerOptions(), this.options); + } + return options; + } + + /** + * @private + * @async + * To execute the middleware with retries + * @param {Context} context - The context object + * @param {number} retryAttempts - The current attempt count + * @param {RetryHandlerOptions} options - The retry middleware options instance + * @returns A Promise that resolves to nothing + */ + private async executeWithRetry(context: Context, retryAttempts: number, options: RetryHandlerOptions): Promise { + await this.nextMiddleware.execute(context); + if (retryAttempts < options.maxRetries && this.isRetry(context.response) && this.isBuffered(context.request, context.options) && options.shouldRetry(options.delay, retryAttempts, context.request, context.options, context.response)) { + ++retryAttempts; + setRequestHeader(context.request, context.options, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); + const delay = this.getDelay(context.response, retryAttempts, options.delay); + await this.sleep(delay); + return await this.executeWithRetry(context, retryAttempts, options); + } else { + return; + } + } + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The context object of the request + * @returns A Promise that resolves to nothing + */ + public async execute(context: Context): Promise { + const retryAttempts = 0; + const options: RetryHandlerOptions = this.getOptions(context); + TelemetryHandlerOptions.updateFeatureUsageFlag(context, FeatureUsageFlag.RETRY_HANDLER_ENABLED); + return await this.executeWithRetry(context, retryAttempts, options); + } + + /** + * @public + * To set the next middleware in the chain + * @param {Middleware} next - The middleware instance + * @returns Nothing + */ + public setNext(next: Middleware): void { + this.nextMiddleware = next; + } +} diff --git a/http/typescript/fetch/src/middleware/TelemetryHandler.ts b/http/typescript/fetch/src/middleware/TelemetryHandler.ts new file mode 100644 index 0000000000..77278437cc --- /dev/null +++ b/http/typescript/fetch/src/middleware/TelemetryHandler.ts @@ -0,0 +1,103 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module TelemetryHandler + */ +import { isCustomHost, isGraphURL } from "../GraphRequestUtil"; +import { Context } from "../IContext"; +import { PACKAGE_VERSION } from "../Version"; +import { Middleware } from "./IMiddleware"; +import { MiddlewareControl } from "./MiddlewareControl"; +import { appendRequestHeader, generateUUID, getRequestHeader, setRequestHeader } from "./MiddlewareUtil"; +import { TelemetryHandlerOptions } from "./options/TelemetryHandlerOptions"; + +/** + * @class + * @implements Middleware + * Class for TelemetryHandler + */ +export class TelemetryHandler implements Middleware { + /** + * @private + * @static + * A member holding the name of the client request id header + */ + private static CLIENT_REQUEST_ID_HEADER = "client-request-id"; + + /** + * @private + * @static + * A member holding the name of the sdk version header + */ + private static SDK_VERSION_HEADER = "SdkVersion"; + + /** + * @private + * @static + * A member holding the language prefix for the sdk version header value + */ + private static PRODUCT_NAME = "graph-js"; + + /** + * @private + * @static + * A member holding the key for the feature usage metrics + */ + private static FEATURE_USAGE_STRING = "featureUsage"; + + /** + * @private + * A member to hold next middleware in the middleware chain + */ + private nextMiddleware: Middleware; + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The context object of the request + * @returns A Promise that resolves to nothing + */ + public async execute(context: Context): Promise { + const url = typeof context.request === "string" ? context.request : context.request.url; + if (isGraphURL(url) || (context.customHosts && isCustomHost(url, context.customHosts))) { + // Add telemetry only if the request url is a Graph URL. + // Errors are reported as in issue #265 if headers are present when redirecting to a non Graph URL + let clientRequestId: string = getRequestHeader(context.request, context.options, TelemetryHandler.CLIENT_REQUEST_ID_HEADER); + if (!clientRequestId) { + clientRequestId = generateUUID(); + setRequestHeader(context.request, context.options, TelemetryHandler.CLIENT_REQUEST_ID_HEADER, clientRequestId); + } + let sdkVersionValue = `${TelemetryHandler.PRODUCT_NAME}/${PACKAGE_VERSION}`; + let options: TelemetryHandlerOptions; + if (context.middlewareControl instanceof MiddlewareControl) { + options = context.middlewareControl.getMiddlewareOptions(TelemetryHandlerOptions) as TelemetryHandlerOptions; + } + if (options) { + const featureUsage: string = options.getFeatureUsage(); + sdkVersionValue += ` (${TelemetryHandler.FEATURE_USAGE_STRING}=${featureUsage})`; + } + appendRequestHeader(context.request, context.options, TelemetryHandler.SDK_VERSION_HEADER, sdkVersionValue); + } else { + // Remove telemetry headers if present during redirection. + delete context.options.headers[TelemetryHandler.CLIENT_REQUEST_ID_HEADER]; + delete context.options.headers[TelemetryHandler.SDK_VERSION_HEADER]; + } + return await this.nextMiddleware.execute(context); + } + + /** + * @public + * To set the next middleware in the chain + * @param {Middleware} next - The middleware instance + * @returns Nothing + */ + public setNext(next: Middleware): void { + this.nextMiddleware = next; + } +} diff --git a/http/typescript/fetch/src/middleware/options/AuthenticationHandlerOptions.ts b/http/typescript/fetch/src/middleware/options/AuthenticationHandlerOptions.ts new file mode 100644 index 0000000000..547b326bae --- /dev/null +++ b/http/typescript/fetch/src/middleware/options/AuthenticationHandlerOptions.ts @@ -0,0 +1,46 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module AuthenticationHandlerOptions + */ + +import { AuthenticationProvider } from "../../IAuthenticationProvider"; +import { AuthenticationProviderOptions } from "../../IAuthenticationProviderOptions"; +import { MiddlewareOptions } from "./IMiddlewareOptions"; + +/** + * @class + * @implements MiddlewareOptions + * Class representing AuthenticationHandlerOptions + */ +export class AuthenticationHandlerOptions implements MiddlewareOptions { + /** + * @public + * A member holding an instance of an authentication provider + */ + public authenticationProvider: AuthenticationProvider; + + /** + * @public + * A member holding an instance of authentication provider options + */ + public authenticationProviderOptions: AuthenticationProviderOptions; + + /** + * @public + * @constructor + * To create an instance of AuthenticationHandlerOptions + * @param {AuthenticationProvider} [authenticationProvider] - The authentication provider instance + * @param {AuthenticationProviderOptions} [authenticationProviderOptions] - The authentication provider options instance + * @returns An instance of AuthenticationHandlerOptions + */ + public constructor(authenticationProvider?: AuthenticationProvider, authenticationProviderOptions?: AuthenticationProviderOptions) { + this.authenticationProvider = authenticationProvider; + this.authenticationProviderOptions = authenticationProviderOptions; + } +} diff --git a/http/typescript/fetch/src/middleware/options/IMiddlewareOptions.ts b/http/typescript/fetch/src/middleware/options/IMiddlewareOptions.ts new file mode 100644 index 0000000000..ebbf308270 --- /dev/null +++ b/http/typescript/fetch/src/middleware/options/IMiddlewareOptions.ts @@ -0,0 +1,14 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @interface + * Signature representing the middleware options + */ + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface MiddlewareOptions {} diff --git a/http/typescript/fetch/src/middleware/options/RedirectHandlerOptions.ts b/http/typescript/fetch/src/middleware/options/RedirectHandlerOptions.ts new file mode 100644 index 0000000000..7488dc8781 --- /dev/null +++ b/http/typescript/fetch/src/middleware/options/RedirectHandlerOptions.ts @@ -0,0 +1,80 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module RedirectHandlerOptions + */ + +import { MiddlewareOptions } from "./IMiddlewareOptions"; + +/** + * @type + * A type declaration for shouldRetry callback + */ +export type ShouldRedirect = (response: Response) => boolean; + +/** + * @class + * @implements MiddlewareOptions + * A class representing RedirectHandlerOptions + */ +export class RedirectHandlerOptions implements MiddlewareOptions { + /** + * @private + * @static + * A member holding default max redirects value + */ + private static DEFAULT_MAX_REDIRECTS = 5; + + /** + * @private + * @static + * A member holding maximum max redirects value + */ + private static MAX_MAX_REDIRECTS = 20; + + /** + * @public + * A member holding max redirects value + */ + public maxRedirects: number; + + /** + * @public + * A member holding shouldRedirect callback + */ + public shouldRedirect: ShouldRedirect; + + /** + * @private + * A member holding default shouldRedirect callback + */ + private static defaultShouldRetry: ShouldRedirect = () => true; + + /** + * @public + * @constructor + * To create an instance of RedirectHandlerOptions + * @param {number} [maxRedirects = RedirectHandlerOptions.DEFAULT_MAX_REDIRECTS] - The max redirects value + * @param {ShouldRedirect} [shouldRedirect = RedirectHandlerOptions.DEFAULT_SHOULD_RETRY] - The should redirect callback + * @returns An instance of RedirectHandlerOptions + */ + public constructor(maxRedirects: number = RedirectHandlerOptions.DEFAULT_MAX_REDIRECTS, shouldRedirect: ShouldRedirect = RedirectHandlerOptions.defaultShouldRetry) { + if (maxRedirects > RedirectHandlerOptions.MAX_MAX_REDIRECTS) { + const error = new Error(`MaxRedirects should not be more than ${RedirectHandlerOptions.MAX_MAX_REDIRECTS}`); + error.name = "MaxLimitExceeded"; + throw error; + } + if (maxRedirects < 0) { + const error = new Error(`MaxRedirects should not be negative`); + error.name = "MinExpectationNotMet"; + throw error; + } + this.maxRedirects = maxRedirects; + this.shouldRedirect = shouldRedirect; + } +} diff --git a/http/typescript/fetch/src/middleware/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middleware/options/RetryHandlerOptions.ts new file mode 100644 index 0000000000..8191d165ce --- /dev/null +++ b/http/typescript/fetch/src/middleware/options/RetryHandlerOptions.ts @@ -0,0 +1,128 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module RetryHandlerOptions + */ + +import { FetchOptions } from "../../IFetchOptions"; +import { MiddlewareOptions } from "./IMiddlewareOptions"; + +/** + * @type + * A type declaration for shouldRetry callback + */ +export type ShouldRetry = (delay: number, attempt: number, request: RequestInfo, options: FetchOptions | undefined, response: Response) => boolean; + +/** + * @class + * @implements MiddlewareOptions + * Class for RetryHandlerOptions + */ + +export class RetryHandlerOptions implements MiddlewareOptions { + /** + * @private + * @static + * A member holding default delay value in seconds + */ + private static DEFAULT_DELAY = 3; + + /** + * @private + * @static + * A member holding default maxRetries value + */ + private static DEFAULT_MAX_RETRIES = 3; + + /** + * @private + * @static + * A member holding maximum delay value in seconds + */ + private static MAX_DELAY = 180; + + /** + * @private + * @static + * A member holding maximum maxRetries value + */ + private static MAX_MAX_RETRIES = 10; + + /** + * @public + * A member holding delay value in seconds + */ + public delay: number; + + /** + * @public + * A member holding maxRetries value + */ + public maxRetries: number; + + /** + * @public + * A member holding shouldRetry callback + */ + public shouldRetry: ShouldRetry; + + /** + * @private + * A member holding default shouldRetry callback + */ + private static defaultShouldRetry: ShouldRetry = () => true; + + /** + * @public + * @constructor + * To create an instance of RetryHandlerOptions + * @param {number} [delay = RetryHandlerOptions.DEFAULT_DELAY] - The delay value in seconds + * @param {number} [maxRetries = RetryHandlerOptions.DEFAULT_MAX_RETRIES] - The maxRetries value + * @param {ShouldRetry} [shouldRetry = RetryHandlerOptions.DEFAULT_SHOULD_RETRY] - The shouldRetry callback function + * @returns An instance of RetryHandlerOptions + */ + public constructor(delay: number = RetryHandlerOptions.DEFAULT_DELAY, maxRetries: number = RetryHandlerOptions.DEFAULT_MAX_RETRIES, shouldRetry: ShouldRetry = RetryHandlerOptions.defaultShouldRetry) { + if (delay > RetryHandlerOptions.MAX_DELAY && maxRetries > RetryHandlerOptions.MAX_MAX_RETRIES) { + const error = new Error(`Delay and MaxRetries should not be more than ${RetryHandlerOptions.MAX_DELAY} and ${RetryHandlerOptions.MAX_MAX_RETRIES}`); + error.name = "MaxLimitExceeded"; + throw error; + } else if (delay > RetryHandlerOptions.MAX_DELAY) { + const error = new Error(`Delay should not be more than ${RetryHandlerOptions.MAX_DELAY}`); + error.name = "MaxLimitExceeded"; + throw error; + } else if (maxRetries > RetryHandlerOptions.MAX_MAX_RETRIES) { + const error = new Error(`MaxRetries should not be more than ${RetryHandlerOptions.MAX_MAX_RETRIES}`); + error.name = "MaxLimitExceeded"; + throw error; + } else if (delay < 0 && maxRetries < 0) { + const error = new Error(`Delay and MaxRetries should not be negative`); + error.name = "MinExpectationNotMet"; + throw error; + } else if (delay < 0) { + const error = new Error(`Delay should not be negative`); + error.name = "MinExpectationNotMet"; + throw error; + } else if (maxRetries < 0) { + const error = new Error(`MaxRetries should not be negative`); + error.name = "MinExpectationNotMet"; + throw error; + } + this.delay = Math.min(delay, RetryHandlerOptions.MAX_DELAY); + this.maxRetries = Math.min(maxRetries, RetryHandlerOptions.MAX_MAX_RETRIES); + this.shouldRetry = shouldRetry; + } + + /** + * @public + * To get the maximum delay + * @returns A maximum delay + */ + public getMaxDelay(): number { + return RetryHandlerOptions.MAX_DELAY; + } +} diff --git a/http/typescript/fetch/src/middleware/options/TelemetryHandlerOptions.ts b/http/typescript/fetch/src/middleware/options/TelemetryHandlerOptions.ts new file mode 100644 index 0000000000..f268218fcb --- /dev/null +++ b/http/typescript/fetch/src/middleware/options/TelemetryHandlerOptions.ts @@ -0,0 +1,86 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module TelemetryHandlerOptions + */ + +import { Context } from "../../IContext"; +import { MiddlewareControl } from "../MiddlewareControl"; +import { MiddlewareOptions } from "./IMiddlewareOptions"; + +/** + * @enum + * @property {number} NONE - The hexadecimal flag value for nothing enabled + * @property {number} REDIRECT_HANDLER_ENABLED - The hexadecimal flag value for redirect handler enabled + * @property {number} RETRY_HANDLER_ENABLED - The hexadecimal flag value for retry handler enabled + * @property {number} AUTHENTICATION_HANDLER_ENABLED - The hexadecimal flag value for the authentication handler enabled + */ + +export enum FeatureUsageFlag { + /* eslint-disable @typescript-eslint/naming-convention */ + NONE = 0x0, + REDIRECT_HANDLER_ENABLED = 0x1, + RETRY_HANDLER_ENABLED = 0x2, + AUTHENTICATION_HANDLER_ENABLED = 0x4, + /* eslint-enable @typescript-eslint/naming-convention */ +} + +/** + * @class + * @implements MiddlewareOptions + * Class for TelemetryHandlerOptions + */ + +export class TelemetryHandlerOptions implements MiddlewareOptions { + /** + * @private + * A member to hold the OR of feature usage flags + */ + private featureUsage: FeatureUsageFlag = FeatureUsageFlag.NONE; + + /** + * @public + * @static + * To update the feature usage in the context object + * @param {Context} context - The request context object containing middleware options + * @param {FeatureUsageFlag} flag - The flag value + * @returns nothing + */ + public static updateFeatureUsageFlag(context: Context, flag: FeatureUsageFlag): void { + let options: TelemetryHandlerOptions; + if (context.middlewareControl instanceof MiddlewareControl) { + options = context.middlewareControl.getMiddlewareOptions(TelemetryHandlerOptions) as TelemetryHandlerOptions; + } else { + context.middlewareControl = new MiddlewareControl(); + } + if (typeof options === "undefined") { + options = new TelemetryHandlerOptions(); + context.middlewareControl.setMiddlewareOptions(TelemetryHandlerOptions, options); + } + options.setFeatureUsage(flag); + } + + /** + * @private + * To set the feature usage flag + * @param {FeatureUsageFlag} flag - The flag value + * @returns nothing + */ + private setFeatureUsage(flag: FeatureUsageFlag): void { + this.featureUsage = this.featureUsage | flag; + } + + /** + * @public + * To get the feature usage + * @returns A feature usage flag as hexadecimal string + */ + public getFeatureUsage(): string { + return this.featureUsage.toString(16); + } +} diff --git a/http/typescript/fetch/src/middlewareContext.ts b/http/typescript/fetch/src/middlewareContext.ts new file mode 100644 index 0000000000..231e5ef957 --- /dev/null +++ b/http/typescript/fetch/src/middlewareContext.ts @@ -0,0 +1,29 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + + import { MiddlewareOption } from "@microsoft/kiota-abstractions"; +import { FetchOptions } from "./IFetchOptions"; + import { MiddlewareControl } from "./middleware/MiddlewareControl"; + + /** + * @interface + * @property {RequestInfo} request - The request url string or the Request instance + * @property {FetchOptions} [options] - The options for the request + * @property {Response} [response] - The response content + * @property {MiddlewareControl} [middlewareControl] - The options for the middleware chain + * @property {Set}[customHosts] - A set of custom host names. Should contain hostnames only. + * + */ + + export interface MiddlewareContext { + request: RequestInfo; + options?: FetchOptions; + response?: Response; + // TODO add request information from middleware options + middlewareOptions?: MiddlewareOptions; / + } + \ No newline at end of file From 1e1a9664f655d9a841daa682e6dc682f72dbf50d Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Thu, 2 Sep 2021 00:31:30 -0700 Subject: [PATCH 02/34] Adding middlewarefactory --- http/typescript/fetch/src/httpClient.ts | 6 +- .../typescript/fetch/src/httpClientFactory.ts | 29 +- http/typescript/fetch/src/index.ts | 2 +- .../src/middleware/AuthenticationHandler.ts | 41 +-- .../{FetchMiddlware.ts => FetchHandler.ts} | 5 +- .../fetch/src/middleware/IMiddleware.ts | 18 -- .../fetch/src/middleware/MiddlewareFactory.ts | 7 +- .../fetch/src/middleware/MiddlewareUtil.ts | 144 ---------- .../fetch/src/middleware/RedirectHandler.ts | 247 ++---------------- .../fetch/src/middleware/RetryHandler.ts | 170 +----------- .../fetch/src/middleware/TelemetryHandler.ts | 103 -------- .../fetch/src/{ => middleware}/middleware.ts | 4 +- .../options/AuthenticationHandlerOptions.ts | 46 ---- .../options/RedirectHandlerOptions.ts | 57 +--- .../middleware/options/RetryHandlerOptions.ts | 100 ------- .../options/TelemetryHandlerOptions.ts | 86 ------ .../typescript/fetch/src/middlewareContext.ts | 5 - http/typescript/fetch/tsconfig.json | 83 +----- 18 files changed, 59 insertions(+), 1094 deletions(-) rename http/typescript/fetch/src/middleware/{FetchMiddlware.ts => FetchHandler.ts} (83%) delete mode 100644 http/typescript/fetch/src/middleware/IMiddleware.ts delete mode 100644 http/typescript/fetch/src/middleware/MiddlewareUtil.ts delete mode 100644 http/typescript/fetch/src/middleware/TelemetryHandler.ts rename http/typescript/fetch/src/{ => middleware}/middleware.ts (79%) delete mode 100644 http/typescript/fetch/src/middleware/options/AuthenticationHandlerOptions.ts delete mode 100644 http/typescript/fetch/src/middleware/options/TelemetryHandlerOptions.ts diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index ac94bdf64c..1409a63f81 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -1,4 +1,4 @@ -import { Middleware } from "./middleware"; +import { Middleware } from "./middleware/middleware"; import { MiddlewareContext } from "./middlewareContext"; /** Default fetch client with options and a middleware pipleline for requests execution. */ @@ -8,7 +8,7 @@ export class HttpClient { * @param middlewares middlewares to be used for requests execution. * @param defaultRequestSettings default request settings to be used for requests execution. */ - public constructor(private readonly middlewares: Middleware[] = HttpClient.getDefaultMiddlewares()) { + public constructor(private readonly middlewares: Middleware[]) { this.middlewares.forEach((middleware, idx) => { if (idx < this.middlewares.length) middleware.next = this.middlewares[idx + 1]; @@ -22,7 +22,7 @@ export class HttpClient { */ public fetch(context: MiddlewareContext): Promise { if (this.middlewares.length > 0 && this.middlewares[0]) - return this.middlewares[0].execute(context: MiddlewareContext); + return this.middlewares[0].execute(context); else throw new Error("No middlewares found"); } diff --git a/http/typescript/fetch/src/httpClientFactory.ts b/http/typescript/fetch/src/httpClientFactory.ts index 608d0f888e..fdd48eed36 100644 --- a/http/typescript/fetch/src/httpClientFactory.ts +++ b/http/typescript/fetch/src/httpClientFactory.ts @@ -2,15 +2,16 @@ * @module HTTPClientFactory */ - import { HTTPClient } from "./HTTPClient"; - import { AuthenticationProvider } from "./IAuthenticationProvider"; + import { HttpClient } from "./httpClient"; + import { AuthenticationProvider } from "@microsoft/kiota-abstractions"; import { AuthenticationHandler } from "./middleware/AuthenticationHandler"; - import { HTTPMessageHandler } from "./middleware/FetchHandler"; - import { Middleware } from "./middleware/IMiddleware"; + import { FetchHandler } from "./middleware/FetchHandler"; + import { Middleware } from "./middleware/middleware"; import { RedirectHandlerOptions } from "./middleware/options/RedirectHandlerOptions"; import { RetryHandlerOptions } from "./middleware/options/RetryHandlerOptions"; import { RedirectHandler } from "./middleware/RedirectHandler"; import { RetryHandler } from "./middleware/RetryHandler"; +import { MiddlewareFactory } from "./middleware/MiddlewareFactory"; /** * @private @@ -38,20 +39,8 @@ * * The best place for AuthenticationHandler is in the starting of the pipeline, because every other handler might have to work for multiple times for a request but the auth token for * them will remain same. For example, Retry and Redirect handlers might be working multiple times for a request based on the response but their auth token would remain same. */ - public static createWithAuthenticationProvider(authProvider: AuthenticationProvider): HTTPClient { - const authenticationHandler = new AuthenticationHandler(authProvider); - const retryHandler = new RetryHandler(new RetryHandlerOptions()); - const FetchHandler = new FetchHandler(); - - authenticationHandler.setNext(retryHandler); - if (isNodeEnvironment()) { - const redirectHandler = new RedirectHandler(new RedirectHandlerOptions()); - retryHandler.setNext(redirectHandler); - redirectHandler.setNext(FetchHandler); - } else { - retryHandler.setNext(FetchHandler); - } - return HTTPClientFactory.createWithMiddleware(authenticationHandler); + public static createWithAuthenticationProvider(authProvider: AuthenticationProvider): HttpClient { + return HTTPClientFactory.createWithMiddleware(MiddlewareFactory.getDefaultMiddlewareChain(authProvider)); } /** @@ -61,9 +50,9 @@ * @property {...Middleware} middleware - The first middleware of the middleware chain or a sequence of all the Middleware handlers * @returns A HTTPClient instance */ - public static createWithMiddleware(...middleware: Middleware[]): HTTPClient { + public static createWithMiddleware(middleware: Middleware[]): HttpClient { // Middleware should not empty or undefined. This is check is present in the HTTPClient constructor. - return new HTTPClient(...middleware); + return new HttpClient(middleware); } } \ No newline at end of file diff --git a/http/typescript/fetch/src/index.ts b/http/typescript/fetch/src/index.ts index 01e1f085f8..f624f13227 100644 --- a/http/typescript/fetch/src/index.ts +++ b/http/typescript/fetch/src/index.ts @@ -1,3 +1,3 @@ export * from './httpCore'; export * from './httpClient'; -export * from './middleware'; \ No newline at end of file +export * from './middleware/middleware'; \ No newline at end of file diff --git a/http/typescript/fetch/src/middleware/AuthenticationHandler.ts b/http/typescript/fetch/src/middleware/AuthenticationHandler.ts index 4f99dbeae0..18051f171f 100644 --- a/http/typescript/fetch/src/middleware/AuthenticationHandler.ts +++ b/http/typescript/fetch/src/middleware/AuthenticationHandler.ts @@ -9,15 +9,9 @@ * @module AuthenticationHandler */ -import { isCustomHost, isGraphURL } from "../GraphRequestUtil"; import { AuthenticationProvider } from "@microsoft/kiota-abstractions"; -import { AuthenticationProviderOptions } from "../IAuthenticationProviderOptions"; -import { Context } from "../IContext"; +import { MiddlewareContext } from "../middlewareContext"; import { Middleware } from "./IMiddleware"; -import { MiddlewareControl } from "./MiddlewareControl"; -import { appendRequestHeader } from "./MiddlewareUtil"; -import { AuthenticationHandlerOptions } from "./options/AuthenticationHandlerOptions"; -import { FeatureUsageFlag, TelemetryHandlerOptions } from "./options/TelemetryHandlerOptions"; /** * @class @@ -25,11 +19,6 @@ import { FeatureUsageFlag, TelemetryHandlerOptions } from "./options/TelemetryHa * Class representing AuthenticationHandler */ export class AuthenticationHandler implements Middleware { - /** - * @private - * A member representing the authorization header name - */ - private static AUTHORIZATION_HEADER = "Authorization"; /** * @private @@ -60,33 +49,7 @@ export class AuthenticationHandler implements Middleware { * @param {Context} context - The context object of the request * @returns A Promise that resolves to nothing */ - public async execute(context: Context): Promise { - - // TODO: move authenticate request logic from HttpCore - const url = typeof context.request === "string" ? context.request : context.request.url; - if (isGraphURL(url) || (context.customHosts && isCustomHost(url, context.customHosts))) { - let options: AuthenticationHandlerOptions; - if (context.middlewareControl instanceof MiddlewareControl) { - options = context.middlewareControl.getMiddlewareOptions(AuthenticationHandlerOptions) as AuthenticationHandlerOptions; - } - let authenticationProvider: AuthenticationProvider; - let authenticationProviderOptions: AuthenticationProviderOptions; - if (options) { - authenticationProvider = options.authenticationProvider; - authenticationProviderOptions = options.authenticationProviderOptions; - } - if (!authenticationProvider) { - authenticationProvider = this.authenticationProvider; - } - const token: string = await authenticationProvider.getAccessToken(authenticationProviderOptions); - const bearerKey = `Bearer ${token}`; - appendRequestHeader(context.request, context.options, AuthenticationHandler.AUTHORIZATION_HEADER, bearerKey); - TelemetryHandlerOptions.updateFeatureUsageFlag(context, FeatureUsageFlag.AUTHENTICATION_HANDLER_ENABLED); - } else { - if (context.options.headers) { - delete context.options.headers[AuthenticationHandler.AUTHORIZATION_HEADER]; - } - } + public async execute(context: MiddlewareContext): Promise { return await this.nextMiddleware.execute(context); } diff --git a/http/typescript/fetch/src/middleware/FetchMiddlware.ts b/http/typescript/fetch/src/middleware/FetchHandler.ts similarity index 83% rename from http/typescript/fetch/src/middleware/FetchMiddlware.ts rename to http/typescript/fetch/src/middleware/FetchHandler.ts index de1c4b5977..9c1b094cd1 100644 --- a/http/typescript/fetch/src/middleware/FetchMiddlware.ts +++ b/http/typescript/fetch/src/middleware/FetchHandler.ts @@ -6,7 +6,7 @@ */ /** - * @module HTTPMessageHandler + * @module FetchHandler */ import { MiddlewareContext } from "../middlewareContext"; @@ -17,7 +17,7 @@ import { Middleware } from "./IMiddleware"; * @implements Middleware * Class for HTTPMessageHandler */ -export class HTTPMessageHandler implements Middleware { +export class FetchHandler implements Middleware { /** * @public * @async @@ -26,6 +26,5 @@ export class HTTPMessageHandler implements Middleware { * @returns A promise that resolves to nothing */ public async execute(context: MiddlewareContext): Promise { - context.response = await fetch(context.request, context.options); } } diff --git a/http/typescript/fetch/src/middleware/IMiddleware.ts b/http/typescript/fetch/src/middleware/IMiddleware.ts deleted file mode 100644 index 70dacc7034..0000000000 --- a/http/typescript/fetch/src/middleware/IMiddleware.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -import { Context } from "../IContext"; - -/** - * @interface - * @property {Function} execute - The method to execute the middleware - * @property {Function} [setNext] - A method to set the next middleware in the chain - */ -export interface Middleware { - execute: (context: Context) => Promise; - setNext?: (middleware: Middleware) => void; -} diff --git a/http/typescript/fetch/src/middleware/MiddlewareFactory.ts b/http/typescript/fetch/src/middleware/MiddlewareFactory.ts index f35cd82e96..5c1e3d74ff 100644 --- a/http/typescript/fetch/src/middleware/MiddlewareFactory.ts +++ b/http/typescript/fetch/src/middleware/MiddlewareFactory.ts @@ -11,7 +11,7 @@ import { AuthenticationProvider } from "../IAuthenticationProvider"; import { AuthenticationHandler } from "./AuthenticationHandler"; -import { HTTPMessageHandler } from "./FetchMiddlware"; +import { FetchHandler, HTTPMessageHandler } from "./FetchHandler"; import { Middleware } from "./IMiddleware"; import { RedirectHandlerOptions } from "./options/RedirectHandlerOptions"; import { RetryHandlerOptions } from "./options/RetryHandlerOptions"; @@ -44,8 +44,6 @@ export class MiddlewareFactory { const middleware: Middleware[] = []; const authenticationHandler = new AuthenticationHandler(authProvider); const retryHandler = new RetryHandler(new RetryHandlerOptions()); - const telemetryHandler = new TelemetryHandler(); - const httpMessageHandler = new HTTPMessageHandler(); middleware.push(authenticationHandler); middleware.push(retryHandler); @@ -53,8 +51,7 @@ export class MiddlewareFactory { const redirectHandler = new RedirectHandler(new RedirectHandlerOptions()); middleware.push(redirectHandler); } - middleware.push(telemetryHandler); - middleware.push(httpMessageHandler); + middleware.push(new FetchHandler()); return middleware; } diff --git a/http/typescript/fetch/src/middleware/MiddlewareUtil.ts b/http/typescript/fetch/src/middleware/MiddlewareUtil.ts deleted file mode 100644 index b346037ca8..0000000000 --- a/http/typescript/fetch/src/middleware/MiddlewareUtil.ts +++ /dev/null @@ -1,144 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @module MiddlewareUtil - */ - -import { FetchOptions } from "../IFetchOptions"; - -/** - * @constant - * To generate the UUID - * @returns The UUID string - */ -export const generateUUID = (): string => { - let uuid = ""; - for (let j = 0; j < 32; j++) { - if (j === 8 || j === 12 || j === 16 || j === 20) { - uuid += "-"; - } - uuid += Math.floor(Math.random() * 16).toString(16); - } - return uuid; -}; - -/** - * @constant - * To get the request header from the request - * @param {RequestInfo} request - The request object or the url string - * @param {FetchOptions|undefined} options - The request options object - * @param {string} key - The header key string - * @returns A header value for the given key from the request - */ -export const getRequestHeader = (request: RequestInfo, options: FetchOptions | undefined, key: string): string | null => { - let value: string = null; - if (typeof Request !== "undefined" && request instanceof Request) { - value = (request as Request).headers.get(key); - } else if (typeof options !== "undefined" && options.headers !== undefined) { - if (typeof Headers !== "undefined" && options.headers instanceof Headers) { - value = (options.headers as Headers).get(key); - } else if (options.headers instanceof Array) { - const headers = options.headers as string[][]; - for (let i = 0, l = headers.length; i < l; i++) { - if (headers[i][0] === key) { - value = headers[i][1]; - break; - } - } - } else if (options.headers[key] !== undefined) { - value = options.headers[key]; - } - } - return value; -}; - -/** - * @constant - * To set the header value to the given request - * @param {RequestInfo} request - The request object or the url string - * @param {FetchOptions|undefined} options - The request options object - * @param {string} key - The header key string - * @param {string } value - The header value string - * @returns Nothing - */ -export const setRequestHeader = (request: RequestInfo, options: FetchOptions | undefined, key: string, value: string): void => { - if (typeof Request !== "undefined" && request instanceof Request) { - (request as Request).headers.set(key, value); - } else if (typeof options !== "undefined") { - if (options.headers === undefined) { - options.headers = new Headers({ - [key]: value, - }); - } else { - if (typeof Headers !== "undefined" && options.headers instanceof Headers) { - (options.headers as Headers).set(key, value); - } else if (options.headers instanceof Array) { - let i = 0; - const l = options.headers.length; - for (; i < l; i++) { - const header = options.headers[i]; - if (header[0] === key) { - header[1] = value; - break; - } - } - if (i === l) { - (options.headers as string[][]).push([key, value]); - } - } else { - Object.assign(options.headers, { [key]: value }); - } - } - } -}; - -/** - * @constant - * To append the header value to the given request - * @param {RequestInfo} request - The request object or the url string - * @param {FetchOptions|undefined} options - The request options object - * @param {string} key - The header key string - * @param {string } value - The header value string - * @returns Nothing - */ -export const appendRequestHeader = (request: RequestInfo, options: FetchOptions | undefined, key: string, value: string): void => { - if (typeof Request !== "undefined" && request instanceof Request) { - (request as Request).headers.append(key, value); - } else if (typeof options !== "undefined") { - if (options.headers === undefined) { - options.headers = new Headers({ - [key]: value, - }); - } else { - if (typeof Headers !== "undefined" && options.headers instanceof Headers) { - (options.headers as Headers).append(key, value); - } else if (options.headers instanceof Array) { - (options.headers as string[][]).push([key, value]); - } else if (options.headers === undefined) { - options.headers = { [key]: value }; - } else if (options.headers[key] === undefined) { - options.headers[key] = value; - } else { - options.headers[key] += `, ${value}`; - } - } - } -}; - -/** - * @constant - * To clone the request with the new url - * @param {string} url - The new url string - * @param {Request} request - The request object - * @returns A promise that resolves to request object - */ -export const cloneRequestWithNewUrl = async (newUrl: string, request: Request): Promise => { - const body = request.headers.get("Content-Type") ? await request.blob() : await Promise.resolve(undefined); - const { method, headers, referrer, referrerPolicy, mode, credentials, cache, redirect, integrity, keepalive, signal } = request; - return new Request(newUrl, { method, headers, body, referrer, referrerPolicy, mode, credentials, cache, redirect, integrity, keepalive, signal }); -}; diff --git a/http/typescript/fetch/src/middleware/RedirectHandler.ts b/http/typescript/fetch/src/middleware/RedirectHandler.ts index 911e408f27..168c4caed2 100644 --- a/http/typescript/fetch/src/middleware/RedirectHandler.ts +++ b/http/typescript/fetch/src/middleware/RedirectHandler.ts @@ -9,229 +9,24 @@ * @module RedirectHandler */ -import { Context } from "../IContext"; -import { RequestMethod } from "../RequestMethod"; -import { Middleware } from "./IMiddleware"; -import { MiddlewareControl } from "./MiddlewareControl"; -import { cloneRequestWithNewUrl } from "./MiddlewareUtil"; -import { RedirectHandlerOptions } from "./options/RedirectHandlerOptions"; -import { FeatureUsageFlag, TelemetryHandlerOptions } from "./options/TelemetryHandlerOptions"; - -/** - * @class - * Class - * @implements Middleware - * Class representing RedirectHandler - */ -export class RedirectHandler implements Middleware { - /** - * @private - * @static - * A member holding the array of redirect status codes - */ - private static REDIRECT_STATUS_CODES: number[] = [ - 301, // Moved Permanently - 302, // Found - 303, // See Other - 307, // Temporary Permanently - 308, // Moved Permanently - ]; - - /** - * @private - * @static - * A member holding SeeOther status code - */ - private static STATUS_CODE_SEE_OTHER = 303; - - /** - * @private - * @static - * A member holding the name of the location header - */ - private static LOCATION_HEADER = "Location"; - - /** - * @private - * @static - * A member representing the authorization header name - */ - private static AUTHORIZATION_HEADER = "Authorization"; - - /** - * @private - * @static - * A member holding the manual redirect value - */ - private static MANUAL_REDIRECT: RequestRedirect = "manual"; - - /** - * @private - * A member holding options to customize the handler behavior - */ - private options: RedirectHandlerOptions; - - /** - * @private - * A member to hold next middleware in the middleware chain - */ - private nextMiddleware: Middleware; - - /** - * @public - * @constructor - * To create an instance of RedirectHandler - * @param {RedirectHandlerOptions} [options = new RedirectHandlerOptions()] - The redirect handler options instance - * @returns An instance of RedirectHandler - */ - - public constructor(options: RedirectHandlerOptions = new RedirectHandlerOptions()) { - this.options = options; - } - - /** - * @private - * To check whether the response has the redirect status code or not - * @param {Response} response - The response object - * @returns A boolean representing whether the response contains the redirect status code or not - */ - private isRedirect(response: Response): boolean { - return RedirectHandler.REDIRECT_STATUS_CODES.indexOf(response.status) !== -1; - } - - /** - * @private - * To check whether the response has location header or not - * @param {Response} response - The response object - * @returns A boolean representing the whether the response has location header or not - */ - private hasLocationHeader(response: Response): boolean { - return response.headers.has(RedirectHandler.LOCATION_HEADER); - } - - /** - * @private - * To get the redirect url from location header in response object - * @param {Response} response - The response object - * @returns A redirect url from location header - */ - private getLocationHeader(response: Response): string { - return response.headers.get(RedirectHandler.LOCATION_HEADER); - } - - /** - * @private - * To check whether the given url is a relative url or not - * @param {string} url - The url string value - * @returns A boolean representing whether the given url is a relative url or not - */ - private isRelativeURL(url: string): boolean { - return url.indexOf("://") === -1; - } - - /** - * @private - * To check whether the authorization header in the request should be dropped for consequent redirected requests - * @param {string} requestUrl - The request url value - * @param {string} redirectUrl - The redirect url value - * @returns A boolean representing whether the authorization header in the request should be dropped for consequent redirected requests - */ - private shouldDropAuthorizationHeader(requestUrl: string, redirectUrl: string): boolean { - const schemeHostRegex = /^[A-Za-z].+?:\/\/.+?(?=\/|$)/; - const requestMatches: string[] = schemeHostRegex.exec(requestUrl); - let requestAuthority: string; - let redirectAuthority: string; - if (requestMatches !== null) { - requestAuthority = requestMatches[0]; - } - const redirectMatches: string[] = schemeHostRegex.exec(redirectUrl); - if (redirectMatches !== null) { - redirectAuthority = redirectMatches[0]; - } - return typeof requestAuthority !== "undefined" && typeof redirectAuthority !== "undefined" && requestAuthority !== redirectAuthority; - } - - /** - * @private - * @async - * To update a request url with the redirect url - * @param {string} redirectUrl - The redirect url value - * @param {Context} context - The context object value - * @returns Nothing - */ - private async updateRequestUrl(redirectUrl: string, context: Context): Promise { - context.request = typeof context.request === "string" ? redirectUrl : await cloneRequestWithNewUrl(redirectUrl, context.request as Request); - } - - /** - * @private - * To get the options for execution of the middleware - * @param {Context} context - The context object - * @returns A options for middleware execution - */ - private getOptions(context: Context): RedirectHandlerOptions { - let options: RedirectHandlerOptions; - if (context.middlewareControl instanceof MiddlewareControl) { - options = context.middlewareControl.getMiddlewareOptions(RedirectHandlerOptions) as RedirectHandlerOptions; - } - if (typeof options === "undefined") { - options = Object.assign(new RedirectHandlerOptions(), this.options); - } - return options; - } - - /** - * @private - * @async - * To execute the next middleware and to handle in case of redirect response returned by the server - * @param {Context} context - The context object - * @param {number} redirectCount - The redirect count value - * @param {RedirectHandlerOptions} options - The redirect handler options instance - * @returns A promise that resolves to nothing - */ - private async executeWithRedirect(context: Context, redirectCount: number, options: RedirectHandlerOptions): Promise { - await this.nextMiddleware.execute(context); - const response = context.response; - if (redirectCount < options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && options.shouldRedirect(response)) { - ++redirectCount; - if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { - context.options.method = RequestMethod.GET; - delete context.options.body; - } else { - const redirectUrl: string = this.getLocationHeader(response); - if (!this.isRelativeURL(redirectUrl) && this.shouldDropAuthorizationHeader(response.url, redirectUrl)) { - delete context.options.headers[RedirectHandler.AUTHORIZATION_HEADER]; - } - await this.updateRequestUrl(redirectUrl, context); - } - await this.executeWithRedirect(context, redirectCount, options); - } else { - return; - } - } - - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The context object of the request - * @returns A Promise that resolves to nothing - */ - public async execute(context: Context): Promise { - const redirectCount = 0; - const options = this.getOptions(context); - context.options.redirect = RedirectHandler.MANUAL_REDIRECT; - TelemetryHandlerOptions.updateFeatureUsageFlag(context, FeatureUsageFlag.REDIRECT_HANDLER_ENABLED); - return await this.executeWithRedirect(context, redirectCount, options); - } - - /** - * @public - * To set the next middleware in the chain - * @param {Middleware} next - The middleware instance - * @returns Nothing - */ - public setNext(next: Middleware): void { - this.nextMiddleware = next; - } -} + import { MiddlewareContext } from "../middlewareContext"; + import { Middleware } from "./IMiddleware"; + + /** + * @class + * @implements Middleware + * Class for RetryHandler + */ + export class RedirectHandler implements Middleware { + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The context object of the request + * @returns A Promise that resolves to nothing + */ + public async execute(context: MiddlewareContext): Promise { + } + } + \ No newline at end of file diff --git a/http/typescript/fetch/src/middleware/RetryHandler.ts b/http/typescript/fetch/src/middleware/RetryHandler.ts index 36836fecb2..efa3d148d4 100644 --- a/http/typescript/fetch/src/middleware/RetryHandler.ts +++ b/http/typescript/fetch/src/middleware/RetryHandler.ts @@ -9,14 +9,8 @@ * @module RetryHandler */ -import { Context } from "../IContext"; -import { FetchOptions } from "../IFetchOptions"; -import { RequestMethod } from "../RequestMethod"; +import { MiddlewareContext } from "../middlewareContext"; import { Middleware } from "./IMiddleware"; -import { MiddlewareControl } from "./MiddlewareControl"; -import { getRequestHeader, setRequestHeader } from "./MiddlewareUtil"; -import { RetryHandlerOptions } from "./options/RetryHandlerOptions"; -import { FeatureUsageFlag, TelemetryHandlerOptions } from "./options/TelemetryHandlerOptions"; /** * @class @@ -24,164 +18,8 @@ import { FeatureUsageFlag, TelemetryHandlerOptions } from "./options/TelemetryHa * Class for RetryHandler */ export class RetryHandler implements Middleware { - /** - * @private - * @static - * A list of status codes that needs to be retried - */ - private static RETRY_STATUS_CODES: number[] = [ - 429, // Too many requests - 503, // Service unavailable - 504, // Gateway timeout - ]; - - /** - * @private - * @static - * A member holding the name of retry attempt header - */ - private static RETRY_ATTEMPT_HEADER = "Retry-Attempt"; - - /** - * @private - * @static - * A member holding the name of retry after header - */ - private static RETRY_AFTER_HEADER = "Retry-After"; - - /** - * @private - * A member to hold next middleware in the middleware chain - */ private nextMiddleware: Middleware; - /** - * @private - * A member holding the retry handler options - */ - private options: RetryHandlerOptions; - - /** - * @public - * @constructor - * To create an instance of RetryHandler - * @param {RetryHandlerOptions} [options = new RetryHandlerOptions()] - The retry handler options value - * @returns An instance of RetryHandler - */ - public constructor(options: RetryHandlerOptions = new RetryHandlerOptions()) { - this.options = options; - } - - /** - * - * @private - * To check whether the response has the retry status code - * @param {Response} response - The response object - * @returns Whether the response has retry status code or not - */ - private isRetry(response: Response): boolean { - return RetryHandler.RETRY_STATUS_CODES.indexOf(response.status) !== -1; - } - - /** - * @private - * To check whether the payload is buffered or not - * @param {RequestInfo} request - The url string or the request object value - * @param {FetchOptions} options - The options of a request - * @returns Whether the payload is buffered or not - */ - private isBuffered(request: RequestInfo, options: FetchOptions | undefined): boolean { - const method = typeof request === "string" ? options.method : (request as Request).method; - const isPutPatchOrPost: boolean = method === RequestMethod.PUT || method === RequestMethod.PATCH || method === RequestMethod.POST; - if (isPutPatchOrPost) { - const isStream = getRequestHeader(request, options, "Content-Type") === "application/octet-stream"; - if (isStream) { - return false; - } - } - return true; - } - - /** - * @private - * To get the delay for a retry - * @param {Response} response - The response object - * @param {number} retryAttempts - The current attempt count - * @param {number} delay - The delay value in seconds - * @returns A delay for a retry - */ - private getDelay(response: Response, retryAttempts: number, delay: number): number { - const getRandomness = () => Number(Math.random().toFixed(3)); - const retryAfter = response.headers !== undefined ? response.headers.get(RetryHandler.RETRY_AFTER_HEADER) : null; - let newDelay: number; - if (retryAfter !== null) { - if (Number.isNaN(Number(retryAfter))) { - newDelay = Math.round((new Date(retryAfter).getTime() - Date.now()) / 1000); - } else { - newDelay = Number(retryAfter); - } - } else { - // Adding randomness to avoid retrying at a same - newDelay = retryAttempts >= 2 ? this.getExponentialBackOffTime(retryAttempts) + delay + getRandomness() : delay + getRandomness(); - } - return Math.min(newDelay, this.options.getMaxDelay() + getRandomness()); - } - - /** - * @private - * To get an exponential back off value - * @param {number} attempts - The current attempt count - * @returns An exponential back off value - */ - private getExponentialBackOffTime(attempts: number): number { - return Math.round((1 / 2) * (2 ** attempts - 1)); - } - - /** - * @private - * @async - * To add delay for the execution - * @param {number} delaySeconds - The delay value in seconds - * @returns Nothing - */ - private async sleep(delaySeconds: number): Promise { - const delayMilliseconds = delaySeconds * 1000; - return new Promise((resolve) => setTimeout(resolve, delayMilliseconds)); - } - - private getOptions(context: Context): RetryHandlerOptions { - let options: RetryHandlerOptions; - if (context.middlewareControl instanceof MiddlewareControl) { - options = context.middlewareControl.getMiddlewareOptions(this.options.constructor) as RetryHandlerOptions; - } - if (typeof options === "undefined") { - options = Object.assign(new RetryHandlerOptions(), this.options); - } - return options; - } - - /** - * @private - * @async - * To execute the middleware with retries - * @param {Context} context - The context object - * @param {number} retryAttempts - The current attempt count - * @param {RetryHandlerOptions} options - The retry middleware options instance - * @returns A Promise that resolves to nothing - */ - private async executeWithRetry(context: Context, retryAttempts: number, options: RetryHandlerOptions): Promise { - await this.nextMiddleware.execute(context); - if (retryAttempts < options.maxRetries && this.isRetry(context.response) && this.isBuffered(context.request, context.options) && options.shouldRetry(options.delay, retryAttempts, context.request, context.options, context.response)) { - ++retryAttempts; - setRequestHeader(context.request, context.options, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); - const delay = this.getDelay(context.response, retryAttempts, options.delay); - await this.sleep(delay); - return await this.executeWithRetry(context, retryAttempts, options); - } else { - return; - } - } - /** * @public * @async @@ -189,11 +27,7 @@ export class RetryHandler implements Middleware { * @param {Context} context - The context object of the request * @returns A Promise that resolves to nothing */ - public async execute(context: Context): Promise { - const retryAttempts = 0; - const options: RetryHandlerOptions = this.getOptions(context); - TelemetryHandlerOptions.updateFeatureUsageFlag(context, FeatureUsageFlag.RETRY_HANDLER_ENABLED); - return await this.executeWithRetry(context, retryAttempts, options); + public async execute(context: MiddlewareContext): Promise { } /** diff --git a/http/typescript/fetch/src/middleware/TelemetryHandler.ts b/http/typescript/fetch/src/middleware/TelemetryHandler.ts deleted file mode 100644 index 77278437cc..0000000000 --- a/http/typescript/fetch/src/middleware/TelemetryHandler.ts +++ /dev/null @@ -1,103 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @module TelemetryHandler - */ -import { isCustomHost, isGraphURL } from "../GraphRequestUtil"; -import { Context } from "../IContext"; -import { PACKAGE_VERSION } from "../Version"; -import { Middleware } from "./IMiddleware"; -import { MiddlewareControl } from "./MiddlewareControl"; -import { appendRequestHeader, generateUUID, getRequestHeader, setRequestHeader } from "./MiddlewareUtil"; -import { TelemetryHandlerOptions } from "./options/TelemetryHandlerOptions"; - -/** - * @class - * @implements Middleware - * Class for TelemetryHandler - */ -export class TelemetryHandler implements Middleware { - /** - * @private - * @static - * A member holding the name of the client request id header - */ - private static CLIENT_REQUEST_ID_HEADER = "client-request-id"; - - /** - * @private - * @static - * A member holding the name of the sdk version header - */ - private static SDK_VERSION_HEADER = "SdkVersion"; - - /** - * @private - * @static - * A member holding the language prefix for the sdk version header value - */ - private static PRODUCT_NAME = "graph-js"; - - /** - * @private - * @static - * A member holding the key for the feature usage metrics - */ - private static FEATURE_USAGE_STRING = "featureUsage"; - - /** - * @private - * A member to hold next middleware in the middleware chain - */ - private nextMiddleware: Middleware; - - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The context object of the request - * @returns A Promise that resolves to nothing - */ - public async execute(context: Context): Promise { - const url = typeof context.request === "string" ? context.request : context.request.url; - if (isGraphURL(url) || (context.customHosts && isCustomHost(url, context.customHosts))) { - // Add telemetry only if the request url is a Graph URL. - // Errors are reported as in issue #265 if headers are present when redirecting to a non Graph URL - let clientRequestId: string = getRequestHeader(context.request, context.options, TelemetryHandler.CLIENT_REQUEST_ID_HEADER); - if (!clientRequestId) { - clientRequestId = generateUUID(); - setRequestHeader(context.request, context.options, TelemetryHandler.CLIENT_REQUEST_ID_HEADER, clientRequestId); - } - let sdkVersionValue = `${TelemetryHandler.PRODUCT_NAME}/${PACKAGE_VERSION}`; - let options: TelemetryHandlerOptions; - if (context.middlewareControl instanceof MiddlewareControl) { - options = context.middlewareControl.getMiddlewareOptions(TelemetryHandlerOptions) as TelemetryHandlerOptions; - } - if (options) { - const featureUsage: string = options.getFeatureUsage(); - sdkVersionValue += ` (${TelemetryHandler.FEATURE_USAGE_STRING}=${featureUsage})`; - } - appendRequestHeader(context.request, context.options, TelemetryHandler.SDK_VERSION_HEADER, sdkVersionValue); - } else { - // Remove telemetry headers if present during redirection. - delete context.options.headers[TelemetryHandler.CLIENT_REQUEST_ID_HEADER]; - delete context.options.headers[TelemetryHandler.SDK_VERSION_HEADER]; - } - return await this.nextMiddleware.execute(context); - } - - /** - * @public - * To set the next middleware in the chain - * @param {Middleware} next - The middleware instance - * @returns Nothing - */ - public setNext(next: Middleware): void { - this.nextMiddleware = next; - } -} diff --git a/http/typescript/fetch/src/middleware.ts b/http/typescript/fetch/src/middleware/middleware.ts similarity index 79% rename from http/typescript/fetch/src/middleware.ts rename to http/typescript/fetch/src/middleware/middleware.ts index 8a002fc190..0f4cac8007 100644 --- a/http/typescript/fetch/src/middleware.ts +++ b/http/typescript/fetch/src/middleware/middleware.ts @@ -1,5 +1,4 @@ -import { Context } from "vm"; -import { MiddlewareContext } from "./middlewareContext"; +import { MiddlewareContext } from "../middlewareContext"; /** Defines the contract for a middleware in the request execution pipeline. */ export interface Middleware { @@ -12,5 +11,4 @@ export interface Middleware { * @return A promise that resolves to the response object. */ execute(context: MiddlewareContext): Promise; - setNext?: (middleware: Middleware) => void; } \ No newline at end of file diff --git a/http/typescript/fetch/src/middleware/options/AuthenticationHandlerOptions.ts b/http/typescript/fetch/src/middleware/options/AuthenticationHandlerOptions.ts deleted file mode 100644 index 547b326bae..0000000000 --- a/http/typescript/fetch/src/middleware/options/AuthenticationHandlerOptions.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @module AuthenticationHandlerOptions - */ - -import { AuthenticationProvider } from "../../IAuthenticationProvider"; -import { AuthenticationProviderOptions } from "../../IAuthenticationProviderOptions"; -import { MiddlewareOptions } from "./IMiddlewareOptions"; - -/** - * @class - * @implements MiddlewareOptions - * Class representing AuthenticationHandlerOptions - */ -export class AuthenticationHandlerOptions implements MiddlewareOptions { - /** - * @public - * A member holding an instance of an authentication provider - */ - public authenticationProvider: AuthenticationProvider; - - /** - * @public - * A member holding an instance of authentication provider options - */ - public authenticationProviderOptions: AuthenticationProviderOptions; - - /** - * @public - * @constructor - * To create an instance of AuthenticationHandlerOptions - * @param {AuthenticationProvider} [authenticationProvider] - The authentication provider instance - * @param {AuthenticationProviderOptions} [authenticationProviderOptions] - The authentication provider options instance - * @returns An instance of AuthenticationHandlerOptions - */ - public constructor(authenticationProvider?: AuthenticationProvider, authenticationProviderOptions?: AuthenticationProviderOptions) { - this.authenticationProvider = authenticationProvider; - this.authenticationProviderOptions = authenticationProviderOptions; - } -} diff --git a/http/typescript/fetch/src/middleware/options/RedirectHandlerOptions.ts b/http/typescript/fetch/src/middleware/options/RedirectHandlerOptions.ts index 7488dc8781..2f5e3e104d 100644 --- a/http/typescript/fetch/src/middleware/options/RedirectHandlerOptions.ts +++ b/http/typescript/fetch/src/middleware/options/RedirectHandlerOptions.ts @@ -22,59 +22,6 @@ export type ShouldRedirect = (response: Response) => boolean; * @implements MiddlewareOptions * A class representing RedirectHandlerOptions */ -export class RedirectHandlerOptions implements MiddlewareOptions { - /** - * @private - * @static - * A member holding default max redirects value - */ - private static DEFAULT_MAX_REDIRECTS = 5; - - /** - * @private - * @static - * A member holding maximum max redirects value - */ - private static MAX_MAX_REDIRECTS = 20; - - /** - * @public - * A member holding max redirects value - */ - public maxRedirects: number; - - /** - * @public - * A member holding shouldRedirect callback - */ - public shouldRedirect: ShouldRedirect; - - /** - * @private - * A member holding default shouldRedirect callback - */ - private static defaultShouldRetry: ShouldRedirect = () => true; - - /** - * @public - * @constructor - * To create an instance of RedirectHandlerOptions - * @param {number} [maxRedirects = RedirectHandlerOptions.DEFAULT_MAX_REDIRECTS] - The max redirects value - * @param {ShouldRedirect} [shouldRedirect = RedirectHandlerOptions.DEFAULT_SHOULD_RETRY] - The should redirect callback - * @returns An instance of RedirectHandlerOptions - */ - public constructor(maxRedirects: number = RedirectHandlerOptions.DEFAULT_MAX_REDIRECTS, shouldRedirect: ShouldRedirect = RedirectHandlerOptions.defaultShouldRetry) { - if (maxRedirects > RedirectHandlerOptions.MAX_MAX_REDIRECTS) { - const error = new Error(`MaxRedirects should not be more than ${RedirectHandlerOptions.MAX_MAX_REDIRECTS}`); - error.name = "MaxLimitExceeded"; - throw error; - } - if (maxRedirects < 0) { - const error = new Error(`MaxRedirects should not be negative`); - error.name = "MinExpectationNotMet"; - throw error; - } - this.maxRedirects = maxRedirects; - this.shouldRedirect = shouldRedirect; - } +export class RedirectHandlerOptions implements MiddlewareOptions { } + diff --git a/http/typescript/fetch/src/middleware/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middleware/options/RetryHandlerOptions.ts index 8191d165ce..5f09c14b15 100644 --- a/http/typescript/fetch/src/middleware/options/RetryHandlerOptions.ts +++ b/http/typescript/fetch/src/middleware/options/RetryHandlerOptions.ts @@ -25,104 +25,4 @@ export type ShouldRetry = (delay: number, attempt: number, request: RequestInfo, */ export class RetryHandlerOptions implements MiddlewareOptions { - /** - * @private - * @static - * A member holding default delay value in seconds - */ - private static DEFAULT_DELAY = 3; - - /** - * @private - * @static - * A member holding default maxRetries value - */ - private static DEFAULT_MAX_RETRIES = 3; - - /** - * @private - * @static - * A member holding maximum delay value in seconds - */ - private static MAX_DELAY = 180; - - /** - * @private - * @static - * A member holding maximum maxRetries value - */ - private static MAX_MAX_RETRIES = 10; - - /** - * @public - * A member holding delay value in seconds - */ - public delay: number; - - /** - * @public - * A member holding maxRetries value - */ - public maxRetries: number; - - /** - * @public - * A member holding shouldRetry callback - */ - public shouldRetry: ShouldRetry; - - /** - * @private - * A member holding default shouldRetry callback - */ - private static defaultShouldRetry: ShouldRetry = () => true; - - /** - * @public - * @constructor - * To create an instance of RetryHandlerOptions - * @param {number} [delay = RetryHandlerOptions.DEFAULT_DELAY] - The delay value in seconds - * @param {number} [maxRetries = RetryHandlerOptions.DEFAULT_MAX_RETRIES] - The maxRetries value - * @param {ShouldRetry} [shouldRetry = RetryHandlerOptions.DEFAULT_SHOULD_RETRY] - The shouldRetry callback function - * @returns An instance of RetryHandlerOptions - */ - public constructor(delay: number = RetryHandlerOptions.DEFAULT_DELAY, maxRetries: number = RetryHandlerOptions.DEFAULT_MAX_RETRIES, shouldRetry: ShouldRetry = RetryHandlerOptions.defaultShouldRetry) { - if (delay > RetryHandlerOptions.MAX_DELAY && maxRetries > RetryHandlerOptions.MAX_MAX_RETRIES) { - const error = new Error(`Delay and MaxRetries should not be more than ${RetryHandlerOptions.MAX_DELAY} and ${RetryHandlerOptions.MAX_MAX_RETRIES}`); - error.name = "MaxLimitExceeded"; - throw error; - } else if (delay > RetryHandlerOptions.MAX_DELAY) { - const error = new Error(`Delay should not be more than ${RetryHandlerOptions.MAX_DELAY}`); - error.name = "MaxLimitExceeded"; - throw error; - } else if (maxRetries > RetryHandlerOptions.MAX_MAX_RETRIES) { - const error = new Error(`MaxRetries should not be more than ${RetryHandlerOptions.MAX_MAX_RETRIES}`); - error.name = "MaxLimitExceeded"; - throw error; - } else if (delay < 0 && maxRetries < 0) { - const error = new Error(`Delay and MaxRetries should not be negative`); - error.name = "MinExpectationNotMet"; - throw error; - } else if (delay < 0) { - const error = new Error(`Delay should not be negative`); - error.name = "MinExpectationNotMet"; - throw error; - } else if (maxRetries < 0) { - const error = new Error(`MaxRetries should not be negative`); - error.name = "MinExpectationNotMet"; - throw error; - } - this.delay = Math.min(delay, RetryHandlerOptions.MAX_DELAY); - this.maxRetries = Math.min(maxRetries, RetryHandlerOptions.MAX_MAX_RETRIES); - this.shouldRetry = shouldRetry; - } - - /** - * @public - * To get the maximum delay - * @returns A maximum delay - */ - public getMaxDelay(): number { - return RetryHandlerOptions.MAX_DELAY; - } } diff --git a/http/typescript/fetch/src/middleware/options/TelemetryHandlerOptions.ts b/http/typescript/fetch/src/middleware/options/TelemetryHandlerOptions.ts deleted file mode 100644 index f268218fcb..0000000000 --- a/http/typescript/fetch/src/middleware/options/TelemetryHandlerOptions.ts +++ /dev/null @@ -1,86 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @module TelemetryHandlerOptions - */ - -import { Context } from "../../IContext"; -import { MiddlewareControl } from "../MiddlewareControl"; -import { MiddlewareOptions } from "./IMiddlewareOptions"; - -/** - * @enum - * @property {number} NONE - The hexadecimal flag value for nothing enabled - * @property {number} REDIRECT_HANDLER_ENABLED - The hexadecimal flag value for redirect handler enabled - * @property {number} RETRY_HANDLER_ENABLED - The hexadecimal flag value for retry handler enabled - * @property {number} AUTHENTICATION_HANDLER_ENABLED - The hexadecimal flag value for the authentication handler enabled - */ - -export enum FeatureUsageFlag { - /* eslint-disable @typescript-eslint/naming-convention */ - NONE = 0x0, - REDIRECT_HANDLER_ENABLED = 0x1, - RETRY_HANDLER_ENABLED = 0x2, - AUTHENTICATION_HANDLER_ENABLED = 0x4, - /* eslint-enable @typescript-eslint/naming-convention */ -} - -/** - * @class - * @implements MiddlewareOptions - * Class for TelemetryHandlerOptions - */ - -export class TelemetryHandlerOptions implements MiddlewareOptions { - /** - * @private - * A member to hold the OR of feature usage flags - */ - private featureUsage: FeatureUsageFlag = FeatureUsageFlag.NONE; - - /** - * @public - * @static - * To update the feature usage in the context object - * @param {Context} context - The request context object containing middleware options - * @param {FeatureUsageFlag} flag - The flag value - * @returns nothing - */ - public static updateFeatureUsageFlag(context: Context, flag: FeatureUsageFlag): void { - let options: TelemetryHandlerOptions; - if (context.middlewareControl instanceof MiddlewareControl) { - options = context.middlewareControl.getMiddlewareOptions(TelemetryHandlerOptions) as TelemetryHandlerOptions; - } else { - context.middlewareControl = new MiddlewareControl(); - } - if (typeof options === "undefined") { - options = new TelemetryHandlerOptions(); - context.middlewareControl.setMiddlewareOptions(TelemetryHandlerOptions, options); - } - options.setFeatureUsage(flag); - } - - /** - * @private - * To set the feature usage flag - * @param {FeatureUsageFlag} flag - The flag value - * @returns nothing - */ - private setFeatureUsage(flag: FeatureUsageFlag): void { - this.featureUsage = this.featureUsage | flag; - } - - /** - * @public - * To get the feature usage - * @returns A feature usage flag as hexadecimal string - */ - public getFeatureUsage(): string { - return this.featureUsage.toString(16); - } -} diff --git a/http/typescript/fetch/src/middlewareContext.ts b/http/typescript/fetch/src/middlewareContext.ts index 231e5ef957..d3fa754622 100644 --- a/http/typescript/fetch/src/middlewareContext.ts +++ b/http/typescript/fetch/src/middlewareContext.ts @@ -20,10 +20,5 @@ import { FetchOptions } from "./IFetchOptions"; */ export interface MiddlewareContext { - request: RequestInfo; - options?: FetchOptions; - response?: Response; - // TODO add request information from middleware options - middlewareOptions?: MiddlewareOptions; / } \ No newline at end of file diff --git a/http/typescript/fetch/tsconfig.json b/http/typescript/fetch/tsconfig.json index f080caee33..515f2fc981 100644 --- a/http/typescript/fetch/tsconfig.json +++ b/http/typescript/fetch/tsconfig.json @@ -1,70 +1,15 @@ { - "compilerOptions": { - /* Visit https://aka.ms/tsconfig.json to read more about this file */ - - /* Basic Options */ - "incremental": true, /* Enable incremental compilation */ - "target": "es2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ - "module": "es2020", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ - "lib": [ "ES2015", "ES2016", "ES2017", "ES2018", "ES2019", "ES2020"], /* Specify library files to be included in the compilation. */ - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "./dist", /* Redirect output structure to the directory. */ - "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - // "composite": true, /* Enable project compilation */ - // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ - // "removeComments": true, /* Do not emit comments to output. */ - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - - /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ - "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - "strictNullChecks": true, /* Enable strict null checks. */ - "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - - /* Additional Checks */ - "noUnusedLocals": true, /* Report errors on unused locals. */ - "noUnusedParameters": true, /* Report errors on unused parameters. */ - "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ - - /* Module Resolution Options */ - "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "types": [], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - - /* Source Map Options */ - // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - - /* Advanced Options */ - "skipLibCheck": true, /* Skip type checking of declaration files. */ - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ - } -} + "compilerOptions": { + "module": "CommonJS", + "esModuleInterop": true, + "target": "es5", + "moduleResolution": "node", + "downlevelIteration": true, + "allowSyntheticDefaultImports": true, + "outDir": "lib", + "lib": ["es2020", "DOM"], + "declaration": true + }, + "exclude": ["node_modules"], + +} \ No newline at end of file From 476532d73d34f67b3c83f399e54111d372f27564 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Mon, 13 Sep 2021 22:02:58 -0700 Subject: [PATCH 03/34] introduce custom fetch --- abstractions/typescript/src/fetchOptions.ts | 35 +++ abstractions/typescript/src/index.ts | 3 +- abstractions/typescript/src/requestDetails.ts | 14 ++ .../typescript/src/requestInformation.ts | 12 +- abstractions/typescript/tsconfig.json | 2 +- http/typescript/fetch/package-lock.json | 125 +++------- http/typescript/fetch/package.json | 2 +- http/typescript/fetch/src/context.ts | 19 ++ http/typescript/fetch/src/fetchHandler.ts | 46 ++++ http/typescript/fetch/src/httpClient.ts | 61 ++++- .../typescript/fetch/src/httpClientFactory.ts | 25 +- http/typescript/fetch/src/httpCore.ts | 26 +- http/typescript/fetch/src/index.ts | 2 +- .../src/middleware/AuthenticationHandler.ts | 65 ----- .../fetch/src/middleware/FetchHandler.ts | 30 --- .../fetch/src/middleware/MiddlewareControl.ts | 64 ----- .../fetch/src/middleware/RedirectHandler.ts | 32 --- .../fetch/src/middleware/RetryHandler.ts | 42 ---- .../middleware/options/IMiddlewareOptions.ts | 14 -- .../options/RedirectHandlerOptions.ts | 27 -- .../middleware/options/RetryHandlerOptions.ts | 28 --- .../typescript/fetch/src/middlewareContext.ts | 24 -- .../{middleware => middlewares}/middleware.ts | 6 +- .../middlewareFactory.ts} | 16 +- .../fetch/src/middlewares/middlewareUtil.ts | 128 ++++++++++ .../options/RedirectHandlerOptions.ts | 80 ++++++ .../options/RetryHandlerOptions.ts | 128 ++++++++++ .../fetch/src/middlewares/redirectHandler.ts | 235 ++++++++++++++++++ .../fetch/src/middlewares/retryHandler.ts | 205 +++++++++++++++ http/typescript/fetch/tsconfig.json | 2 +- 30 files changed, 1035 insertions(+), 463 deletions(-) create mode 100644 abstractions/typescript/src/fetchOptions.ts create mode 100644 abstractions/typescript/src/requestDetails.ts create mode 100644 http/typescript/fetch/src/context.ts create mode 100644 http/typescript/fetch/src/fetchHandler.ts delete mode 100644 http/typescript/fetch/src/middleware/AuthenticationHandler.ts delete mode 100644 http/typescript/fetch/src/middleware/FetchHandler.ts delete mode 100644 http/typescript/fetch/src/middleware/MiddlewareControl.ts delete mode 100644 http/typescript/fetch/src/middleware/RedirectHandler.ts delete mode 100644 http/typescript/fetch/src/middleware/RetryHandler.ts delete mode 100644 http/typescript/fetch/src/middleware/options/IMiddlewareOptions.ts delete mode 100644 http/typescript/fetch/src/middleware/options/RedirectHandlerOptions.ts delete mode 100644 http/typescript/fetch/src/middleware/options/RetryHandlerOptions.ts delete mode 100644 http/typescript/fetch/src/middlewareContext.ts rename http/typescript/fetch/src/{middleware => middlewares}/middleware.ts (87%) rename http/typescript/fetch/src/{middleware/MiddlewareFactory.ts => middlewares/middlewareFactory.ts} (76%) create mode 100644 http/typescript/fetch/src/middlewares/middlewareUtil.ts create mode 100644 http/typescript/fetch/src/middlewares/options/RedirectHandlerOptions.ts create mode 100644 http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts create mode 100644 http/typescript/fetch/src/middlewares/redirectHandler.ts create mode 100644 http/typescript/fetch/src/middlewares/retryHandler.ts diff --git a/abstractions/typescript/src/fetchOptions.ts b/abstractions/typescript/src/fetchOptions.ts new file mode 100644 index 0000000000..5777c64596 --- /dev/null +++ b/abstractions/typescript/src/fetchOptions.ts @@ -0,0 +1,35 @@ + + +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @interface {@link https://github.com/bitinn/node-fetch/#options} + * Signature to define the fetch request options for node environment + * @property {number} [follow] - node-fetch option: maximum redirect count. 0 to not follow redirect + * @property {number} [compress] - node-fetch option: support gzip/deflate content encoding. false to disable + * @property {number} [size] - node-fetch option: maximum response body size in bytes. 0 to disable + * @property {any} [agent] - node-fetch option: HTTP(S).Agent instance, allows custom proxy, certificate, lookup, family etc. + * @property {number} [highWaterMark] - node-fetch option: maximum number of bytes to store in the internal buffer before ceasing to read from the underlying resource. + * @property {boolean} [insecureHTTPParser] - node-fetch option: use an insecure HTTP parser that accepts invalid HTTP headers when `true`. + */ + export interface NodeFetchInit { + follow?: number; + compress?: boolean; + size?: number; + agent?: any; + highWaterMark?: number; + insecureHTTPParser?: boolean; +} + +/** + * @interface + * Signature to define the fetch api options which includes both fetch standard options and also the extended node fetch options + * @extends RequestInit @see {@link https://fetch.spec.whatwg.org/#requestinit} + * @extends NodeFetchInit + */ +export interface FetchOptions extends RequestInit, NodeFetchInit {} diff --git a/abstractions/typescript/src/index.ts b/abstractions/typescript/src/index.ts index 1120333d82..812c134ecf 100644 --- a/abstractions/typescript/src/index.ts +++ b/abstractions/typescript/src/index.ts @@ -9,4 +9,5 @@ export * from "./nativeResponseWrapper"; export * from './serialization'; export * from './utils'; export * from './store'; -export * from './middlewareOption'; \ No newline at end of file +export * from './middlewareOption'; +export * from './fetchOptions'; \ No newline at end of file diff --git a/abstractions/typescript/src/requestDetails.ts b/abstractions/typescript/src/requestDetails.ts new file mode 100644 index 0000000000..a106369c06 --- /dev/null +++ b/abstractions/typescript/src/requestDetails.ts @@ -0,0 +1,14 @@ +import { HttpMethod } from "./httpMethod"; +import { ReadableStream } from 'web-streams-polyfill/es2018'; +import { MiddlewareOption } from "./middlewareOption"; + +export interface RequestDetails{ + /** The HTTP method for the request */ + httpMethod?: HttpMethod; + /** The Request Body. */ + content?: ReadableStream; + /** The Query Parameters of the request. */ + queryParameters: Map = new Map(); //TODO: case insensitive + /** The Request Headers. */ + headers: HeadersInit //TODO: case insensitive +} diff --git a/abstractions/typescript/src/requestInformation.ts b/abstractions/typescript/src/requestInformation.ts index 8fcc6f64b3..73ecf3bdf3 100644 --- a/abstractions/typescript/src/requestInformation.ts +++ b/abstractions/typescript/src/requestInformation.ts @@ -3,11 +3,13 @@ import { ReadableStream } from 'web-streams-polyfill/es2018'; import { Parsable } from "./serialization"; import { HttpCore } from "./httpCore"; import { MiddlewareOption } from "./middlewareOption"; +import { RequestDetails } from "./requestDetails"; +import { FetchOptions } from "./fetchOptions"; /** This class represents an abstract HTTP request. */ -export class RequestInformation { +export class RequestInformation implements RequestDetails{ /** The URI of the request. */ - public URI?: string; + public URI?: RequestInfo; /** * Sets the URI of the request. * @param currentPath the current path (scheme, host, port, path, query parameters) of the request. @@ -42,7 +44,11 @@ export class RequestInformation { /** The Query Parameters of the request. */ public queryParameters: Map = new Map(); //TODO: case insensitive /** The Request Headers. */ - public headers: Map = new Map(); //TODO: case insensitive + public headers: Headers = new Headers(); //TODO: case insensitive + + + public options?: FetchOptions; + private _middlewareOptions = new Map(); //TODO: case insensitive /** Gets the middleware options for the request. */ public getMiddlewareOptions() { return this._middlewareOptions.values(); } diff --git a/abstractions/typescript/tsconfig.json b/abstractions/typescript/tsconfig.json index f080caee33..5eb00c7578 100644 --- a/abstractions/typescript/tsconfig.json +++ b/abstractions/typescript/tsconfig.json @@ -6,7 +6,7 @@ "incremental": true, /* Enable incremental compilation */ "target": "es2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ "module": "es2020", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ - "lib": [ "ES2015", "ES2016", "ES2017", "ES2018", "ES2019", "ES2020"], /* Specify library files to be included in the compilation. */ + "lib": [ "ES2015", "ES2016", "ES2017", "ES2018", "ES2019", "ES2020", "DOM"], /* Specify library files to be included in the compilation. */ // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index 683c8e6347..339a47ac02 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -1,93 +1,51 @@ { "name": "@microsoft/kiota-http-fetch", "version": "1.0.8", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "@microsoft/kiota-http-fetch", - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "@microsoft/kiota-abstractions": "^1.0.19", - "cross-fetch": "^3.1.4", - "web-streams-polyfill": "^3.1.0" - }, - "devDependencies": { - "@types/node": "^16.7.8", - "typescript": "^4.4.2" - } - }, - "node_modules/@microsoft/kiota-abstractions": { - "version": "1.0.19", - "resolved": "https://npm.pkg.github.com/download/@microsoft/kiota-abstractions/1.0.19/a493a30acbd6b1e73de754aaabf3659bf44921ce7b7c5a54b50d647a97b01329", - "integrity": "sha512-TmSNQPf45+OS4d0TZXaxOyIi8/+7UIsT/JxKFsDkzgQKQAerEKa5cZ9g3wAAkgpT34qqxwm2zH3JIb1WHyZx7Q==", - "license": "MIT", - "dependencies": { - "uuid": "^8.3.2", - "web-streams-polyfill": "^3.1.0" - } - }, - "node_modules/@types/node": { - "version": "16.7.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.8.tgz", - "integrity": "sha512-8upnoQU0OPzbIkm+ZMM0zCeFCkw2s3mS0IWdx0+AAaWqm4fkBb0UJp8Edl7FVKRamYbpJC/aVsHpKWBIbiC7Zg==", - "dev": true - }, - "node_modules/cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", - "dependencies": { - "node-fetch": "2.6.1" - } - }, - "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/typescript": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.2.tgz", - "integrity": "sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.0.tgz", - "integrity": "sha512-wO9r1YnYe7kFBLHyyVEhV1H8VRWoNiNnuP+v/HUUmSTaRF8F93Kmd3JMrETx0f11GXxRek6OcL2QtjFIdc5WYw==", - "engines": { - "node": ">= 8" - } - } - }, "dependencies": { "@microsoft/kiota-abstractions": { - "version": "1.0.19", - "resolved": "https://npm.pkg.github.com/download/@microsoft/kiota-abstractions/1.0.19/a493a30acbd6b1e73de754aaabf3659bf44921ce7b7c5a54b50d647a97b01329", - "integrity": "sha512-TmSNQPf45+OS4d0TZXaxOyIi8/+7UIsT/JxKFsDkzgQKQAerEKa5cZ9g3wAAkgpT34qqxwm2zH3JIb1WHyZx7Q==", + "version": "file:../../../abstractions/typescript", "requires": { "uuid": "^8.3.2", "web-streams-polyfill": "^3.1.0" + }, + "dependencies": { + "@types/lodash": { + "version": "4.14.172", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.172.tgz", + "integrity": "sha512-/BHF5HAx3em7/KkzVKm3LrsD6HZAXuXO1AJZQ3cRRBZj4oHZDviWPYu0aEplAqDFNHZPW6d3G7KN+ONcCCC7pw==" + }, + "@types/node": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.6.1.tgz", + "integrity": "sha512-Sr7BhXEAer9xyGuCN3Ek9eg9xPviCF2gfu9kTfuU2HkTVAMYSDeX40fvpmo72n5nansg3nsBjuQBrsS28r+NUw==" + }, + "@types/uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "web-streams-polyfill": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.0.tgz", + "integrity": "sha512-wO9r1YnYe7kFBLHyyVEhV1H8VRWoNiNnuP+v/HUUmSTaRF8F93Kmd3JMrETx0f11GXxRek6OcL2QtjFIdc5WYw==" + } } }, "@types/node": { @@ -115,11 +73,6 @@ "integrity": "sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==", "dev": true }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, "web-streams-polyfill": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.0.tgz", diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index a4f7fe1e04..04c97d3c8b 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -29,7 +29,7 @@ "registry": "https://npm.pkg.github.com" }, "dependencies": { - "@microsoft/kiota-abstractions": "^1.0.19", + "@microsoft/kiota-abstractions": "file:../../../abstractions/typescript", "cross-fetch": "^3.1.4", "web-streams-polyfill": "^3.1.0" }, diff --git a/http/typescript/fetch/src/context.ts b/http/typescript/fetch/src/context.ts new file mode 100644 index 0000000000..10b35a7cc4 --- /dev/null +++ b/http/typescript/fetch/src/context.ts @@ -0,0 +1,19 @@ +import { MiddlewareOption } from "@microsoft/kiota-abstractions"; +import { FetchOptions } from "../fetchOptions"; + +/** + * @interface + * @property {RequestInfo} request - The request url string or the Request instance + * @property {FetchOptions} [options] - The options for the request + * @property {Response} [response] - The response content + * @property {MiddlewareControl} [middlewareControl] - The options for the middleware chain + * @property {Set}[customHosts] - A set of custom host names. Should contain hostnames only. + * + */ + +export interface Context { + request?:RequestInfo, + response?: Response, + options?:FetchOptions, + middlewareOptions?: MiddlewareOption +} \ No newline at end of file diff --git a/http/typescript/fetch/src/fetchHandler.ts b/http/typescript/fetch/src/fetchHandler.ts new file mode 100644 index 0000000000..ca787a73d3 --- /dev/null +++ b/http/typescript/fetch/src/fetchHandler.ts @@ -0,0 +1,46 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module FetchHandler + */ + +import fetch from "cross-fetch"; +import { Context } from "./Context"; +import { Middleware } from "./middlewares/middleware"; + +/** + * @class + * @implements Middleware + * Class for HTTPMessageHandler + */ +export class FetchHandler implements Middleware { + next = null; + constructor(private customFetch: (context) => Promise) { + + } + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The request context object + * @returns A promise that resolves to nothing + */ + public async execute(context: Context): Promise { + if (this.customFetch) { + context.response = await this.customFetch(context); + } + else { + context.response = await fetch(context.request); + } + return; + } + + + // Consider case where no middleware and just http called? + +} diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index 1409a63f81..e9ac9d3fbf 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -1,28 +1,71 @@ -import { Middleware } from "./middleware/middleware"; -import { MiddlewareContext } from "./middlewareContext"; +import { Middleware } from "./middlewares/middleware"; +import { Context } from "./Context"; /** Default fetch client with options and a middleware pipleline for requests execution. */ export class HttpClient { + private middleware: Middleware /** * Instantiates a new HttpClient. * @param middlewares middlewares to be used for requests execution. * @param defaultRequestSettings default request settings to be used for requests execution. */ - public constructor(private readonly middlewares: Middleware[]) { - this.middlewares.forEach((middleware, idx) => { - if (idx < this.middlewares.length) - middleware.next = this.middlewares[idx + 1]; + public constructor(private customFetch?: () => Promise, ...middlewares: Middleware[]) { + if (middlewares) { + middlewares.forEach((middleware, idx) => { + if (idx < middlewares.length) + this.middleware.next = middlewares[idx + 1]; + }); + } + } + + /** + * @private + * Processes the middleware parameter passed to set this.middleware property + * The calling function should validate if middleware is not undefined or not empty. + * @param {...Middleware} middleware - The middleware passed + * @returns Nothing + */ + private setMiddleware(...middleware: Middleware[]): void { + if (middleware.length > 1) { + this.parseMiddleWareArray(middleware); + } else { + this.middleware = middleware[0]; + } + } + + /** + * @private + * Processes the middleware array to construct the chain + * and sets this.middleware property to the first middlware handler of the array + * The calling function should validate if middleware is not undefined or not empty + * @param {Middleware[]} middlewareArray - The array of middleware handlers + * @returns Nothing + */ + private parseMiddleWareArray(middlewareArray: Middleware[]) { + middlewareArray.forEach((element, index) => { + if (index < middlewareArray.length - 1) { + element.next = middlewareArray[index + 1]; + } }); + this.middleware = middlewareArray[0]; } + /** * Executes a request and returns a promise resolving the response. * @param url the request url. * @param options request options. * @returns the promise resolving the response. */ - public fetch(context: MiddlewareContext): Promise { - if (this.middlewares.length > 0 && this.middlewares[0]) - return this.middlewares[0].execute(context); + public async fetch(context: Context): Promise { + + if (this.customFetch && !this.middleware) { + return this.customFetch(); + } + if (this.middleware) { + await this.middleware.execute(context); + + return context.response; + } else throw new Error("No middlewares found"); } diff --git a/http/typescript/fetch/src/httpClientFactory.ts b/http/typescript/fetch/src/httpClientFactory.ts index fdd48eed36..c4326d68d7 100644 --- a/http/typescript/fetch/src/httpClientFactory.ts +++ b/http/typescript/fetch/src/httpClientFactory.ts @@ -4,23 +4,9 @@ import { HttpClient } from "./httpClient"; import { AuthenticationProvider } from "@microsoft/kiota-abstractions"; - import { AuthenticationHandler } from "./middleware/AuthenticationHandler"; - import { FetchHandler } from "./middleware/FetchHandler"; - import { Middleware } from "./middleware/middleware"; - import { RedirectHandlerOptions } from "./middleware/options/RedirectHandlerOptions"; - import { RetryHandlerOptions } from "./middleware/options/RetryHandlerOptions"; - import { RedirectHandler } from "./middleware/RedirectHandler"; - import { RetryHandler } from "./middleware/RetryHandler"; -import { MiddlewareFactory } from "./middleware/MiddlewareFactory"; + import { Middleware } from "./middlewares/middleware"; +import { MiddlewareFactory } from "./middlewares/middlewareFactory"; - /** - * @private - * To check whether the environment is node or not - * @returns A boolean representing the environment is node or not - */ - const isNodeEnvironment = (): boolean => { - return typeof process === "object" && typeof require === "function"; - }; /** * @class @@ -52,7 +38,12 @@ import { MiddlewareFactory } from "./middleware/MiddlewareFactory"; */ public static createWithMiddleware(middleware: Middleware[]): HttpClient { // Middleware should not empty or undefined. This is check is present in the HTTPClient constructor. - return new HttpClient(middleware); + return new HttpClient(undefined,...middleware); } + + public static createWithoutMiddleware(customFetch:()=> Promise): HttpClient { + // Middleware should not empty or undefined. This is check is present in the HTTPClient constructor. + return new HttpClient(customFetch); + } } \ No newline at end of file diff --git a/http/typescript/fetch/src/httpCore.ts b/http/typescript/fetch/src/httpCore.ts index 8b7e98de7b..a30cc27376 100644 --- a/http/typescript/fetch/src/httpCore.ts +++ b/http/typescript/fetch/src/httpCore.ts @@ -3,6 +3,8 @@ import { Headers as FetchHeadersCtor } from 'cross-fetch'; import { ReadableStream } from 'web-streams-polyfill'; import { URLSearchParams } from 'url'; import { HttpClient } from './httpClient'; +import { Context } from 'vm'; +import { MiddlewareContext } from './middlewareContext'; export class HttpCore implements IHttpCore { public getSerializationWriterFactory(): SerializationWriterFactory { return this.serializationWriterFactory; @@ -42,7 +44,7 @@ export class HttpCore implements IHttpCore { await this.authenticationProvider.authenticateRequest(requestInfo); const request = this.getRequestFromRequestInformation(requestInfo); - const response = await this.httpClient.fetch(this.getRequestUrl(requestInfo), request); + const response = await this.httpClient.fetch(this.createContext(requestInfo)); if(responseHandler) { return await responseHandler.handleResponseAsync(response); } else { @@ -63,7 +65,7 @@ export class HttpCore implements IHttpCore { await this.authenticationProvider.authenticateRequest(requestInfo); const request = this.getRequestFromRequestInformation(requestInfo); - const response = await this.httpClient.fetch(this.getRequestUrl(requestInfo), request); + const response = await this.httpClient.fetch(this.createContext(requestInfo)); if(responseHandler) { return await responseHandler.handleResponseAsync(response); } else { @@ -84,7 +86,7 @@ export class HttpCore implements IHttpCore { await this.authenticationProvider.authenticateRequest(requestInfo); const request = this.getRequestFromRequestInformation(requestInfo); - const response = await this.httpClient.fetch(this.getRequestUrl(requestInfo), request); + const response = await this.httpClient.fetch(this.createContext(requestInfo)); if(responseHandler) { return await responseHandler.handleResponseAsync(response); } else { @@ -132,7 +134,7 @@ export class HttpCore implements IHttpCore { await this.authenticationProvider.authenticateRequest(requestInfo); const request = this.getRequestFromRequestInformation(requestInfo); - const response = await this.httpClient.fetch(this.getRequestUrl(requestInfo), request); + const response = await this.httpClient.fetch(this.createContext(requestInfo)); if(responseHandler) { return await responseHandler.handleResponseAsync(response); } @@ -147,11 +149,11 @@ export class HttpCore implements IHttpCore { } } private getRequestFromRequestInformation = (requestInfo: RequestInformation): RequestInit => { - const request = { + const request :RequestInit = { method: requestInfo.httpMethod?.toString(), - headers: new FetchHeadersCtor(), + headers: new Headers(), body: requestInfo.content, - } as RequestInit; + } requestInfo.headers?.forEach((v, k) => (request.headers as Headers).set(k, v)); return request; } @@ -167,4 +169,14 @@ export class HttpCore implements IHttpCore { return url; } + private createContext (requestInformation : RequestInformation): MiddlewareContext{ + + const context:MiddlewareContext = { + request: this.getRequestUrl(requestInformation), + options: requestInformation.headers, + middlewareOptions: requestInformation.getMiddlewareOptions() + } + return context; + } + } \ No newline at end of file diff --git a/http/typescript/fetch/src/index.ts b/http/typescript/fetch/src/index.ts index f624f13227..1848ad07c5 100644 --- a/http/typescript/fetch/src/index.ts +++ b/http/typescript/fetch/src/index.ts @@ -1,3 +1,3 @@ export * from './httpCore'; export * from './httpClient'; -export * from './middleware/middleware'; \ No newline at end of file +export * from './middlewares/middleware'; \ No newline at end of file diff --git a/http/typescript/fetch/src/middleware/AuthenticationHandler.ts b/http/typescript/fetch/src/middleware/AuthenticationHandler.ts deleted file mode 100644 index 18051f171f..0000000000 --- a/http/typescript/fetch/src/middleware/AuthenticationHandler.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @module AuthenticationHandler - */ - -import { AuthenticationProvider } from "@microsoft/kiota-abstractions"; -import { MiddlewareContext } from "../middlewareContext"; -import { Middleware } from "./IMiddleware"; - -/** - * @class - * @implements Middleware - * Class representing AuthenticationHandler - */ -export class AuthenticationHandler implements Middleware { - - /** - * @private - * A member to hold an AuthenticationProvider instance - */ - private authenticationProvider: AuthenticationProvider; - - /** - * @private - * A member to hold next middleware in the middleware chain - */ - private nextMiddleware: Middleware; - - /** - * @public - * @constructor - * Creates an instance of AuthenticationHandler - * @param {AuthenticationProvider} authenticationProvider - The authentication provider for the authentication handler - */ - public constructor(authenticationProvider: AuthenticationProvider) { - this.authenticationProvider = authenticationProvider; - } - - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The context object of the request - * @returns A Promise that resolves to nothing - */ - public async execute(context: MiddlewareContext): Promise { - return await this.nextMiddleware.execute(context); - } - - /** - * @public - * To set the next middleware in the chain - * @param {Middleware} next - The middleware instance - * @returns Nothing - */ - public setNext(next: Middleware): void { - this.nextMiddleware = next; - } -} diff --git a/http/typescript/fetch/src/middleware/FetchHandler.ts b/http/typescript/fetch/src/middleware/FetchHandler.ts deleted file mode 100644 index 9c1b094cd1..0000000000 --- a/http/typescript/fetch/src/middleware/FetchHandler.ts +++ /dev/null @@ -1,30 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @module FetchHandler - */ - -import { MiddlewareContext } from "../middlewareContext"; -import { Middleware } from "./IMiddleware"; - -/** - * @class - * @implements Middleware - * Class for HTTPMessageHandler - */ -export class FetchHandler implements Middleware { - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The request context object - * @returns A promise that resolves to nothing - */ - public async execute(context: MiddlewareContext): Promise { - } -} diff --git a/http/typescript/fetch/src/middleware/MiddlewareControl.ts b/http/typescript/fetch/src/middleware/MiddlewareControl.ts deleted file mode 100644 index 93ab7ad9cb..0000000000 --- a/http/typescript/fetch/src/middleware/MiddlewareControl.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @module MiddlewareControl - */ - -import { MiddlewareOptions } from "./options/IMiddlewareOptions"; - -/** - * @class - * Class representing MiddlewareControl - */ -export class MiddlewareControl { - /** - * @private - * A member holding map of MiddlewareOptions - */ - private middlewareOptions: Map; - - /** - * @public - * @constructor - * Creates an instance of MiddlewareControl - * @param {MiddlewareOptions[]} [middlewareOptions = []] - The array of middlewareOptions - * @returns The instance of MiddlewareControl - */ - public constructor(middlewareOptions: MiddlewareOptions[] = []) { - this.middlewareOptions = new Map(); - for (const option of middlewareOptions) { - const fn = option.constructor; - this.middlewareOptions.set(fn, option); - } - } - - /** - * @public - * To get the middleware option using the class of the option - * @param {Function} fn - The class of the strongly typed option class - * @returns The middleware option - * @example - * // if you wanted to return the middleware option associated with this class (MiddlewareControl) - * // call this function like this: - * getMiddlewareOptions(MiddlewareControl) - */ - public getMiddlewareOptions(fn: Function): MiddlewareOptions { - return this.middlewareOptions.get(fn); - } - - /** - * @public - * To set the middleware options using the class of the option - * @param {Function} fn - The class of the strongly typed option class - * @param {MiddlewareOptions} option - The strongly typed middleware option - * @returns nothing - */ - public setMiddlewareOptions(fn: Function, option: MiddlewareOptions): void { - this.middlewareOptions.set(fn, option); - } -} diff --git a/http/typescript/fetch/src/middleware/RedirectHandler.ts b/http/typescript/fetch/src/middleware/RedirectHandler.ts deleted file mode 100644 index 168c4caed2..0000000000 --- a/http/typescript/fetch/src/middleware/RedirectHandler.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @module RedirectHandler - */ - - import { MiddlewareContext } from "../middlewareContext"; - import { Middleware } from "./IMiddleware"; - - /** - * @class - * @implements Middleware - * Class for RetryHandler - */ - export class RedirectHandler implements Middleware { - - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The context object of the request - * @returns A Promise that resolves to nothing - */ - public async execute(context: MiddlewareContext): Promise { - } - } - \ No newline at end of file diff --git a/http/typescript/fetch/src/middleware/RetryHandler.ts b/http/typescript/fetch/src/middleware/RetryHandler.ts deleted file mode 100644 index efa3d148d4..0000000000 --- a/http/typescript/fetch/src/middleware/RetryHandler.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @module RetryHandler - */ - -import { MiddlewareContext } from "../middlewareContext"; -import { Middleware } from "./IMiddleware"; - -/** - * @class - * @implements Middleware - * Class for RetryHandler - */ -export class RetryHandler implements Middleware { - private nextMiddleware: Middleware; - - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The context object of the request - * @returns A Promise that resolves to nothing - */ - public async execute(context: MiddlewareContext): Promise { - } - - /** - * @public - * To set the next middleware in the chain - * @param {Middleware} next - The middleware instance - * @returns Nothing - */ - public setNext(next: Middleware): void { - this.nextMiddleware = next; - } -} diff --git a/http/typescript/fetch/src/middleware/options/IMiddlewareOptions.ts b/http/typescript/fetch/src/middleware/options/IMiddlewareOptions.ts deleted file mode 100644 index ebbf308270..0000000000 --- a/http/typescript/fetch/src/middleware/options/IMiddlewareOptions.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @interface - * Signature representing the middleware options - */ - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface MiddlewareOptions {} diff --git a/http/typescript/fetch/src/middleware/options/RedirectHandlerOptions.ts b/http/typescript/fetch/src/middleware/options/RedirectHandlerOptions.ts deleted file mode 100644 index 2f5e3e104d..0000000000 --- a/http/typescript/fetch/src/middleware/options/RedirectHandlerOptions.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @module RedirectHandlerOptions - */ - -import { MiddlewareOptions } from "./IMiddlewareOptions"; - -/** - * @type - * A type declaration for shouldRetry callback - */ -export type ShouldRedirect = (response: Response) => boolean; - -/** - * @class - * @implements MiddlewareOptions - * A class representing RedirectHandlerOptions - */ -export class RedirectHandlerOptions implements MiddlewareOptions { -} - diff --git a/http/typescript/fetch/src/middleware/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middleware/options/RetryHandlerOptions.ts deleted file mode 100644 index 5f09c14b15..0000000000 --- a/http/typescript/fetch/src/middleware/options/RetryHandlerOptions.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @module RetryHandlerOptions - */ - -import { FetchOptions } from "../../IFetchOptions"; -import { MiddlewareOptions } from "./IMiddlewareOptions"; - -/** - * @type - * A type declaration for shouldRetry callback - */ -export type ShouldRetry = (delay: number, attempt: number, request: RequestInfo, options: FetchOptions | undefined, response: Response) => boolean; - -/** - * @class - * @implements MiddlewareOptions - * Class for RetryHandlerOptions - */ - -export class RetryHandlerOptions implements MiddlewareOptions { -} diff --git a/http/typescript/fetch/src/middlewareContext.ts b/http/typescript/fetch/src/middlewareContext.ts deleted file mode 100644 index d3fa754622..0000000000 --- a/http/typescript/fetch/src/middlewareContext.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - - import { MiddlewareOption } from "@microsoft/kiota-abstractions"; -import { FetchOptions } from "./IFetchOptions"; - import { MiddlewareControl } from "./middleware/MiddlewareControl"; - - /** - * @interface - * @property {RequestInfo} request - The request url string or the Request instance - * @property {FetchOptions} [options] - The options for the request - * @property {Response} [response] - The response content - * @property {MiddlewareControl} [middlewareControl] - The options for the middleware chain - * @property {Set}[customHosts] - A set of custom host names. Should contain hostnames only. - * - */ - - export interface MiddlewareContext { - } - \ No newline at end of file diff --git a/http/typescript/fetch/src/middleware/middleware.ts b/http/typescript/fetch/src/middlewares/middleware.ts similarity index 87% rename from http/typescript/fetch/src/middleware/middleware.ts rename to http/typescript/fetch/src/middlewares/middleware.ts index 0f4cac8007..43e0af2e22 100644 --- a/http/typescript/fetch/src/middleware/middleware.ts +++ b/http/typescript/fetch/src/middlewares/middleware.ts @@ -4,11 +4,15 @@ import { MiddlewareContext } from "../middlewareContext"; export interface Middleware { /** Next middleware to be executed. The current middleware must execute it in its implementation. */ next: Middleware | undefined; + /** * Main method of the middleware. * @param req The request object. * @param url The URL of the request. * @return A promise that resolves to the response object. */ - execute(context: MiddlewareContext): Promise; + execute(middlewareContext: MiddlewareContext): Promise; + + + } \ No newline at end of file diff --git a/http/typescript/fetch/src/middleware/MiddlewareFactory.ts b/http/typescript/fetch/src/middlewares/middlewareFactory.ts similarity index 76% rename from http/typescript/fetch/src/middleware/MiddlewareFactory.ts rename to http/typescript/fetch/src/middlewares/middlewareFactory.ts index 5c1e3d74ff..9ac62a7703 100644 --- a/http/typescript/fetch/src/middleware/MiddlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/middlewareFactory.ts @@ -9,15 +9,13 @@ * @module MiddlewareFactory */ -import { AuthenticationProvider } from "../IAuthenticationProvider"; -import { AuthenticationHandler } from "./AuthenticationHandler"; -import { FetchHandler, HTTPMessageHandler } from "./FetchHandler"; -import { Middleware } from "./IMiddleware"; +import { AuthenticationProvider } from "@microsoft/kiota-abstractions"; +import { FetchHandler} from "../fetchHandler"; +import { Middleware } from "./middleware"; import { RedirectHandlerOptions } from "./options/RedirectHandlerOptions"; import { RetryHandlerOptions } from "./options/RetryHandlerOptions"; -import { RedirectHandler } from "./RedirectHandler"; -import { RetryHandler } from "./RetryHandler"; -import { TelemetryHandler } from "./TelemetryHandler"; +import { RedirectHandler } from "./redirectHandler"; +import { RetryHandler } from "./retryHandler"; /** * @private @@ -42,10 +40,10 @@ export class MiddlewareFactory { */ public static getDefaultMiddlewareChain(authProvider: AuthenticationProvider): Middleware[] { const middleware: Middleware[] = []; - const authenticationHandler = new AuthenticationHandler(authProvider); + // TODO :const authenticationHandler = new AuthenticationHandler(authProvider); const retryHandler = new RetryHandler(new RetryHandlerOptions()); - middleware.push(authenticationHandler); + //middleware.push(authenticationHandler); middleware.push(retryHandler); if (isNodeEnvironment()) { const redirectHandler = new RedirectHandler(new RedirectHandlerOptions()); diff --git a/http/typescript/fetch/src/middlewares/middlewareUtil.ts b/http/typescript/fetch/src/middlewares/middlewareUtil.ts new file mode 100644 index 0000000000..718a24c453 --- /dev/null +++ b/http/typescript/fetch/src/middlewares/middlewareUtil.ts @@ -0,0 +1,128 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module MiddlewareUtil + */ + +import { FetchOptions } from "../IFetchOptions"; + +/** + * @constant + * To get the request header from the request + * @param {RequestInfo} request - The request object or the url string + * @param {FetchOptions|undefined} options - The request options object + * @param {string} key - The header key string + * @returns A header value for the given key from the request + */ +export const getRequestHeader = (request: RequestInfo, options: FetchOptions | undefined, key: string): string | null => { + let value: string = null; + if (typeof Request !== "undefined" && request instanceof Request) { + value = (request as Request).headers.get(key); + } else if (typeof options !== "undefined" && options.headers !== undefined) { + if (typeof Headers !== "undefined" && options.headers instanceof Headers) { + value = (options.headers as Headers).get(key); + } else if (options.headers instanceof Array) { + const headers = options.headers as string[][]; + for (let i = 0, l = headers.length; i < l; i++) { + if (headers[i][0] === key) { + value = headers[i][1]; + break; + } + } + } else if (options.headers[key] !== undefined) { + value = options.headers[key]; + } + } + return value; +}; + +/** + * @constant + * To set the header value to the given request + * @param {RequestInfo} request - The request object or the url string + * @param {FetchOptions|undefined} options - The request options object + * @param {string} key - The header key string + * @param {string } value - The header value string + * @returns Nothing + */ +export const setRequestHeader = (request: RequestInfo, options: FetchOptions | undefined, key: string, value: string): void => { + if (typeof Request !== "undefined" && request instanceof Request) { + (request as Request).headers.set(key, value); + } else if (typeof options !== "undefined") { + if (options.headers === undefined) { + options.headers = new Headers({ + [key]: value, + }); + } else { + if (typeof Headers !== "undefined" && options.headers instanceof Headers) { + (options.headers as Headers).set(key, value); + } else if (options.headers instanceof Array) { + let i = 0; + const l = options.headers.length; + for (; i < l; i++) { + const header = options.headers[i]; + if (header[0] === key) { + header[1] = value; + break; + } + } + if (i === l) { + (options.headers as string[][]).push([key, value]); + } + } else { + Object.assign(options.headers, { [key]: value }); + } + } + } +}; + +/** + * @constant + * To append the header value to the given request + * @param {RequestInfo} request - The request object or the url string + * @param {FetchOptions|undefined} options - The request options object + * @param {string} key - The header key string + * @param {string } value - The header value string + * @returns Nothing + */ +export const appendRequestHeader = (request: RequestInfo, options: FetchOptions | undefined, key: string, value: string): void => { + if (typeof Request !== "undefined" && request instanceof Request) { + (request as Request).headers.append(key, value); + } else if (typeof options !== "undefined") { + if (options.headers === undefined) { + options.headers = new Headers({ + [key]: value, + }); + } else { + if (typeof Headers !== "undefined" && options.headers instanceof Headers) { + (options.headers as Headers).append(key, value); + } else if (options.headers instanceof Array) { + (options.headers as string[][]).push([key, value]); + } else if (options.headers === undefined) { + options.headers = { [key]: value }; + } else if (options.headers[key] === undefined) { + options.headers[key] = value; + } else { + options.headers[key] += `, ${value}`; + } + } + } +}; + +/** + * @constant + * To clone the request with the new url + * @param {string} url - The new url string + * @param {Request} request - The request object + * @returns A promise that resolves to request object + */ +export const cloneRequestWithNewUrl = async (newUrl: string, request: Request): Promise => { + const body = request.headers.get("Content-Type") ? await request.blob() : await Promise.resolve(undefined); + const { method, headers, referrer, referrerPolicy, mode, credentials, cache, redirect, integrity, keepalive, signal } = request; + return new Request(newUrl, { method, headers, body, referrer, referrerPolicy, mode, credentials, cache, redirect, integrity, keepalive, signal }); +}; diff --git a/http/typescript/fetch/src/middlewares/options/RedirectHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/RedirectHandlerOptions.ts new file mode 100644 index 0000000000..f8729fc4ee --- /dev/null +++ b/http/typescript/fetch/src/middlewares/options/RedirectHandlerOptions.ts @@ -0,0 +1,80 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module RedirectHandlerOptions + */ + +import { MiddlewareOption } from "@microsoft/kiota-abstractions"; + +/** + * @type + * A type declaration for shouldRetry callback + */ + export type ShouldRedirect = (response: Response) => boolean; + + /** + * @class + * @implements MiddlewareOptions + * A class representing RedirectHandlerOptions + */ + export class RedirectHandlerOptions implements MiddlewareOption { + /** + * @private + * @static + * A member holding default max redirects value + */ + private static DEFAULT_MAX_REDIRECTS = 5; + + /** + * @private + * @static + * A member holding maximum max redirects value + */ + private static MAX_MAX_REDIRECTS = 20; + + /** + * @public + * A member holding max redirects value + */ + public maxRedirects: number; + + /** + * @public + * A member holding shouldRedirect callback + */ + public shouldRedirect: ShouldRedirect; + + /** + * @private + * A member holding default shouldRedirect callback + */ + private static defaultShouldRetry: ShouldRedirect = () => true; + + /** + * @public + * @constructor + * To create an instance of RedirectHandlerOptions + * @param {number} [maxRedirects = RedirectHandlerOptions.DEFAULT_MAX_REDIRECTS] - The max redirects value + * @param {ShouldRedirect} [shouldRedirect = RedirectHandlerOptions.DEFAULT_SHOULD_RETRY] - The should redirect callback + * @returns An instance of RedirectHandlerOptions + */ + public constructor(maxRedirects: number = RedirectHandlerOptions.DEFAULT_MAX_REDIRECTS, shouldRedirect: ShouldRedirect = RedirectHandlerOptions.defaultShouldRetry) { + if (maxRedirects > RedirectHandlerOptions.MAX_MAX_REDIRECTS) { + const error = new Error(`MaxRedirects should not be more than ${RedirectHandlerOptions.MAX_MAX_REDIRECTS}`); + error.name = "MaxLimitExceeded"; + throw error; + } + if (maxRedirects < 0) { + const error = new Error(`MaxRedirects should not be negative`); + error.name = "MinExpectationNotMet"; + throw error; + } + this.maxRedirects = maxRedirects; + this.shouldRedirect = shouldRedirect; + } +} diff --git a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts new file mode 100644 index 0000000000..2dfb56b8d8 --- /dev/null +++ b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts @@ -0,0 +1,128 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module RetryHandlerOptions + */ + +import { FetchOptions } from "@microsoft/kiota-abstractions"; +import { MiddlewareOption } from "@microsoft/kiota-abstractions"; + +/** + * @type + * A type declaration for shouldRetry callback + */ +export type ShouldRetry = (delay: number, attempt: number, request: RequestInfo, options: FetchOptions | undefined, response: Response) => boolean; + +/** + * @class + * @implements MiddlewareOptions + * Class for RetryHandlerOptions + */ + + export class RetryHandlerOptions implements MiddlewareOption { + /** + * @private + * @static + * A member holding default delay value in seconds + */ + private static DEFAULT_DELAY = 3; + + /** + * @private + * @static + * A member holding default maxRetries value + */ + private static DEFAULT_MAX_RETRIES = 3; + + /** + * @private + * @static + * A member holding maximum delay value in seconds + */ + private static MAX_DELAY = 180; + + /** + * @private + * @static + * A member holding maximum maxRetries value + */ + private static MAX_MAX_RETRIES = 10; + + /** + * @public + * A member holding delay value in seconds + */ + public delay: number; + + /** + * @public + * A member holding maxRetries value + */ + public maxRetries: number; + + /** + * @public + * A member holding shouldRetry callback + */ + public shouldRetry: ShouldRetry; + + /** + * @private + * A member holding default shouldRetry callback + */ + private static defaultShouldRetry: ShouldRetry = () => true; + + /** + * @public + * @constructor + * To create an instance of RetryHandlerOptions + * @param {number} [delay = RetryHandlerOptions.DEFAULT_DELAY] - The delay value in seconds + * @param {number} [maxRetries = RetryHandlerOptions.DEFAULT_MAX_RETRIES] - The maxRetries value + * @param {ShouldRetry} [shouldRetry = RetryHandlerOptions.DEFAULT_SHOULD_RETRY] - The shouldRetry callback function + * @returns An instance of RetryHandlerOptions + */ + public constructor(delay: number = RetryHandlerOptions.DEFAULT_DELAY, maxRetries: number = RetryHandlerOptions.DEFAULT_MAX_RETRIES, shouldRetry: ShouldRetry = RetryHandlerOptions.defaultShouldRetry) { + if (delay > RetryHandlerOptions.MAX_DELAY && maxRetries > RetryHandlerOptions.MAX_MAX_RETRIES) { + const error = new Error(`Delay and MaxRetries should not be more than ${RetryHandlerOptions.MAX_DELAY} and ${RetryHandlerOptions.MAX_MAX_RETRIES}`); + error.name = "MaxLimitExceeded"; + throw error; + } else if (delay > RetryHandlerOptions.MAX_DELAY) { + const error = new Error(`Delay should not be more than ${RetryHandlerOptions.MAX_DELAY}`); + error.name = "MaxLimitExceeded"; + throw error; + } else if (maxRetries > RetryHandlerOptions.MAX_MAX_RETRIES) { + const error = new Error(`MaxRetries should not be more than ${RetryHandlerOptions.MAX_MAX_RETRIES}`); + error.name = "MaxLimitExceeded"; + throw error; + } else if (delay < 0 && maxRetries < 0) { + const error = new Error(`Delay and MaxRetries should not be negative`); + error.name = "MinExpectationNotMet"; + throw error; + } else if (delay < 0) { + const error = new Error(`Delay should not be negative`); + error.name = "MinExpectationNotMet"; + throw error; + } else if (maxRetries < 0) { + const error = new Error(`MaxRetries should not be negative`); + error.name = "MinExpectationNotMet"; + throw error; + } + this.delay = Math.min(delay, RetryHandlerOptions.MAX_DELAY); + this.maxRetries = Math.min(maxRetries, RetryHandlerOptions.MAX_MAX_RETRIES); + this.shouldRetry = shouldRetry; + } + + /** + * @public + * To get the maximum delay + * @returns A maximum delay + */ + public getMaxDelay(): number { + return RetryHandlerOptions.MAX_DELAY; + } +} diff --git a/http/typescript/fetch/src/middlewares/redirectHandler.ts b/http/typescript/fetch/src/middlewares/redirectHandler.ts new file mode 100644 index 0000000000..50b9597798 --- /dev/null +++ b/http/typescript/fetch/src/middlewares/redirectHandler.ts @@ -0,0 +1,235 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module RedirectHandler + */ + +import { HttpMethod } from "../../../../../abstractions/typescript/dist"; +import { Context } from "../context"; +import { Middleware } from "./middleware"; +import { cloneRequestWithNewUrl } from "./middlewareUtil"; +import { RedirectHandlerOptions } from "./options/RedirectHandlerOptions"; + +/** + * @class + * Class + * @implements Middleware + * Class representing RedirectHandler + */ +export class RedirectHandler implements Middleware { + /** + * @private + * @static + * A member holding the array of redirect status codes + */ + private static REDIRECT_STATUS_CODES: number[] = [ + 301, // Moved Permanently + 302, // Found + 303, // See Other + 307, // Temporary Permanently + 308, // Moved Permanently + ]; + + /** + * @private + * @static + * A member holding SeeOther status code + */ + private static STATUS_CODE_SEE_OTHER = 303; + + /** + * @private + * @static + * A member holding the name of the location header + */ + private static LOCATION_HEADER = "Location"; + + /** + * @private + * @static + * A member representing the authorization header name + */ + private static AUTHORIZATION_HEADER = "Authorization"; + + /** + * @private + * @static + * A member holding the manual redirect value + */ + private static MANUAL_REDIRECT: RequestRedirect = "manual"; + + /** + * @private + * A member holding options to customize the handler behavior + */ + private options: RedirectHandlerOptions; + + /** + * A member to hold next middleware in the middleware chain + */ + next: Middleware; + + /** + * @public + * @constructor + * To create an instance of RedirectHandler + * @param {RedirectHandlerOptions} [options = new RedirectHandlerOptions()] - The redirect handler options instance + * @returns An instance of RedirectHandler + */ + + public constructor(options: RedirectHandlerOptions = new RedirectHandlerOptions()) { + this.options = options; + } + + /** + * @private + * To check whether the response has the redirect status code or not + * @param {Response} response - The response object + * @returns A boolean representing whether the response contains the redirect status code or not + */ + private isRedirect(response: Response): boolean { + return RedirectHandler.REDIRECT_STATUS_CODES.indexOf(response.status) !== -1; + } + + /** + * @private + * To check whether the response has location header or not + * @param {Response} response - The response object + * @returns A boolean representing the whether the response has location header or not + */ + private hasLocationHeader(response: Response): boolean { + return response.headers.has(RedirectHandler.LOCATION_HEADER); + } + + /** + * @private + * To get the redirect url from location header in response object + * @param {Response} response - The response object + * @returns A redirect url from location header + */ + private getLocationHeader(response: Response): string { + return response.headers.get(RedirectHandler.LOCATION_HEADER); + } + + /** + * @private + * To check whether the given url is a relative url or not + * @param {string} url - The url string value + * @returns A boolean representing whether the given url is a relative url or not + */ + private isRelativeURL(url: string): boolean { + return url.indexOf("://") === -1; + } + + /** + * @private + * To check whether the authorization header in the request should be dropped for consequent redirected requests + * @param {string} requestUrl - The request url value + * @param {string} redirectUrl - The redirect url value + * @returns A boolean representing whether the authorization header in the request should be dropped for consequent redirected requests + */ + private shouldDropAuthorizationHeader(requestUrl: string, redirectUrl: string): boolean { + const schemeHostRegex = /^[A-Za-z].+?:\/\/.+?(?=\/|$)/; + const requestMatches: string[] = schemeHostRegex.exec(requestUrl); + let requestAuthority: string; + let redirectAuthority: string; + if (requestMatches !== null) { + requestAuthority = requestMatches[0]; + } + const redirectMatches: string[] = schemeHostRegex.exec(redirectUrl); + if (redirectMatches !== null) { + redirectAuthority = redirectMatches[0]; + } + return typeof requestAuthority !== "undefined" && typeof redirectAuthority !== "undefined" && requestAuthority !== redirectAuthority; + } + + /** + * @private + * @async + * To update a request url with the redirect url + * @param {string} redirectUrl - The redirect url value + * @param {Context} context - The context object value + * @returns Nothing + */ + private async updateRequestUrl(redirectUrl: string, context: Context): Promise { + context.request = typeof context.request === "string" ? redirectUrl : await cloneRequestWithNewUrl(redirectUrl, context.request as Request); + } + + /** + * @private + * To get the options for execution of the middleware + * @param {Context} context - The context object + * @returns A options for middleware execution + */ + private getOptions(context: Context): RedirectHandlerOptions { + let options: RedirectHandlerOptions; + if (context.middlewareOptions) { + options = context.middlewareOptions as RedirectHandlerOptions; + } + if (typeof options === "undefined") { + options = Object.assign(new RedirectHandlerOptions(), this.options); + } + return options; + } + + /** + * @private + * @async + * To execute the next middleware and to handle in case of redirect response returned by the server + * @param {Context} context - The context object + * @param {number} redirectCount - The redirect count value + * @param {RedirectHandlerOptions} options - The redirect handler options instance + * @returns A promise that resolves to nothing + */ + private async executeWithRedirect(context: Context, redirectCount: number, options: RedirectHandlerOptions): Promise { + await this.next.execute(context); + const response = context.response; + if (redirectCount < options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && options.shouldRedirect(response)) { + ++redirectCount; + if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { + context.options.method = HttpMethod.GET; + delete context.options.body; + } else { + const redirectUrl: string = this.getLocationHeader(response); + if (!this.isRelativeURL(redirectUrl) && this.shouldDropAuthorizationHeader(response.url, redirectUrl)) { + delete context.options.headers[RedirectHandler.AUTHORIZATION_HEADER]; + } + await this.updateRequestUrl(redirectUrl, context); + } + await this.executeWithRedirect(context, redirectCount, options); + } else { + return; + } + } + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The context object of the request + * @returns A Promise that resolves to nothing + */ + public async execute(context: Context): Promise { + const redirectCount = 0; + const options = this.getOptions(context); + context.options.redirect = RedirectHandler.MANUAL_REDIRECT; + return await this.executeWithRedirect(context, redirectCount, options); + } + + /** + * @public + * To set the next middleware in the chain + * @param {Middleware} next - The middleware instance + * @returns Nothing + */ + public setNext(next: Middleware): void { + this.next = next; + } + + +} diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts new file mode 100644 index 0000000000..f0ee5fe7d9 --- /dev/null +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -0,0 +1,205 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module RetryHandler + */ + +import { Context } from "../Context"; +import { FetchOptions } from "@microsoft/kiota-abstractions"; +import { HttpMethod} from "@microsoft/kiota-abstractions"; +import { Middleware } from "./middleware"; +import { getRequestHeader, setRequestHeader } from "./middlewareUtil"; +import { RetryHandlerOptions } from "./options/RetryHandlerOptions"; + +/** + * @class + * @implements Middleware + * Class for RetryHandler + */ +export class RetryHandler implements Middleware { + /** + * @private + * @static + * A list of status codes that needs to be retried + */ + private static RETRY_STATUS_CODES: number[] = [ + 429, // Too many requests + 503, // Service unavailable + 504, // Gateway timeout + ]; + + /** + * @private + * @static + * A member holding the name of retry attempt header + */ + private static RETRY_ATTEMPT_HEADER = "Retry-Attempt"; + + /** + * @private + * @static + * A member holding the name of retry after header + */ + private static RETRY_AFTER_HEADER = "Retry-After"; + + /** + * @private + * A member to hold next middleware in the middleware chain + */ + private nextMiddleware: Middleware; + + /** + * @private + * A member holding the retry handler options + */ + private options: RetryHandlerOptions; + + /** + * @public + * @constructor + * To create an instance of RetryHandler + * @param {RetryHandlerOptions} [options = new RetryHandlerOptions()] - The retry handler options value + * @returns An instance of RetryHandler + */ + public constructor(options: RetryHandlerOptions = new RetryHandlerOptions()) { + this.options = options; + } + + /** + * + * @private + * To check whether the response has the retry status code + * @param {Response} response - The response object + * @returns Whether the response has retry status code or not + */ + private isRetry(response: Response): boolean { + return RetryHandler.RETRY_STATUS_CODES.indexOf(response.status) !== -1; + } + + /** + * @private + * To check whether the payload is buffered or not + * @param {RequestInfo} request - The url string or the request object value + * @param {FetchOptions} options - The options of a request + * @returns Whether the payload is buffered or not + */ + private isBuffered(request: RequestInfo, options: FetchOptions | undefined): boolean { + const method = typeof request === "string" ? options.method : (request as Request).method; + const isPutPatchOrPost: boolean = method === HttpMethod.PUT || method === HttpMethod.PATCH || method === HttpMethod.POST; + if (isPutPatchOrPost) { + const isStream = getRequestHeader(request, options, "Content-Type") === "application/octet-stream"; + if (isStream) { + return false; + } + } + return true; + } + + /** + * @private + * To get the delay for a retry + * @param {Response} response - The response object + * @param {number} retryAttempts - The current attempt count + * @param {number} delay - The delay value in seconds + * @returns A delay for a retry + */ + private getDelay(response: Response, retryAttempts: number, delay: number): number { + const getRandomness = () => Number(Math.random().toFixed(3)); + const retryAfter = response.headers !== undefined ? response.headers.get(RetryHandler.RETRY_AFTER_HEADER) : null; + let newDelay: number; + if (retryAfter !== null) { + if (Number.isNaN(Number(retryAfter))) { + newDelay = Math.round((new Date(retryAfter).getTime() - Date.now()) / 1000); + } else { + newDelay = Number(retryAfter); + } + } else { + // Adding randomness to avoid retrying at a same + newDelay = retryAttempts >= 2 ? this.getExponentialBackOffTime(retryAttempts) + delay + getRandomness() : delay + getRandomness(); + } + return Math.min(newDelay, this.options.getMaxDelay() + getRandomness()); + } + + /** + * @private + * To get an exponential back off value + * @param {number} attempts - The current attempt count + * @returns An exponential back off value + */ + private getExponentialBackOffTime(attempts: number): number { + return Math.round((1 / 2) * (2 ** attempts - 1)); + } + + /** + * @private + * @async + * To add delay for the execution + * @param {number} delaySeconds - The delay value in seconds + * @returns Nothing + */ + private async sleep(delaySeconds: number): Promise { + const delayMilliseconds = delaySeconds * 1000; + return new Promise((resolve) => setTimeout(resolve, delayMilliseconds)); + } + + private getOptions(context: Context): RetryHandlerOptions { + let options: RetryHandlerOptions; + if (context.middlewareOptions) { + options = context.middlewareOptions as RetryHandlerOptions; + } + if (typeof options === "undefined") { + options = Object.assign(new RetryHandlerOptions(), this.options); + } + return options; + } + + /** + * @private + * @async + * To execute the middleware with retries + * @param {Context} context - The context object + * @param {number} retryAttempts - The current attempt count + * @param {RetryHandlerOptions} options - The retry middleware options instance + * @returns A Promise that resolves to nothing + */ + private async executeWithRetry(context: Context, retryAttempts: number, options: RetryHandlerOptions): Promise { + await this.nextMiddleware.execute(context); + if (retryAttempts < options.maxRetries && this.isRetry(context.response) && this.isBuffered(context.request, context.options) && options.shouldRetry(options.delay, retryAttempts, context.request, context.options, context.response)) { + ++retryAttempts; + setRequestHeader(context.request, context.options, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); + const delay = this.getDelay(context.response, retryAttempts, options.delay); + await this.sleep(delay); + return await this.executeWithRetry(context, retryAttempts, options); + } else { + return; + } + } + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The context object of the request + * @returns A Promise that resolves to nothing + */ + public async execute(context: Context): Promise { + const retryAttempts = 0; + const options: RetryHandlerOptions = this.getOptions(context); + return await this.executeWithRetry(context, retryAttempts, options); + } + + /** + * @public + * To set the next middleware in the chain + * @param {Middleware} next - The middleware instance + * @returns Nothing + */ + public setNext(next: Middleware): void { + this.nextMiddleware = next; + } +} diff --git a/http/typescript/fetch/tsconfig.json b/http/typescript/fetch/tsconfig.json index 515f2fc981..cf3e305f3b 100644 --- a/http/typescript/fetch/tsconfig.json +++ b/http/typescript/fetch/tsconfig.json @@ -6,7 +6,7 @@ "moduleResolution": "node", "downlevelIteration": true, "allowSyntheticDefaultImports": true, - "outDir": "lib", + "outDir": "dist", "lib": ["es2020", "DOM"], "declaration": true }, From 0f4d006c864b907cc88b33880880f0ef33030634 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Wed, 22 Sep 2021 12:31:24 -0700 Subject: [PATCH 04/34] removed middlewareoption getkey, httpclient factory, --- .../typescript/src/FetchInitOptions.ts | 36 ++ abstractions/typescript/src/index.ts | 2 +- .../typescript/src/requestInformation.ts | 2 +- http/typescript/fetch/package-lock.json | 93 +--- http/typescript/fetch/package.json | 1 + http/typescript/fetch/src/httpClient.ts | 28 +- .../typescript/fetch/src/httpClientFactory.ts | 49 --- http/typescript/fetch/src/httpCore.ts | 11 +- .../src/{context.ts => middlewareContext.ts} | 2 +- .../src/{ => middlewares}/fetchHandler.ts | 29 +- .../fetch/src/middlewares/middleware.ts | 3 - .../src/middlewares/middlewareFactory.ts | 12 +- .../fetch/src/middlewares/middlewareUtil.ts | 2 +- .../options/RedirectHandlerOptions.ts | 80 ---- .../options/RetryHandlerOptions.ts | 2 +- .../middlewares/options/middlewareOption.ts | 3 + .../options/redirectHandlerOption.ts | 81 ++++ .../fetch/src/middlewares/redirectHandler.ts | 406 +++++++++--------- .../fetch/src/middlewares/retryHandler.ts | 32 +- 19 files changed, 386 insertions(+), 488 deletions(-) create mode 100644 abstractions/typescript/src/FetchInitOptions.ts delete mode 100644 http/typescript/fetch/src/httpClientFactory.ts rename http/typescript/fetch/src/{context.ts => middlewareContext.ts} (94%) rename http/typescript/fetch/src/{ => middlewares}/fetchHandler.ts (58%) delete mode 100644 http/typescript/fetch/src/middlewares/options/RedirectHandlerOptions.ts create mode 100644 http/typescript/fetch/src/middlewares/options/middlewareOption.ts create mode 100644 http/typescript/fetch/src/middlewares/options/redirectHandlerOption.ts diff --git a/abstractions/typescript/src/FetchInitOptions.ts b/abstractions/typescript/src/FetchInitOptions.ts new file mode 100644 index 0000000000..b866f92cc0 --- /dev/null +++ b/abstractions/typescript/src/FetchInitOptions.ts @@ -0,0 +1,36 @@ + + +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @interface {@link https://github.com/bitinn/node-fetch/#options} + * Signature to define the fetch request options for node environment + * @property {number} [follow] - node-fetch option: maximum redirect count. 0 to not follow redirect + * @property {number} [compress] - node-fetch option: support gzip/deflate content encoding. false to disable + * @property {number} [size] - node-fetch option: maximum response body size in bytes. 0 to disable + * @property {any} [agent] - node-fetch option: HTTP(S).Agent instance, allows custom proxy, certificate, lookup, family etc. + * @property {number} [highWaterMark] - node-fetch option: maximum number of bytes to store in the internal buffer before ceasing to read from the underlying resource. + * @property {boolean} [insecureHTTPParser] - node-fetch option: use an insecure HTTP parser that accepts invalid HTTP headers when `true`. + */ + export interface NodeFetchInit { + follow?: number; + compress?: boolean; + size?: number; + agent?: any; + highWaterMark?: number; + insecureHTTPParser?: boolean; +} + +/** + * @interface + * Signature to define the fetch api options which includes both fetch standard options and also the extended node fetch options + * @extends RequestInit @see {@link https://fetch.spec.whatwg.org/#requestinit} + * @extends NodeFetchInit + */ +export interface FetchInitOptions extends RequestInit, NodeFetchInit { +} diff --git a/abstractions/typescript/src/index.ts b/abstractions/typescript/src/index.ts index 812c134ecf..24ae97c877 100644 --- a/abstractions/typescript/src/index.ts +++ b/abstractions/typescript/src/index.ts @@ -10,4 +10,4 @@ export * from './serialization'; export * from './utils'; export * from './store'; export * from './middlewareOption'; -export * from './fetchOptions'; \ No newline at end of file +export * from './FetchInitOptions'; \ No newline at end of file diff --git a/abstractions/typescript/src/requestInformation.ts b/abstractions/typescript/src/requestInformation.ts index 73ecf3bdf3..c4cb1bf5e2 100644 --- a/abstractions/typescript/src/requestInformation.ts +++ b/abstractions/typescript/src/requestInformation.ts @@ -4,7 +4,7 @@ import { Parsable } from "./serialization"; import { HttpCore } from "./httpCore"; import { MiddlewareOption } from "./middlewareOption"; import { RequestDetails } from "./requestDetails"; -import { FetchOptions } from "./fetchOptions"; +import { FetchOptions } from "./FetchInitOptions"; /** This class represents an abstract HTTP request. */ export class RequestInformation implements RequestDetails{ diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index fac1517b46..4468738759 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -3,89 +3,12 @@ "version": "1.0.8", "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "@microsoft/kiota-http-fetch", - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "@microsoft/kiota-abstractions": "^1.0.19", - "cross-fetch": "^3.1.4", - "web-streams-polyfill": "^3.1.1" - }, - "devDependencies": { - "@types/node": "^16.9.4", - "typescript": "^4.4.3" - } - }, - "node_modules/@microsoft/kiota-abstractions": { - "version": "1.0.19", - "resolved": "https://npm.pkg.github.com/download/@microsoft/kiota-abstractions/1.0.19/a493a30acbd6b1e73de754aaabf3659bf44921ce7b7c5a54b50d647a97b01329", - "integrity": "sha512-TmSNQPf45+OS4d0TZXaxOyIi8/+7UIsT/JxKFsDkzgQKQAerEKa5cZ9g3wAAkgpT34qqxwm2zH3JIb1WHyZx7Q==", - "license": "MIT", - "dependencies": { - "uuid": "^8.3.2", - "web-streams-polyfill": "^3.1.0" - } - }, - "node_modules/@types/node": { - "version": "16.9.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.4.tgz", - "integrity": "sha512-KDazLNYAGIuJugdbULwFZULF9qQ13yNWEBFnfVpqlpgAAo6H/qnM9RjBgh0A0kmHf3XxAKLdN5mTIng9iUvVLA==", - "dev": true - }, - "node_modules/cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", - "dependencies": { - "node-fetch": "2.6.1" - } - }, - "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/typescript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", - "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.1.tgz", - "integrity": "sha512-Czi3fG883e96T4DLEPRvufrF2ydhOOW1+1a6c3gNjH2aIh50DNFBdfwh2AKoOf1rXvpvavAoA11Qdq9+BKjE0Q==", - "engines": { - "node": ">= 8" - } - } - }, "dependencies": { "@microsoft/kiota-abstractions": { "version": "file:../../../abstractions/typescript", "requires": { "uuid": "^8.3.2", - "web-streams-polyfill": "^3.1.0" + "web-streams-polyfill": "^3.1.1" }, "dependencies": { "@types/lodash": { @@ -119,9 +42,9 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "web-streams-polyfill": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.0.tgz", - "integrity": "sha512-wO9r1YnYe7kFBLHyyVEhV1H8VRWoNiNnuP+v/HUUmSTaRF8F93Kmd3JMrETx0f11GXxRek6OcL2QtjFIdc5WYw==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.1.tgz", + "integrity": "sha512-Czi3fG883e96T4DLEPRvufrF2ydhOOW1+1a6c3gNjH2aIh50DNFBdfwh2AKoOf1rXvpvavAoA11Qdq9+BKjE0Q==" } } }, @@ -131,6 +54,14 @@ "integrity": "sha512-KDazLNYAGIuJugdbULwFZULF9qQ13yNWEBFnfVpqlpgAAo6H/qnM9RjBgh0A0kmHf3XxAKLdN5mTIng9iUvVLA==", "dev": true }, + "@types/node-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-3.0.3.tgz", + "integrity": "sha512-HhggYPH5N+AQe/OmN6fmhKmRRt2XuNJow+R3pQwJxOOF9GuwM7O2mheyGeIrs5MOIeNjDEdgdoyHBOrFeJBR3g==", + "requires": { + "node-fetch": "*" + } + }, "cross-fetch": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index 71c0ff8bde..3e5c4e31a0 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -30,6 +30,7 @@ }, "dependencies": { "@microsoft/kiota-abstractions": "file:../../../abstractions/typescript", + "@types/node-fetch": "^3.0.3", "cross-fetch": "^3.1.4", "web-streams-polyfill": "^3.1.1" }, diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index e9ac9d3fbf..5d44b82269 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -1,5 +1,7 @@ import { Middleware } from "./middlewares/middleware"; -import { Context } from "./Context"; +import { MiddlewareContext } from "./middlewareContext"; +import { FetchHandler } from "./middlewares/fetchHandler"; +import { MiddlewareFactory } from "./middlewares/middlewareFactory"; /** Default fetch client with options and a middleware pipleline for requests execution. */ export class HttpClient { @@ -9,12 +11,20 @@ export class HttpClient { * @param middlewares middlewares to be used for requests execution. * @param defaultRequestSettings default request settings to be used for requests execution. */ - public constructor(private customFetch?: () => Promise, ...middlewares: Middleware[]) { + public constructor(private customFetch?: (request: RequestInfo, init?: RequestInit) => Promise, ...middlewares: Middleware[]) { + + // Use default middleware chain if middlewares and custom fetch function are not defined + if(!middlewares && !customFetch){ + this.setMiddleware(...(MiddlewareFactory.getDefaultMiddlewareChain())); + } + if (middlewares) { - middlewares.forEach((middleware, idx) => { - if (idx < middlewares.length) - this.middleware.next = middlewares[idx + 1]; - }); + if(customFetch){ + this.setMiddleware(...middlewares, new FetchHandler(customFetch)); + } + else { + this.setMiddleware(...middlewares); + } } } @@ -56,10 +66,10 @@ export class HttpClient { * @param options request options. * @returns the promise resolving the response. */ - public async fetch(context: Context): Promise { + public async executeFetch(context: MiddlewareContext): Promise { if (this.customFetch && !this.middleware) { - return this.customFetch(); + return this.customFetch(context.request, context.options); } if (this.middleware) { await this.middleware.execute(context); @@ -67,6 +77,6 @@ export class HttpClient { return context.response; } else - throw new Error("No middlewares found"); + throw new Error("Please provide middlewares or a custom fetch function to execute the request"); } } \ No newline at end of file diff --git a/http/typescript/fetch/src/httpClientFactory.ts b/http/typescript/fetch/src/httpClientFactory.ts deleted file mode 100644 index c4326d68d7..0000000000 --- a/http/typescript/fetch/src/httpClientFactory.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * @module HTTPClientFactory - */ - - import { HttpClient } from "./httpClient"; - import { AuthenticationProvider } from "@microsoft/kiota-abstractions"; - import { Middleware } from "./middlewares/middleware"; -import { MiddlewareFactory } from "./middlewares/middlewareFactory"; - - - /** - * @class - * Class representing HTTPClientFactory - */ - export class HTTPClientFactory { - /** - * @public - * @static - * Creates HTTPClient with default middleware chain - * @param {AuthenticationProvider} authProvider - The authentication provider instance - * @returns A HTTPClient instance - * - * NOTE: These are the things that we need to remember while doing modifications in the below default pipeline. - * * HTTPMessageHander should be the last one in the middleware pipeline, because this makes the actual network call of the request - * * The best place for AuthenticationHandler is in the starting of the pipeline, because every other handler might have to work for multiple times for a request but the auth token for - * them will remain same. For example, Retry and Redirect handlers might be working multiple times for a request based on the response but their auth token would remain same. - */ - public static createWithAuthenticationProvider(authProvider: AuthenticationProvider): HttpClient { - return HTTPClientFactory.createWithMiddleware(MiddlewareFactory.getDefaultMiddlewareChain(authProvider)); - } - - /** - * @public - * @static - * Creates a middleware chain with the given one - * @property {...Middleware} middleware - The first middleware of the middleware chain or a sequence of all the Middleware handlers - * @returns A HTTPClient instance - */ - public static createWithMiddleware(middleware: Middleware[]): HttpClient { - // Middleware should not empty or undefined. This is check is present in the HTTPClient constructor. - return new HttpClient(undefined,...middleware); - } - - public static createWithoutMiddleware(customFetch:()=> Promise): HttpClient { - // Middleware should not empty or undefined. This is check is present in the HTTPClient constructor. - return new HttpClient(customFetch); - } - } - \ No newline at end of file diff --git a/http/typescript/fetch/src/httpCore.ts b/http/typescript/fetch/src/httpCore.ts index a30cc27376..a3234849a7 100644 --- a/http/typescript/fetch/src/httpCore.ts +++ b/http/typescript/fetch/src/httpCore.ts @@ -1,9 +1,8 @@ import { AuthenticationProvider, BackingStoreFactory, BackingStoreFactorySingleton, HttpCore as IHttpCore, Parsable, ParseNodeFactory, RequestInformation, ResponseHandler, ParseNodeFactoryRegistry, enableBackingStoreForParseNodeFactory, SerializationWriterFactoryRegistry, enableBackingStoreForSerializationWriterFactory, SerializationWriterFactory } from '@microsoft/kiota-abstractions'; -import { Headers as FetchHeadersCtor } from 'cross-fetch'; import { ReadableStream } from 'web-streams-polyfill'; import { URLSearchParams } from 'url'; import { HttpClient } from './httpClient'; -import { Context } from 'vm'; + import { MiddlewareContext } from './middlewareContext'; export class HttpCore implements IHttpCore { public getSerializationWriterFactory(): SerializationWriterFactory { @@ -44,7 +43,7 @@ export class HttpCore implements IHttpCore { await this.authenticationProvider.authenticateRequest(requestInfo); const request = this.getRequestFromRequestInformation(requestInfo); - const response = await this.httpClient.fetch(this.createContext(requestInfo)); + const response = await this.httpClient.executeFetch(this.createContext(requestInfo)); if(responseHandler) { return await responseHandler.handleResponseAsync(response); } else { @@ -65,7 +64,7 @@ export class HttpCore implements IHttpCore { await this.authenticationProvider.authenticateRequest(requestInfo); const request = this.getRequestFromRequestInformation(requestInfo); - const response = await this.httpClient.fetch(this.createContext(requestInfo)); + const response = await this.httpClient.executeFetch(this.createContext(requestInfo)); if(responseHandler) { return await responseHandler.handleResponseAsync(response); } else { @@ -86,7 +85,7 @@ export class HttpCore implements IHttpCore { await this.authenticationProvider.authenticateRequest(requestInfo); const request = this.getRequestFromRequestInformation(requestInfo); - const response = await this.httpClient.fetch(this.createContext(requestInfo)); + const response = await this.httpClient.executeFetch(this.createContext(requestInfo)); if(responseHandler) { return await responseHandler.handleResponseAsync(response); } else { @@ -134,7 +133,7 @@ export class HttpCore implements IHttpCore { await this.authenticationProvider.authenticateRequest(requestInfo); const request = this.getRequestFromRequestInformation(requestInfo); - const response = await this.httpClient.fetch(this.createContext(requestInfo)); + const response = await this.httpClient.executeFetch(this.createContext(requestInfo)); if(responseHandler) { return await responseHandler.handleResponseAsync(response); } diff --git a/http/typescript/fetch/src/context.ts b/http/typescript/fetch/src/middlewareContext.ts similarity index 94% rename from http/typescript/fetch/src/context.ts rename to http/typescript/fetch/src/middlewareContext.ts index 10b35a7cc4..f127ba1bd5 100644 --- a/http/typescript/fetch/src/context.ts +++ b/http/typescript/fetch/src/middlewareContext.ts @@ -11,7 +11,7 @@ import { FetchOptions } from "../fetchOptions"; * */ -export interface Context { +export interface MiddlewareContext { request?:RequestInfo, response?: Response, options?:FetchOptions, diff --git a/http/typescript/fetch/src/fetchHandler.ts b/http/typescript/fetch/src/middlewares/fetchHandler.ts similarity index 58% rename from http/typescript/fetch/src/fetchHandler.ts rename to http/typescript/fetch/src/middlewares/fetchHandler.ts index ca787a73d3..fb05a4d909 100644 --- a/http/typescript/fetch/src/fetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/fetchHandler.ts @@ -10,19 +10,24 @@ */ import fetch from "cross-fetch"; -import { Context } from "./Context"; -import { Middleware } from "./middlewares/middleware"; +import { MiddlewareContext } from "../middlewareContext"; +import { Middleware } from "./middleware"; /** * @class * @implements Middleware - * Class for HTTPMessageHandler + * Class for FetchHandler */ export class FetchHandler implements Middleware { - next = null; - constructor(private customFetch: (context) => Promise) { - } + /** + * @private + * The next middleware in the middleware chain + */ + next: Middleware; + + constructor(private customFetch?: (input: RequestInfo, init:RequestInit) => Promise) {}; + /** * @public * @async @@ -30,17 +35,13 @@ export class FetchHandler implements Middleware { * @param {Context} context - The request context object * @returns A promise that resolves to nothing */ - public async execute(context: Context): Promise { + public async execute(context: MiddlewareContext): Promise { if (this.customFetch) { - context.response = await this.customFetch(context); + context.response = await this.customFetch(context.request, context.options); } else { - context.response = await fetch(context.request); - } + context.response = await fetch(context.request, context.options); + } return; } - - - // Consider case where no middleware and just http called? - } diff --git a/http/typescript/fetch/src/middlewares/middleware.ts b/http/typescript/fetch/src/middlewares/middleware.ts index 43e0af2e22..8db15b54de 100644 --- a/http/typescript/fetch/src/middlewares/middleware.ts +++ b/http/typescript/fetch/src/middlewares/middleware.ts @@ -12,7 +12,4 @@ export interface Middleware { * @return A promise that resolves to the response object. */ execute(middlewareContext: MiddlewareContext): Promise; - - - } \ No newline at end of file diff --git a/http/typescript/fetch/src/middlewares/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/middlewareFactory.ts index 9ac62a7703..763c7b8ec7 100644 --- a/http/typescript/fetch/src/middlewares/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/middlewareFactory.ts @@ -9,11 +9,10 @@ * @module MiddlewareFactory */ -import { AuthenticationProvider } from "@microsoft/kiota-abstractions"; -import { FetchHandler} from "../fetchHandler"; +import { FetchHandler} from "./fetchHandler"; import { Middleware } from "./middleware"; -import { RedirectHandlerOptions } from "./options/RedirectHandlerOptions"; -import { RetryHandlerOptions } from "./options/RetryHandlerOptions"; +import { RedirectHandlerOptions } from "./options/redirectHandlerOption"; +import { RetryHandlerOptions } from "./options/retryHandlerOptions"; import { RedirectHandler } from "./redirectHandler"; import { RetryHandler } from "./retryHandler"; @@ -38,12 +37,9 @@ export class MiddlewareFactory { * @param {AuthenticationProvider} authProvider - The authentication provider instance * @returns an array of the middleware handlers of the default middleware chain */ - public static getDefaultMiddlewareChain(authProvider: AuthenticationProvider): Middleware[] { + public static getDefaultMiddlewareChain(): Middleware[] { const middleware: Middleware[] = []; - // TODO :const authenticationHandler = new AuthenticationHandler(authProvider); const retryHandler = new RetryHandler(new RetryHandlerOptions()); - - //middleware.push(authenticationHandler); middleware.push(retryHandler); if (isNodeEnvironment()) { const redirectHandler = new RedirectHandler(new RedirectHandlerOptions()); diff --git a/http/typescript/fetch/src/middlewares/middlewareUtil.ts b/http/typescript/fetch/src/middlewares/middlewareUtil.ts index 718a24c453..35f32fb696 100644 --- a/http/typescript/fetch/src/middlewares/middlewareUtil.ts +++ b/http/typescript/fetch/src/middlewares/middlewareUtil.ts @@ -9,7 +9,7 @@ * @module MiddlewareUtil */ -import { FetchOptions } from "../IFetchOptions"; +import { FetchOptions } from "@microsoft/kiota-abstractions"; /** * @constant diff --git a/http/typescript/fetch/src/middlewares/options/RedirectHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/RedirectHandlerOptions.ts deleted file mode 100644 index f8729fc4ee..0000000000 --- a/http/typescript/fetch/src/middlewares/options/RedirectHandlerOptions.ts +++ /dev/null @@ -1,80 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @module RedirectHandlerOptions - */ - -import { MiddlewareOption } from "@microsoft/kiota-abstractions"; - -/** - * @type - * A type declaration for shouldRetry callback - */ - export type ShouldRedirect = (response: Response) => boolean; - - /** - * @class - * @implements MiddlewareOptions - * A class representing RedirectHandlerOptions - */ - export class RedirectHandlerOptions implements MiddlewareOption { - /** - * @private - * @static - * A member holding default max redirects value - */ - private static DEFAULT_MAX_REDIRECTS = 5; - - /** - * @private - * @static - * A member holding maximum max redirects value - */ - private static MAX_MAX_REDIRECTS = 20; - - /** - * @public - * A member holding max redirects value - */ - public maxRedirects: number; - - /** - * @public - * A member holding shouldRedirect callback - */ - public shouldRedirect: ShouldRedirect; - - /** - * @private - * A member holding default shouldRedirect callback - */ - private static defaultShouldRetry: ShouldRedirect = () => true; - - /** - * @public - * @constructor - * To create an instance of RedirectHandlerOptions - * @param {number} [maxRedirects = RedirectHandlerOptions.DEFAULT_MAX_REDIRECTS] - The max redirects value - * @param {ShouldRedirect} [shouldRedirect = RedirectHandlerOptions.DEFAULT_SHOULD_RETRY] - The should redirect callback - * @returns An instance of RedirectHandlerOptions - */ - public constructor(maxRedirects: number = RedirectHandlerOptions.DEFAULT_MAX_REDIRECTS, shouldRedirect: ShouldRedirect = RedirectHandlerOptions.defaultShouldRetry) { - if (maxRedirects > RedirectHandlerOptions.MAX_MAX_REDIRECTS) { - const error = new Error(`MaxRedirects should not be more than ${RedirectHandlerOptions.MAX_MAX_REDIRECTS}`); - error.name = "MaxLimitExceeded"; - throw error; - } - if (maxRedirects < 0) { - const error = new Error(`MaxRedirects should not be negative`); - error.name = "MinExpectationNotMet"; - throw error; - } - this.maxRedirects = maxRedirects; - this.shouldRedirect = shouldRedirect; - } -} diff --git a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts index 2dfb56b8d8..2941710d52 100644 --- a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts +++ b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts @@ -10,7 +10,7 @@ */ import { FetchOptions } from "@microsoft/kiota-abstractions"; -import { MiddlewareOption } from "@microsoft/kiota-abstractions"; +import { MiddlewareOption } from "./middlewareOption"; /** * @type diff --git a/http/typescript/fetch/src/middlewares/options/middlewareOption.ts b/http/typescript/fetch/src/middlewares/options/middlewareOption.ts new file mode 100644 index 0000000000..903c9162de --- /dev/null +++ b/http/typescript/fetch/src/middlewares/options/middlewareOption.ts @@ -0,0 +1,3 @@ +/** Represents a middleware option. */ +export interface MiddlewareOption { +} \ No newline at end of file diff --git a/http/typescript/fetch/src/middlewares/options/redirectHandlerOption.ts b/http/typescript/fetch/src/middlewares/options/redirectHandlerOption.ts new file mode 100644 index 0000000000..3dbeef584b --- /dev/null +++ b/http/typescript/fetch/src/middlewares/options/redirectHandlerOption.ts @@ -0,0 +1,81 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module RedirectHandlerOptions + */ + +import { MiddlewareOption } from "./middlewareOption"; + +/** + * @type + * A type declaration for shouldRetry callback + */ +export type ShouldRedirect = (response: Response) => boolean; + +/** + * @class + * @implements MiddlewareOptions + * A class representing RedirectHandlerOptions + */ +export class RedirectHandlerOptions implements MiddlewareOption { + /** + * @private + * @static + * A member holding default max redirects value + */ + private static DEFAULT_MAX_REDIRECTS = 5; + + /** + * @private + * @static + * A member holding maximum max redirects value + */ + private static MAX_MAX_REDIRECTS = 20; + + /** + * @public + * A member holding max redirects value + */ + public maxRedirects: number; + + /** + * @public + * A member holding shouldRedirect callback + */ + public shouldRedirect: ShouldRedirect; + + /** + * @private + * A member holding default shouldRedirect callback + */ + private static defaultShouldRetry: ShouldRedirect = () => true; + + /** + * @public + * @constructor + * To create an instance of RedirectHandlerOptions + * @param {number} [maxRedirects = RedirectHandlerOptions.DEFAULT_MAX_REDIRECTS] - The max redirects value + * @param {ShouldRedirect} [shouldRedirect = RedirectHandlerOptions.DEFAULT_SHOULD_RETRY] - The should redirect callback + * @returns An instance of RedirectHandlerOptions + */ + public constructor(maxRedirects: number = RedirectHandlerOptions.DEFAULT_MAX_REDIRECTS, shouldRedirect: ShouldRedirect = RedirectHandlerOptions.defaultShouldRetry) { + if (maxRedirects > RedirectHandlerOptions.MAX_MAX_REDIRECTS) { + const error = new Error(`MaxRedirects should not be more than ${RedirectHandlerOptions.MAX_MAX_REDIRECTS}`); + error.name = "MaxLimitExceeded"; + throw error; + } + if (maxRedirects < 0) { + const error = new Error(`MaxRedirects should not be negative`); + error.name = "MinExpectationNotMet"; + throw error; + } + this.maxRedirects = maxRedirects; + this.shouldRedirect = shouldRedirect; + } +} + diff --git a/http/typescript/fetch/src/middlewares/redirectHandler.ts b/http/typescript/fetch/src/middlewares/redirectHandler.ts index 50b9597798..bececbfb83 100644 --- a/http/typescript/fetch/src/middlewares/redirectHandler.ts +++ b/http/typescript/fetch/src/middlewares/redirectHandler.ts @@ -9,11 +9,11 @@ * @module RedirectHandler */ -import { HttpMethod } from "../../../../../abstractions/typescript/dist"; -import { Context } from "../context"; +import { HttpMethod } from "@microsoft/kiota-abstractions"; +import { MiddlewareContext } from "../middlewareContext"; import { Middleware } from "./middleware"; import { cloneRequestWithNewUrl } from "./middlewareUtil"; -import { RedirectHandlerOptions } from "./options/RedirectHandlerOptions"; +import { RedirectHandlerOptions } from "./options/redirectHandlerOption"; /** * @class @@ -22,214 +22,194 @@ import { RedirectHandlerOptions } from "./options/RedirectHandlerOptions"; * Class representing RedirectHandler */ export class RedirectHandler implements Middleware { - /** - * @private - * @static - * A member holding the array of redirect status codes - */ - private static REDIRECT_STATUS_CODES: number[] = [ - 301, // Moved Permanently - 302, // Found - 303, // See Other - 307, // Temporary Permanently - 308, // Moved Permanently - ]; - - /** - * @private - * @static - * A member holding SeeOther status code - */ - private static STATUS_CODE_SEE_OTHER = 303; - - /** - * @private - * @static - * A member holding the name of the location header - */ - private static LOCATION_HEADER = "Location"; - - /** - * @private - * @static - * A member representing the authorization header name - */ - private static AUTHORIZATION_HEADER = "Authorization"; - - /** - * @private - * @static - * A member holding the manual redirect value - */ - private static MANUAL_REDIRECT: RequestRedirect = "manual"; - - /** - * @private - * A member holding options to customize the handler behavior - */ - private options: RedirectHandlerOptions; - - /** - * A member to hold next middleware in the middleware chain - */ - next: Middleware; - - /** - * @public - * @constructor - * To create an instance of RedirectHandler - * @param {RedirectHandlerOptions} [options = new RedirectHandlerOptions()] - The redirect handler options instance - * @returns An instance of RedirectHandler - */ - - public constructor(options: RedirectHandlerOptions = new RedirectHandlerOptions()) { - this.options = options; - } - - /** - * @private - * To check whether the response has the redirect status code or not - * @param {Response} response - The response object - * @returns A boolean representing whether the response contains the redirect status code or not - */ - private isRedirect(response: Response): boolean { - return RedirectHandler.REDIRECT_STATUS_CODES.indexOf(response.status) !== -1; - } - - /** - * @private - * To check whether the response has location header or not - * @param {Response} response - The response object - * @returns A boolean representing the whether the response has location header or not - */ - private hasLocationHeader(response: Response): boolean { - return response.headers.has(RedirectHandler.LOCATION_HEADER); - } - - /** - * @private - * To get the redirect url from location header in response object - * @param {Response} response - The response object - * @returns A redirect url from location header - */ - private getLocationHeader(response: Response): string { - return response.headers.get(RedirectHandler.LOCATION_HEADER); - } - - /** - * @private - * To check whether the given url is a relative url or not - * @param {string} url - The url string value - * @returns A boolean representing whether the given url is a relative url or not - */ - private isRelativeURL(url: string): boolean { - return url.indexOf("://") === -1; - } - - /** - * @private - * To check whether the authorization header in the request should be dropped for consequent redirected requests - * @param {string} requestUrl - The request url value - * @param {string} redirectUrl - The redirect url value - * @returns A boolean representing whether the authorization header in the request should be dropped for consequent redirected requests - */ - private shouldDropAuthorizationHeader(requestUrl: string, redirectUrl: string): boolean { - const schemeHostRegex = /^[A-Za-z].+?:\/\/.+?(?=\/|$)/; - const requestMatches: string[] = schemeHostRegex.exec(requestUrl); - let requestAuthority: string; - let redirectAuthority: string; - if (requestMatches !== null) { - requestAuthority = requestMatches[0]; - } - const redirectMatches: string[] = schemeHostRegex.exec(redirectUrl); - if (redirectMatches !== null) { - redirectAuthority = redirectMatches[0]; - } - return typeof requestAuthority !== "undefined" && typeof redirectAuthority !== "undefined" && requestAuthority !== redirectAuthority; - } - - /** - * @private - * @async - * To update a request url with the redirect url - * @param {string} redirectUrl - The redirect url value - * @param {Context} context - The context object value - * @returns Nothing - */ - private async updateRequestUrl(redirectUrl: string, context: Context): Promise { - context.request = typeof context.request === "string" ? redirectUrl : await cloneRequestWithNewUrl(redirectUrl, context.request as Request); - } - - /** - * @private - * To get the options for execution of the middleware - * @param {Context} context - The context object - * @returns A options for middleware execution - */ - private getOptions(context: Context): RedirectHandlerOptions { - let options: RedirectHandlerOptions; - if (context.middlewareOptions) { - options = context.middlewareOptions as RedirectHandlerOptions; - } - if (typeof options === "undefined") { - options = Object.assign(new RedirectHandlerOptions(), this.options); - } - return options; - } - - /** - * @private - * @async - * To execute the next middleware and to handle in case of redirect response returned by the server - * @param {Context} context - The context object - * @param {number} redirectCount - The redirect count value - * @param {RedirectHandlerOptions} options - The redirect handler options instance - * @returns A promise that resolves to nothing - */ - private async executeWithRedirect(context: Context, redirectCount: number, options: RedirectHandlerOptions): Promise { - await this.next.execute(context); - const response = context.response; - if (redirectCount < options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && options.shouldRedirect(response)) { - ++redirectCount; - if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { - context.options.method = HttpMethod.GET; - delete context.options.body; - } else { - const redirectUrl: string = this.getLocationHeader(response); - if (!this.isRelativeURL(redirectUrl) && this.shouldDropAuthorizationHeader(response.url, redirectUrl)) { - delete context.options.headers[RedirectHandler.AUTHORIZATION_HEADER]; - } - await this.updateRequestUrl(redirectUrl, context); - } - await this.executeWithRedirect(context, redirectCount, options); - } else { - return; - } - } - - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The context object of the request - * @returns A Promise that resolves to nothing - */ - public async execute(context: Context): Promise { - const redirectCount = 0; - const options = this.getOptions(context); - context.options.redirect = RedirectHandler.MANUAL_REDIRECT; - return await this.executeWithRedirect(context, redirectCount, options); - } - - /** - * @public - * To set the next middleware in the chain - * @param {Middleware} next - The middleware instance - * @returns Nothing - */ - public setNext(next: Middleware): void { - this.next = next; - } - - + /** + * @private + * @static + * A member holding the array of redirect status codes + */ + private static REDIRECT_STATUS_CODES: number[] = [ + 301, // Moved Permanently + 302, // Found + 303, // See Other + 307, // Temporary Permanently + 308, // Moved Permanently + ]; + + /** + * @private + * @static + * A member holding SeeOther status code + */ + private static STATUS_CODE_SEE_OTHER = 303; + + /** + * @private + * @static + * A member holding the name of the location header + */ + private static LOCATION_HEADER = "Location"; + + /** + * @private + * @static + * A member representing the authorization header name + */ + private static AUTHORIZATION_HEADER = "Authorization"; + + /** + * @private + * @static + * A member holding the manual redirect value + */ + private static MANUAL_REDIRECT: RequestRedirect = "manual"; + + /** Next middleware to be executed*/ + next: Middleware | undefined; + /** + * + * @public + * @constructor + * To create an instance of RedirectHandler + * @param {RedirectHandlerOptions} [options = new RedirectHandlerOptions()] - The redirect handler options instance + * @returns An instance of RedirectHandler + */ + + public constructor(private options: RedirectHandlerOptions = new RedirectHandlerOptions()) { + this.options = options; + } + + /** + * @private + * To check whether the response has the redirect status code or not + * @param {Response} response - The response object + * @returns A boolean representing whether the response contains the redirect status code or not + */ + private isRedirect(response: Response): boolean { + return RedirectHandler.REDIRECT_STATUS_CODES.indexOf(response.status) !== -1; + } + + /** + * @private + * To check whether the response has location header or not + * @param {Response} response - The response object + * @returns A boolean representing the whether the response has location header or not + */ + private hasLocationHeader(response: Response): boolean { + return response.headers.has(RedirectHandler.LOCATION_HEADER); + } + + /** + * @private + * To get the redirect url from location header in response object + * @param {Response} response - The response object + * @returns A redirect url from location header + */ + private getLocationHeader(response: Response): string { + return response.headers.get(RedirectHandler.LOCATION_HEADER); + } + + /** + * @private + * To check whether the given url is a relative url or not + * @param {string} url - The url string value + * @returns A boolean representing whether the given url is a relative url or not + */ + private isRelativeURL(url: string): boolean { + return url.indexOf("://") === -1; + } + + /** + * @private + * To check whether the authorization header in the request should be dropped for consequent redirected requests + * @param {string} requestUrl - The request url value + * @param {string} redirectUrl - The redirect url value + * @returns A boolean representing whether the authorization header in the request should be dropped for consequent redirected requests + */ + private shouldDropAuthorizationHeader(requestUrl: string, redirectUrl: string): boolean { + const schemeHostRegex = /^[A-Za-z].+?:\/\/.+?(?=\/|$)/; + const requestMatches: string[] = schemeHostRegex.exec(requestUrl); + let requestAuthority: string; + let redirectAuthority: string; + if (requestMatches !== null) { + requestAuthority = requestMatches[0]; + } + const redirectMatches: string[] = schemeHostRegex.exec(redirectUrl); + if (redirectMatches !== null) { + redirectAuthority = redirectMatches[0]; + } + return typeof requestAuthority !== "undefined" && typeof redirectAuthority !== "undefined" && requestAuthority !== redirectAuthority; + } + + /** + * @private + * @async + * To update a request url with the redirect url + * @param {string} redirectUrl - The redirect url value + * @param {Context} context - The context object value + * @returns Nothing + */ + private async updateRequestUrl(redirectUrl: string, context: MiddlewareContext): Promise { + context.request = typeof context.request === "string" ? redirectUrl : await cloneRequestWithNewUrl(redirectUrl, context.request as Request); + } + + /** + * @private + * To get the options for execution of the middleware + * @param {Context} context - The context object + * @returns A options for middleware execution + */ + private getOptions(context: MiddlewareContext): RedirectHandlerOptions { + let options: RedirectHandlerOptions; + if (context.middlewareOptions) { + options = context.middlewareOptions as RedirectHandlerOptions; + } + if (typeof options === "undefined") { + options = Object.assign(new RedirectHandlerOptions(), this.options); + } + return options; + } + + /** + * @private + * @async + * To execute the next middleware and to handle in case of redirect response returned by the server + * @param {Context} context - The context object + * @param {number} redirectCount - The redirect count value + * @param {RedirectHandlerOptions} options - The redirect handler options instance + * @returns A promise that resolves to nothing + */ + private async executeWithRedirect(context: MiddlewareContext, redirectCount: number, options: RedirectHandlerOptions): Promise { + await this.next.execute(context); + const response = context.response; + if (redirectCount < options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && options.shouldRedirect(response)) { + ++redirectCount; + if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { + context.options.method = HttpMethod.GET; + delete context.options.body; + } else { + const redirectUrl: string = this.getLocationHeader(response); + if (!this.isRelativeURL(redirectUrl) && this.shouldDropAuthorizationHeader(response.url, redirectUrl)) { + delete context.options.headers[RedirectHandler.AUTHORIZATION_HEADER]; + } + await this.updateRequestUrl(redirectUrl, context); + } + await this.executeWithRedirect(context, redirectCount, options); + } else { + return; + } + } + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The context object of the request + * @returns A Promise that resolves to nothing + */ + public async execute(context: MiddlewareContext): Promise { + const redirectCount = 0; + const options = this.getOptions(context); + context.options.redirect = RedirectHandler.MANUAL_REDIRECT; + return await this.executeWithRedirect(context, redirectCount, options); + } } diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts index f0ee5fe7d9..6880cb3cc5 100644 --- a/http/typescript/fetch/src/middlewares/retryHandler.ts +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -9,12 +9,11 @@ * @module RetryHandler */ -import { Context } from "../Context"; -import { FetchOptions } from "@microsoft/kiota-abstractions"; -import { HttpMethod} from "@microsoft/kiota-abstractions"; +import { MiddlewareContext } from "../middlewareContext"; +import { FetchOptions, HttpMethod } from "@microsoft/kiota-abstractions"; import { Middleware } from "./middleware"; import { getRequestHeader, setRequestHeader } from "./middlewareUtil"; -import { RetryHandlerOptions } from "./options/RetryHandlerOptions"; +import { RetryHandlerOptions } from "./options/retryHandlerOptions"; /** * @class @@ -49,9 +48,9 @@ export class RetryHandler implements Middleware { /** * @private - * A member to hold next middleware in the middleware chain + * The next middleware in the middleware chain */ - private nextMiddleware: Middleware; + next: Middleware; /** * @private @@ -113,9 +112,12 @@ export class RetryHandler implements Middleware { const retryAfter = response.headers !== undefined ? response.headers.get(RetryHandler.RETRY_AFTER_HEADER) : null; let newDelay: number; if (retryAfter !== null) { + + // Retry-After: if (Number.isNaN(Number(retryAfter))) { newDelay = Math.round((new Date(retryAfter).getTime() - Date.now()) / 1000); } else { + // Retry-After: newDelay = Number(retryAfter); } } else { @@ -147,7 +149,7 @@ export class RetryHandler implements Middleware { return new Promise((resolve) => setTimeout(resolve, delayMilliseconds)); } - private getOptions(context: Context): RetryHandlerOptions { + private getOptions(context: MiddlewareContext): RetryHandlerOptions { let options: RetryHandlerOptions; if (context.middlewareOptions) { options = context.middlewareOptions as RetryHandlerOptions; @@ -167,8 +169,8 @@ export class RetryHandler implements Middleware { * @param {RetryHandlerOptions} options - The retry middleware options instance * @returns A Promise that resolves to nothing */ - private async executeWithRetry(context: Context, retryAttempts: number, options: RetryHandlerOptions): Promise { - await this.nextMiddleware.execute(context); + private async executeWithRetry(context: MiddlewareContext, retryAttempts: number, options: RetryHandlerOptions): Promise { + await this.next.execute(context); if (retryAttempts < options.maxRetries && this.isRetry(context.response) && this.isBuffered(context.request, context.options) && options.shouldRetry(options.delay, retryAttempts, context.request, context.options, context.response)) { ++retryAttempts; setRequestHeader(context.request, context.options, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); @@ -187,19 +189,9 @@ export class RetryHandler implements Middleware { * @param {Context} context - The context object of the request * @returns A Promise that resolves to nothing */ - public async execute(context: Context): Promise { + public async execute(context: MiddlewareContext): Promise { const retryAttempts = 0; const options: RetryHandlerOptions = this.getOptions(context); return await this.executeWithRetry(context, retryAttempts, options); } - - /** - * @public - * To set the next middleware in the chain - * @param {Middleware} next - The middleware instance - * @returns Nothing - */ - public setNext(next: Middleware): void { - this.nextMiddleware = next; - } } From 454f0a62357e9947294c60124c01cbb935f0a738 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Sun, 26 Sep 2021 13:01:17 -0700 Subject: [PATCH 05/34] adding MiddlewareControl --- .../typescript/src/FetchInitOptions.ts | 36 ------ .../baseBearerTokenAuthenticationProvider.ts | 2 +- abstractions/typescript/src/index.ts | 3 +- abstractions/typescript/src/requestDetails.ts | 14 --- .../typescript/src/requestInformation.ts | 11 +- http/typescript/fetch/package-lock.json | 5 + http/typescript/fetch/package.json | 1 + .../typescript/fetch/src/fetchInit.ts | 0 http/typescript/fetch/src/httpClient.ts | 4 +- http/typescript/fetch/src/httpCore.ts | 108 +++++++++--------- .../src/middlewares/MiddlewareControl.ts | 64 +++++++++++ .../fetch/src/middlewares/fetchHandler.ts | 2 +- .../fetch/src/middlewares/middleware.ts | 2 +- .../{ => middlewares}/middlewareContext.ts | 8 +- .../fetch/src/middlewares/middlewareUtil.ts | 2 +- .../options/RetryHandlerOptions.ts | 2 +- .../fetch/src/middlewares/redirectHandler.ts | 6 +- .../fetch/src/middlewares/retryHandler.ts | 10 +- http/typescript/fetch/tsconfig.json | 84 +++++++++++--- package-lock.json | 3 + 20 files changed, 225 insertions(+), 142 deletions(-) delete mode 100644 abstractions/typescript/src/FetchInitOptions.ts delete mode 100644 abstractions/typescript/src/requestDetails.ts rename abstractions/typescript/src/fetchOptions.ts => http/typescript/fetch/src/fetchInit.ts (100%) create mode 100644 http/typescript/fetch/src/middlewares/MiddlewareControl.ts rename http/typescript/fetch/src/{ => middlewares}/middlewareContext.ts (74%) create mode 100644 package-lock.json diff --git a/abstractions/typescript/src/FetchInitOptions.ts b/abstractions/typescript/src/FetchInitOptions.ts deleted file mode 100644 index b866f92cc0..0000000000 --- a/abstractions/typescript/src/FetchInitOptions.ts +++ /dev/null @@ -1,36 +0,0 @@ - - -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @interface {@link https://github.com/bitinn/node-fetch/#options} - * Signature to define the fetch request options for node environment - * @property {number} [follow] - node-fetch option: maximum redirect count. 0 to not follow redirect - * @property {number} [compress] - node-fetch option: support gzip/deflate content encoding. false to disable - * @property {number} [size] - node-fetch option: maximum response body size in bytes. 0 to disable - * @property {any} [agent] - node-fetch option: HTTP(S).Agent instance, allows custom proxy, certificate, lookup, family etc. - * @property {number} [highWaterMark] - node-fetch option: maximum number of bytes to store in the internal buffer before ceasing to read from the underlying resource. - * @property {boolean} [insecureHTTPParser] - node-fetch option: use an insecure HTTP parser that accepts invalid HTTP headers when `true`. - */ - export interface NodeFetchInit { - follow?: number; - compress?: boolean; - size?: number; - agent?: any; - highWaterMark?: number; - insecureHTTPParser?: boolean; -} - -/** - * @interface - * Signature to define the fetch api options which includes both fetch standard options and also the extended node fetch options - * @extends RequestInit @see {@link https://fetch.spec.whatwg.org/#requestinit} - * @extends NodeFetchInit - */ -export interface FetchInitOptions extends RequestInit, NodeFetchInit { -} diff --git a/abstractions/typescript/src/authentication/baseBearerTokenAuthenticationProvider.ts b/abstractions/typescript/src/authentication/baseBearerTokenAuthenticationProvider.ts index 10aa15658c..0dc9d9c4c4 100644 --- a/abstractions/typescript/src/authentication/baseBearerTokenAuthenticationProvider.ts +++ b/abstractions/typescript/src/authentication/baseBearerTokenAuthenticationProvider.ts @@ -14,7 +14,7 @@ export abstract class BaseBearerTokenAuthenticationProvider implements Authentic throw new Error('Could not get an authorization token'); } if(!request.headers) { - request.headers = new Map(); + //request.headers = new Map(); } request.headers?.set(BaseBearerTokenAuthenticationProvider.authorizationHeaderKey, `Bearer ${token}`); } diff --git a/abstractions/typescript/src/index.ts b/abstractions/typescript/src/index.ts index 24ae97c877..1120333d82 100644 --- a/abstractions/typescript/src/index.ts +++ b/abstractions/typescript/src/index.ts @@ -9,5 +9,4 @@ export * from "./nativeResponseWrapper"; export * from './serialization'; export * from './utils'; export * from './store'; -export * from './middlewareOption'; -export * from './FetchInitOptions'; \ No newline at end of file +export * from './middlewareOption'; \ No newline at end of file diff --git a/abstractions/typescript/src/requestDetails.ts b/abstractions/typescript/src/requestDetails.ts deleted file mode 100644 index a106369c06..0000000000 --- a/abstractions/typescript/src/requestDetails.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { HttpMethod } from "./httpMethod"; -import { ReadableStream } from 'web-streams-polyfill/es2018'; -import { MiddlewareOption } from "./middlewareOption"; - -export interface RequestDetails{ - /** The HTTP method for the request */ - httpMethod?: HttpMethod; - /** The Request Body. */ - content?: ReadableStream; - /** The Query Parameters of the request. */ - queryParameters: Map = new Map(); //TODO: case insensitive - /** The Request Headers. */ - headers: HeadersInit //TODO: case insensitive -} diff --git a/abstractions/typescript/src/requestInformation.ts b/abstractions/typescript/src/requestInformation.ts index c4cb1bf5e2..f1342b9049 100644 --- a/abstractions/typescript/src/requestInformation.ts +++ b/abstractions/typescript/src/requestInformation.ts @@ -3,13 +3,11 @@ import { ReadableStream } from 'web-streams-polyfill/es2018'; import { Parsable } from "./serialization"; import { HttpCore } from "./httpCore"; import { MiddlewareOption } from "./middlewareOption"; -import { RequestDetails } from "./requestDetails"; -import { FetchOptions } from "./FetchInitOptions"; /** This class represents an abstract HTTP request. */ -export class RequestInformation implements RequestDetails{ +export class RequestInformation{ /** The URI of the request. */ - public URI?: RequestInfo; + public URI?: string; /** * Sets the URI of the request. * @param currentPath the current path (scheme, host, port, path, query parameters) of the request. @@ -45,9 +43,8 @@ export class RequestInformation implements RequestDetails{ public queryParameters: Map = new Map(); //TODO: case insensitive /** The Request Headers. */ public headers: Headers = new Headers(); //TODO: case insensitive - - - public options?: FetchOptions; + + public options?: Map; private _middlewareOptions = new Map(); //TODO: case insensitive /** Gets the middleware options for the request. */ diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index 4468738759..adc772b7a0 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -75,6 +75,11 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, "typescript": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index 3e5c4e31a0..d72cb732e1 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -32,6 +32,7 @@ "@microsoft/kiota-abstractions": "file:../../../abstractions/typescript", "@types/node-fetch": "^3.0.3", "cross-fetch": "^3.1.4", + "tslib": "^2.3.1", "web-streams-polyfill": "^3.1.1" }, "devDependencies": { diff --git a/abstractions/typescript/src/fetchOptions.ts b/http/typescript/fetch/src/fetchInit.ts similarity index 100% rename from abstractions/typescript/src/fetchOptions.ts rename to http/typescript/fetch/src/fetchInit.ts diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index 5d44b82269..cbe600b139 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -1,11 +1,11 @@ import { Middleware } from "./middlewares/middleware"; -import { MiddlewareContext } from "./middlewareContext"; +import { MiddlewareContext } from "./middlewares/middlewareContext"; import { FetchHandler } from "./middlewares/fetchHandler"; import { MiddlewareFactory } from "./middlewares/middlewareFactory"; /** Default fetch client with options and a middleware pipleline for requests execution. */ export class HttpClient { - private middleware: Middleware + private middleware: Middleware; /** * Instantiates a new HttpClient. * @param middlewares middlewares to be used for requests execution. diff --git a/http/typescript/fetch/src/httpCore.ts b/http/typescript/fetch/src/httpCore.ts index a3234849a7..b2130acd64 100644 --- a/http/typescript/fetch/src/httpCore.ts +++ b/http/typescript/fetch/src/httpCore.ts @@ -1,9 +1,11 @@ import { AuthenticationProvider, BackingStoreFactory, BackingStoreFactorySingleton, HttpCore as IHttpCore, Parsable, ParseNodeFactory, RequestInformation, ResponseHandler, ParseNodeFactoryRegistry, enableBackingStoreForParseNodeFactory, SerializationWriterFactoryRegistry, enableBackingStoreForSerializationWriterFactory, SerializationWriterFactory } from '@microsoft/kiota-abstractions'; -import { ReadableStream } from 'web-streams-polyfill'; +import { ReadableStream } from 'web-streams-polyfill/es2018'; import { URLSearchParams } from 'url'; import { HttpClient } from './httpClient'; +import {Headers as crossHeaders} from "cross-fetch" + +import { MiddlewareContext } from './middlewares/middlewareContext'; -import { MiddlewareContext } from './middlewareContext'; export class HttpCore implements IHttpCore { public getSerializationWriterFactory(): SerializationWriterFactory { return this.serializationWriterFactory; @@ -16,86 +18,83 @@ export class HttpCore implements IHttpCore { * @param httpClient the http client to use to execute requests. */ public constructor(public readonly authenticationProvider: AuthenticationProvider, private parseNodeFactory: ParseNodeFactory = ParseNodeFactoryRegistry.defaultInstance, private serializationWriterFactory: SerializationWriterFactory = SerializationWriterFactoryRegistry.defaultInstance, private readonly httpClient: HttpClient = new HttpClient()) { - if(!authenticationProvider) { + if (!authenticationProvider) { throw new Error('authentication provider cannot be null'); } - if(!parseNodeFactory) { + if (!parseNodeFactory) { throw new Error('parse node factory cannot be null'); } - if(!serializationWriterFactory) { + if (!serializationWriterFactory) { throw new Error('serialization writer factory cannot be null'); } - if(!httpClient) { + if (!httpClient) { throw new Error('http client cannot be null'); } } private getResponseContentType = (response: Response): string | undefined => { const header = response.headers.get("content-type")?.toLowerCase(); - if(!header) return undefined; + if (!header) return undefined; const segments = header.split(';'); - if(segments.length === 0) return undefined; + if (segments.length === 0) return undefined; else return segments[0]; } - public sendCollectionAsync = async (requestInfo: RequestInformation, type: new() => ModelType, responseHandler: ResponseHandler | undefined): Promise => { - if(!requestInfo) { + public sendCollectionAsync = async (requestInfo: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInfo) { throw new Error('requestInfo cannot be null'); } await this.authenticationProvider.authenticateRequest(requestInfo); - - const request = this.getRequestFromRequestInformation(requestInfo); + const response = await this.httpClient.executeFetch(this.createContext(requestInfo)); - if(responseHandler) { + if (responseHandler) { return await responseHandler.handleResponseAsync(response); } else { const payload = await response.arrayBuffer(); const responseContentType = this.getResponseContentType(response); - if(!responseContentType) + if (!responseContentType) throw new Error("no response content type found for deserialization"); - + const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); const result = rootNode.getCollectionOfObjectValues(type); return result as unknown as ModelType[]; } } - public sendAsync = async (requestInfo: RequestInformation, type: new() => ModelType, responseHandler: ResponseHandler | undefined): Promise => { - if(!requestInfo) { + public sendAsync = async (requestInfo: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInfo) { throw new Error('requestInfo cannot be null'); } await this.authenticationProvider.authenticateRequest(requestInfo); - - const request = this.getRequestFromRequestInformation(requestInfo); + const response = await this.httpClient.executeFetch(this.createContext(requestInfo)); - if(responseHandler) { + if (responseHandler) { return await responseHandler.handleResponseAsync(response); } else { const payload = await response.arrayBuffer(); const responseContentType = this.getResponseContentType(response); - if(!responseContentType) + if (!responseContentType) throw new Error("no response content type found for deserialization"); - + const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); const result = rootNode.getObjectValue(type); return result as unknown as ModelType; } } public sendPrimitiveAsync = async (requestInfo: RequestInformation, responseType: "string" | "number" | "boolean" | "Date" | "ReadableStream", responseHandler: ResponseHandler | undefined): Promise => { - if(!requestInfo) { + if (!requestInfo) { throw new Error('requestInfo cannot be null'); } await this.authenticationProvider.authenticateRequest(requestInfo); - - const request = this.getRequestFromRequestInformation(requestInfo); + const response = await this.httpClient.executeFetch(this.createContext(requestInfo)); - if(responseHandler) { + if (responseHandler) { return await responseHandler.handleResponseAsync(response); } else { - switch(responseType) { + switch (responseType) { case "ReadableStream": - const buffer = await response.arrayBuffer(); + const buffer = await response.arrayBuffer(); let bufferPulled = false; const stream = new ReadableStream({ pull: (controller) => { - if(!bufferPulled) { + if (!bufferPulled) { controller.enqueue(buffer.slice(0)) bufferPulled = true; } @@ -108,15 +107,15 @@ export class HttpCore implements IHttpCore { case 'Date': const payload = await response.arrayBuffer(); const responseContentType = this.getResponseContentType(response); - if(!responseContentType) + if (!responseContentType) throw new Error("no response content type found for deserialization"); - + const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); - if(responseType === 'string') { + if (responseType === 'string') { return rootNode.getStringValue() as unknown as ResponseType; } else if (responseType === 'number') { return rootNode.getNumberValue() as unknown as ResponseType; - } else if(responseType === 'boolean') { + } else if (responseType === 'boolean') { return rootNode.getBooleanValue() as unknown as ResponseType; } else if (responseType === 'Date') { return rootNode.getDateValue() as unknown as ResponseType; @@ -127,38 +126,44 @@ export class HttpCore implements IHttpCore { } } public sendNoResponseContentAsync = async (requestInfo: RequestInformation, responseHandler: ResponseHandler | undefined): Promise => { - if(!requestInfo) { + if (!requestInfo) { throw new Error('requestInfo cannot be null'); } await this.authenticationProvider.authenticateRequest(requestInfo); - - const request = this.getRequestFromRequestInformation(requestInfo); const response = await this.httpClient.executeFetch(this.createContext(requestInfo)); - if(responseHandler) { + if (responseHandler) { return await responseHandler.handleResponseAsync(response); } } public enableBackingStore = (backingStoreFactory?: BackingStoreFactory | undefined): void => { this.parseNodeFactory = enableBackingStoreForParseNodeFactory(this.parseNodeFactory); this.serializationWriterFactory = enableBackingStoreForSerializationWriterFactory(this.serializationWriterFactory); - if(!this.serializationWriterFactory || !this.parseNodeFactory) + if (!this.serializationWriterFactory || !this.parseNodeFactory) throw new Error("unable to enable backing store"); - if(backingStoreFactory) { + if (backingStoreFactory) { BackingStoreFactorySingleton.instance = backingStoreFactory; } } private getRequestFromRequestInformation = (requestInfo: RequestInformation): RequestInit => { - const request :RequestInit = { + const request = { method: requestInfo.httpMethod?.toString(), - headers: new Headers(), + headers: new crossHeaders(), body: requestInfo.content, - } + } as RequestInit; + requestInfo.headers?.forEach((v, k) => (request.headers as Headers).set(k, v)); + + requestInfo.options?.forEach((v, k) => { + if (k in request) { + request[k] = v; + } + } + ); return request; } - private getRequestUrl = (requestInfo: RequestInformation) : string => { + private getRequestUrl (requestInfo: RequestInformation): string { let url = requestInfo.URI ?? ''; - if(requestInfo.queryParameters?.size ?? -1 > 0) { + if (requestInfo.queryParameters?.size ?? -1 > 0) { const queryParametersBuilder = new URLSearchParams(); requestInfo.queryParameters?.forEach((v, k) => { queryParametersBuilder.append(k, `${v}`); @@ -168,14 +173,15 @@ export class HttpCore implements IHttpCore { return url; } - private createContext (requestInformation : RequestInformation): MiddlewareContext{ + private createContext(requestInformation: RequestInformation): MiddlewareContext { - const context:MiddlewareContext = { - request: this.getRequestUrl(requestInformation), - options: requestInformation.headers, - middlewareOptions: requestInformation.getMiddlewareOptions() + const url = this.getRequestUrl(requestInformation); + const context: MiddlewareContext = { + request: url, + options: this.getRequestFromRequestInformation(requestInformation), + //middlewareControl //set from middleware options } return context; - } -} \ No newline at end of file + } +} diff --git a/http/typescript/fetch/src/middlewares/MiddlewareControl.ts b/http/typescript/fetch/src/middlewares/MiddlewareControl.ts new file mode 100644 index 0000000000..2cce4b8875 --- /dev/null +++ b/http/typescript/fetch/src/middlewares/MiddlewareControl.ts @@ -0,0 +1,64 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module MiddlewareControl + */ + +import { MiddlewareOption } from "./options/middlewareOption"; + +/** + * @class + * Class representing MiddlewareControl + */ +export class MiddlewareControl { + /** + * @private + * A member holding map of MiddlewareOptions + */ + private middlewareOptions: Map; + + /** + * @public + * @constructor + * Creates an instance of MiddlewareControl + * @param {MiddlewareOptions[]} [middlewareOptions = []] - The array of middlewareOptions + * @returns The instance of MiddlewareControl + */ + public constructor(middlewareOptions: MiddlewareOption[] = []) { + this.middlewareOptions = new Map(); + for (const option of middlewareOptions) { + const fn = option.constructor; + this.middlewareOptions.set(fn, option); + } + } + + /** + * @public + * To get the middleware option using the class of the option + * @param {Function} fn - The class of the strongly typed option class + * @returns The middleware option + * @example + * // if you wanted to return the middleware option associated with this class (MiddlewareControl) + * // call this function like this: + * getMiddlewareOptions(MiddlewareControl) + */ + public getMiddlewareOptions(fn: Function): MiddlewareOption { + return this.middlewareOptions.get(fn); + } + + /** + * @public + * To set the middleware options using the class of the option + * @param {Function} fn - The class of the strongly typed option class + * @param {MiddlewareOptions} option - The strongly typed middleware option + * @returns nothing + */ + public setMiddlewareOptions(fn: Function, option: MiddlewareOption): void { + this.middlewareOptions.set(fn, option); + } +} diff --git a/http/typescript/fetch/src/middlewares/fetchHandler.ts b/http/typescript/fetch/src/middlewares/fetchHandler.ts index fb05a4d909..b044a92e10 100644 --- a/http/typescript/fetch/src/middlewares/fetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/fetchHandler.ts @@ -10,7 +10,7 @@ */ import fetch from "cross-fetch"; -import { MiddlewareContext } from "../middlewareContext"; +import { MiddlewareContext } from "./middlewareContext"; import { Middleware } from "./middleware"; /** diff --git a/http/typescript/fetch/src/middlewares/middleware.ts b/http/typescript/fetch/src/middlewares/middleware.ts index 8db15b54de..4688373a90 100644 --- a/http/typescript/fetch/src/middlewares/middleware.ts +++ b/http/typescript/fetch/src/middlewares/middleware.ts @@ -1,4 +1,4 @@ -import { MiddlewareContext } from "../middlewareContext"; +import { MiddlewareContext } from "./middlewareContext"; /** Defines the contract for a middleware in the request execution pipeline. */ export interface Middleware { diff --git a/http/typescript/fetch/src/middlewareContext.ts b/http/typescript/fetch/src/middlewares/middlewareContext.ts similarity index 74% rename from http/typescript/fetch/src/middlewareContext.ts rename to http/typescript/fetch/src/middlewares/middlewareContext.ts index f127ba1bd5..185fe52e87 100644 --- a/http/typescript/fetch/src/middlewareContext.ts +++ b/http/typescript/fetch/src/middlewares/middlewareContext.ts @@ -1,5 +1,5 @@ -import { MiddlewareOption } from "@microsoft/kiota-abstractions"; -import { FetchOptions } from "../fetchOptions"; +import { FetchOptions } from "../fetchInit"; +import { MiddlewareControl } from "./MiddlewareControl"; /** * @interface @@ -12,8 +12,8 @@ import { FetchOptions } from "../fetchOptions"; */ export interface MiddlewareContext { - request?:RequestInfo, + request:RequestInfo, response?: Response, options?:FetchOptions, - middlewareOptions?: MiddlewareOption + middlewareControl?: MiddlewareControl } \ No newline at end of file diff --git a/http/typescript/fetch/src/middlewares/middlewareUtil.ts b/http/typescript/fetch/src/middlewares/middlewareUtil.ts index 35f32fb696..f914f7663d 100644 --- a/http/typescript/fetch/src/middlewares/middlewareUtil.ts +++ b/http/typescript/fetch/src/middlewares/middlewareUtil.ts @@ -9,7 +9,7 @@ * @module MiddlewareUtil */ -import { FetchOptions } from "@microsoft/kiota-abstractions"; +import { FetchOptions } from "../fetchInit"; /** * @constant diff --git a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts index 2941710d52..cde2e17427 100644 --- a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts +++ b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts @@ -9,7 +9,7 @@ * @module RetryHandlerOptions */ -import { FetchOptions } from "@microsoft/kiota-abstractions"; +import { FetchOptions } from "../../fetchInit"; import { MiddlewareOption } from "./middlewareOption"; /** diff --git a/http/typescript/fetch/src/middlewares/redirectHandler.ts b/http/typescript/fetch/src/middlewares/redirectHandler.ts index bececbfb83..9d2ca6aa2f 100644 --- a/http/typescript/fetch/src/middlewares/redirectHandler.ts +++ b/http/typescript/fetch/src/middlewares/redirectHandler.ts @@ -10,7 +10,7 @@ */ import { HttpMethod } from "@microsoft/kiota-abstractions"; -import { MiddlewareContext } from "../middlewareContext"; +import { MiddlewareContext } from "./middlewareContext"; import { Middleware } from "./middleware"; import { cloneRequestWithNewUrl } from "./middlewareUtil"; import { RedirectHandlerOptions } from "./options/redirectHandlerOption"; @@ -160,8 +160,8 @@ export class RedirectHandler implements Middleware { */ private getOptions(context: MiddlewareContext): RedirectHandlerOptions { let options: RedirectHandlerOptions; - if (context.middlewareOptions) { - options = context.middlewareOptions as RedirectHandlerOptions; + if (context.middlewareControl) { + options = context.middlewareControl.getMiddlewareOptions(RedirectHandlerOptions) as RedirectHandlerOptions; } if (typeof options === "undefined") { options = Object.assign(new RedirectHandlerOptions(), this.options); diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts index 6880cb3cc5..db867efad8 100644 --- a/http/typescript/fetch/src/middlewares/retryHandler.ts +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -9,11 +9,13 @@ * @module RetryHandler */ -import { MiddlewareContext } from "../middlewareContext"; -import { FetchOptions, HttpMethod } from "@microsoft/kiota-abstractions"; +import { MiddlewareContext } from "./middlewareContext"; +import { HttpMethod } from "@microsoft/kiota-abstractions"; +import { FetchOptions } from "../fetchInit"; import { Middleware } from "./middleware"; import { getRequestHeader, setRequestHeader } from "./middlewareUtil"; import { RetryHandlerOptions } from "./options/retryHandlerOptions"; +import { MiddlewareControl } from "./MiddlewareControl"; /** * @class @@ -151,8 +153,8 @@ export class RetryHandler implements Middleware { private getOptions(context: MiddlewareContext): RetryHandlerOptions { let options: RetryHandlerOptions; - if (context.middlewareOptions) { - options = context.middlewareOptions as RetryHandlerOptions; + if (context.middlewareControl instanceof MiddlewareControl) { + options = context.middlewareControl.getMiddlewareOptions(RetryHandlerOptions) as RetryHandlerOptions; } if (typeof options === "undefined") { options = Object.assign(new RetryHandlerOptions(), this.options); diff --git a/http/typescript/fetch/tsconfig.json b/http/typescript/fetch/tsconfig.json index cf3e305f3b..8d419f91ed 100644 --- a/http/typescript/fetch/tsconfig.json +++ b/http/typescript/fetch/tsconfig.json @@ -1,15 +1,71 @@ { - "compilerOptions": { - "module": "CommonJS", - "esModuleInterop": true, - "target": "es5", - "moduleResolution": "node", - "downlevelIteration": true, - "allowSyntheticDefaultImports": true, - "outDir": "dist", - "lib": ["es2020", "DOM"], - "declaration": true - }, - "exclude": ["node_modules"], - -} \ No newline at end of file + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + "incremental": true, /* Enable incremental compilation */ + "target": "es2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ + "module": "es2020", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + "lib": [ "ES2015", "ES2016", "ES2017", "ES2018", "ES2019", "ES2020"], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./dist", /* Redirect output structure to the directory. */ + "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + "noImplicitAny": false, /* Raise error on expressions and declarations with an implied 'any' type. */ + "strictNullChecks": false, /* Enable strict null checks. */ + "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + "noUnusedLocals": true, /* Report errors on unused locals. */ + "noUnusedParameters": true, /* Report errors on unused parameters. */ + "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + + /* Module Resolution Options */ + "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true, /* Skip type checking of declaration files. */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + } + } + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..48e341a095 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3 @@ +{ + "lockfileVersion": 1 +} From 152892152ade6dab96338b9362aab407fd3b4fc9 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Sun, 3 Oct 2021 19:49:14 -0700 Subject: [PATCH 06/34] adding shims --- abstractions/typescript/package-lock.json | 11 --- abstractions/typescript/package.json | 4 +- .../typescript/src/requestInformation.ts | 3 +- .../src/serialization/serializationWriter.ts | 2 +- abstractions/typescript/src/utils/shims.ts | 5 + abstractions/typescript/tsconfig.json | 42 ++------ http/typescript/fetch/package-lock.json | 9 +- http/typescript/fetch/package.json | 84 ++++++++-------- http/typescript/fetch/src/fetchInit.ts | 35 ------- http/typescript/fetch/src/httpCore.ts | 15 +-- .../src/middlewares/middlewareContext.ts | 5 +- .../fetch/src/middlewares/middlewareUtil.ts | 14 ++- .../options/RetryHandlerOptions.ts | 3 +- .../fetch/src/middlewares/retryHandler.ts | 5 +- http/typescript/fetch/tsconfig.json | 98 ++++++------------- http/typescript/package-lock.json | 3 + package-lock.json | 10 +- 17 files changed, 119 insertions(+), 229 deletions(-) create mode 100644 abstractions/typescript/src/utils/shims.ts delete mode 100644 http/typescript/fetch/src/fetchInit.ts create mode 100644 http/typescript/package-lock.json diff --git a/abstractions/typescript/package-lock.json b/abstractions/typescript/package-lock.json index 85aa357b00..5615502fb4 100644 --- a/abstractions/typescript/package-lock.json +++ b/abstractions/typescript/package-lock.json @@ -4,12 +4,6 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@types/node": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", - "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==", - "dev": true - }, "@types/uuid": { "version": "8.3.1", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", @@ -26,11 +20,6 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "web-streams-polyfill": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.1.tgz", - "integrity": "sha512-Czi3fG883e96T4DLEPRvufrF2ydhOOW1+1a6c3gNjH2aIh50DNFBdfwh2AKoOf1rXvpvavAoA11Qdq9+BKjE0Q==" } } } diff --git a/abstractions/typescript/package.json b/abstractions/typescript/package.json index 9db49aa5ab..47fd08b3ab 100644 --- a/abstractions/typescript/package.json +++ b/abstractions/typescript/package.json @@ -23,7 +23,6 @@ }, "homepage": "https://github.com/microsoft/kiota#readme", "devDependencies": { - "@types/node": "^16.10.2", "@types/uuid": "^8.3.1", "typescript": "^4.4.3" }, @@ -31,7 +30,6 @@ "registry": "https://npm.pkg.github.com" }, "dependencies": { - "uuid": "^8.3.2", - "web-streams-polyfill": "^3.1.1" + "uuid": "^8.3.2" } } diff --git a/abstractions/typescript/src/requestInformation.ts b/abstractions/typescript/src/requestInformation.ts index f1342b9049..2ba87e51f1 100644 --- a/abstractions/typescript/src/requestInformation.ts +++ b/abstractions/typescript/src/requestInformation.ts @@ -1,5 +1,4 @@ import { HttpMethod } from "./httpMethod"; -import { ReadableStream } from 'web-streams-polyfill/es2018'; import { Parsable } from "./serialization"; import { HttpCore } from "./httpCore"; import { MiddlewareOption } from "./middlewareOption"; @@ -44,7 +43,7 @@ export class RequestInformation{ /** The Request Headers. */ public headers: Headers = new Headers(); //TODO: case insensitive - public options?: Map; + public options?: Map = new Map(); private _middlewareOptions = new Map(); //TODO: case insensitive /** Gets the middleware options for the request. */ diff --git a/abstractions/typescript/src/serialization/serializationWriter.ts b/abstractions/typescript/src/serialization/serializationWriter.ts index 19db279731..1ac7eba86a 100644 --- a/abstractions/typescript/src/serialization/serializationWriter.ts +++ b/abstractions/typescript/src/serialization/serializationWriter.ts @@ -1,5 +1,4 @@ import { Parsable } from "./parsable"; -import { ReadableStream } from 'web-streams-polyfill/es2018'; /** Defines an interface for serialization of objects to a stream. */ export interface SerializationWriter { @@ -67,6 +66,7 @@ export interface SerializationWriter { * @return the value of the serialized content. */ getSerializedContent(): ReadableStream; + /** * Writes the specified additional data values to the stream with an optional given key. * @param value the values to write to the stream. diff --git a/abstractions/typescript/src/utils/shims.ts b/abstractions/typescript/src/utils/shims.ts new file mode 100644 index 0000000000..1d4141ed47 --- /dev/null +++ b/abstractions/typescript/src/utils/shims.ts @@ -0,0 +1,5 @@ +interface Request {}; +interface RequestInit {}; +interface Response {}; +interface Headers {}; +//interface ReadableStream{}; \ No newline at end of file diff --git a/abstractions/typescript/tsconfig.json b/abstractions/typescript/tsconfig.json index 5eb00c7578..9e71b60250 100644 --- a/abstractions/typescript/tsconfig.json +++ b/abstractions/typescript/tsconfig.json @@ -7,23 +7,11 @@ "target": "es2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ "module": "es2020", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ "lib": [ "ES2015", "ES2016", "ES2017", "ES2018", "ES2019", "ES2020", "DOM"], /* Specify library files to be included in the compilation. */ - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ "outDir": "./dist", /* Redirect output structure to the directory. */ "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - // "composite": true, /* Enable project compilation */ - // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ - // "removeComments": true, /* Do not emit comments to output. */ - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - + /* Strict Type-Checking Options */ "strict": true, /* Enable all strict type-checking options. */ "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ @@ -43,28 +31,14 @@ /* Module Resolution Options */ "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "types": [], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - - /* Source Map Options */ - // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - /* Advanced Options */ "skipLibCheck": true, /* Skip type checking of declaration files. */ - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ - } + "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ + }, + "include": [ + //"./src/utils/shims.ts", + "./src" + ], + "exclude": ["node_modules"] } diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index adc772b7a0..8d81e01dc2 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -7,8 +7,7 @@ "@microsoft/kiota-abstractions": { "version": "file:../../../abstractions/typescript", "requires": { - "uuid": "^8.3.2", - "web-streams-polyfill": "^3.1.1" + "uuid": "^8.3.2" }, "dependencies": { "@types/lodash": { @@ -49,9 +48,9 @@ } }, "@types/node": { - "version": "16.9.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.4.tgz", - "integrity": "sha512-KDazLNYAGIuJugdbULwFZULF9qQ13yNWEBFnfVpqlpgAAo6H/qnM9RjBgh0A0kmHf3XxAKLdN5mTIng9iUvVLA==", + "version": "16.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", + "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==", "dev": true }, "@types/node-fetch": { diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index d3b610ab65..fc2798e8f9 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -1,42 +1,46 @@ { - "name": "@microsoft/kiota-http-fetch", - "version": "1.0.8", - "description": "Kiota HttpCore implementation with fetch", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "build": "tsc -p tsconfig.json", - "test": "echo \"Error: no test specified\" && exit 1", - "clean": "rm -r ./dist" - }, - "repository": { - "type": "git", - "url": "git://github.com/microsoft/kiota.git" - }, - "keywords": [ - "Kiota", - "OpenAPI", - "HTTP", - "fetch" - ], - "author": "Microsoft", - "license": "MIT", - "bugs": { - "url": "https://github.com/microsoft/kiota/issues" - }, - "homepage": "https://github.com/microsoft/kiota#readme", - "publishConfig": { - "registry": "https://npm.pkg.github.com" - }, - "dependencies": { - "@microsoft/kiota-abstractions": "file:../../../abstractions/typescript", - "@types/node-fetch": "^3.0.3", - "cross-fetch": "^3.1.4", - "tslib": "^2.3.1", - "web-streams-polyfill": "^3.1.1" - }, - "devDependencies": { - "@types/node": "^16.10.2", - "typescript": "^4.4.3" - } + "name": "@microsoft/kiota-http-fetch", + "version": "1.0.8", + "description": "Kiota HttpCore implementation with fetch", + "main": "dist/index.js", + "files": [ + "dist/", + "src/" + ], + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc -p tsconfig.json", + "test": "echo \"Error: no test specified\" && exit 1", + "clean": "rm -r ./dist" + }, + "repository": { + "type": "git", + "url": "git://github.com/microsoft/kiota.git" + }, + "keywords": [ + "Kiota", + "OpenAPI", + "HTTP", + "fetch" + ], + "author": "Microsoft", + "license": "MIT", + "bugs": { + "url": "https://github.com/microsoft/kiota/issues" + }, + "homepage": "https://github.com/microsoft/kiota#readme", + "publishConfig": { + "registry": "https://npm.pkg.github.com" + }, + "dependencies": { + "@microsoft/kiota-abstractions": "file:../../../abstractions/typescript", + "@types/node-fetch": "^3.0.3", + "cross-fetch": "^3.1.4", + "tslib": "^2.3.1", + "web-streams-polyfill": "^3.1.1" + }, + "devDependencies": { + "@types/node": "^16.10.2", + "typescript": "^4.4.3" + } } diff --git a/http/typescript/fetch/src/fetchInit.ts b/http/typescript/fetch/src/fetchInit.ts deleted file mode 100644 index 5777c64596..0000000000 --- a/http/typescript/fetch/src/fetchInit.ts +++ /dev/null @@ -1,35 +0,0 @@ - - -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @interface {@link https://github.com/bitinn/node-fetch/#options} - * Signature to define the fetch request options for node environment - * @property {number} [follow] - node-fetch option: maximum redirect count. 0 to not follow redirect - * @property {number} [compress] - node-fetch option: support gzip/deflate content encoding. false to disable - * @property {number} [size] - node-fetch option: maximum response body size in bytes. 0 to disable - * @property {any} [agent] - node-fetch option: HTTP(S).Agent instance, allows custom proxy, certificate, lookup, family etc. - * @property {number} [highWaterMark] - node-fetch option: maximum number of bytes to store in the internal buffer before ceasing to read from the underlying resource. - * @property {boolean} [insecureHTTPParser] - node-fetch option: use an insecure HTTP parser that accepts invalid HTTP headers when `true`. - */ - export interface NodeFetchInit { - follow?: number; - compress?: boolean; - size?: number; - agent?: any; - highWaterMark?: number; - insecureHTTPParser?: boolean; -} - -/** - * @interface - * Signature to define the fetch api options which includes both fetch standard options and also the extended node fetch options - * @extends RequestInit @see {@link https://fetch.spec.whatwg.org/#requestinit} - * @extends NodeFetchInit - */ -export interface FetchOptions extends RequestInit, NodeFetchInit {} diff --git a/http/typescript/fetch/src/httpCore.ts b/http/typescript/fetch/src/httpCore.ts index b2130acd64..4f78a84dd0 100644 --- a/http/typescript/fetch/src/httpCore.ts +++ b/http/typescript/fetch/src/httpCore.ts @@ -1,5 +1,4 @@ import { AuthenticationProvider, BackingStoreFactory, BackingStoreFactorySingleton, HttpCore as IHttpCore, Parsable, ParseNodeFactory, RequestInformation, ResponseHandler, ParseNodeFactoryRegistry, enableBackingStoreForParseNodeFactory, SerializationWriterFactoryRegistry, enableBackingStoreForSerializationWriterFactory, SerializationWriterFactory } from '@microsoft/kiota-abstractions'; -import { ReadableStream } from 'web-streams-polyfill/es2018'; import { URLSearchParams } from 'url'; import { HttpClient } from './httpClient'; import {Headers as crossHeaders} from "cross-fetch" @@ -90,17 +89,7 @@ export class HttpCore implements IHttpCore { } else { switch (responseType) { case "ReadableStream": - const buffer = await response.arrayBuffer(); - let bufferPulled = false; - const stream = new ReadableStream({ - pull: (controller) => { - if (!bufferPulled) { - controller.enqueue(buffer.slice(0)) - bufferPulled = true; - } - }, - }); - return stream as unknown as ResponseType; + return response.body as unknown as ResponseType; case 'string': case 'number': case 'boolean': @@ -147,10 +136,10 @@ export class HttpCore implements IHttpCore { private getRequestFromRequestInformation = (requestInfo: RequestInformation): RequestInit => { const request = { method: requestInfo.httpMethod?.toString(), - headers: new crossHeaders(), body: requestInfo.content, } as RequestInit; + const headers: string[][] = []; requestInfo.headers?.forEach((v, k) => (request.headers as Headers).set(k, v)); requestInfo.options?.forEach((v, k) => { diff --git a/http/typescript/fetch/src/middlewares/middlewareContext.ts b/http/typescript/fetch/src/middlewares/middlewareContext.ts index 185fe52e87..76161a9897 100644 --- a/http/typescript/fetch/src/middlewares/middlewareContext.ts +++ b/http/typescript/fetch/src/middlewares/middlewareContext.ts @@ -1,10 +1,9 @@ -import { FetchOptions } from "../fetchInit"; import { MiddlewareControl } from "./MiddlewareControl"; /** * @interface * @property {RequestInfo} request - The request url string or the Request instance - * @property {FetchOptions} [options] - The options for the request + * @property {RequestInit} [options] - The options for the request * @property {Response} [response] - The response content * @property {MiddlewareControl} [middlewareControl] - The options for the middleware chain * @property {Set}[customHosts] - A set of custom host names. Should contain hostnames only. @@ -14,6 +13,6 @@ import { MiddlewareControl } from "./MiddlewareControl"; export interface MiddlewareContext { request:RequestInfo, response?: Response, - options?:FetchOptions, + options?:RequestInit, middlewareControl?: MiddlewareControl } \ No newline at end of file diff --git a/http/typescript/fetch/src/middlewares/middlewareUtil.ts b/http/typescript/fetch/src/middlewares/middlewareUtil.ts index f914f7663d..44f4205e19 100644 --- a/http/typescript/fetch/src/middlewares/middlewareUtil.ts +++ b/http/typescript/fetch/src/middlewares/middlewareUtil.ts @@ -9,17 +9,15 @@ * @module MiddlewareUtil */ -import { FetchOptions } from "../fetchInit"; - /** * @constant * To get the request header from the request * @param {RequestInfo} request - The request object or the url string - * @param {FetchOptions|undefined} options - The request options object + * @param {RequestInit|undefined} options - The request options object * @param {string} key - The header key string * @returns A header value for the given key from the request */ -export const getRequestHeader = (request: RequestInfo, options: FetchOptions | undefined, key: string): string | null => { +export const getRequestHeader = (request: RequestInfo, options: RequestInit | undefined, key: string): string | null => { let value: string = null; if (typeof Request !== "undefined" && request instanceof Request) { value = (request as Request).headers.get(key); @@ -45,12 +43,12 @@ export const getRequestHeader = (request: RequestInfo, options: FetchOptions | u * @constant * To set the header value to the given request * @param {RequestInfo} request - The request object or the url string - * @param {FetchOptions|undefined} options - The request options object + * @param {RequestInit|undefined} options - The request options object * @param {string} key - The header key string * @param {string } value - The header value string * @returns Nothing */ -export const setRequestHeader = (request: RequestInfo, options: FetchOptions | undefined, key: string, value: string): void => { +export const setRequestHeader = (request: RequestInfo, options: RequestInit | undefined, key: string, value: string): void => { if (typeof Request !== "undefined" && request instanceof Request) { (request as Request).headers.set(key, value); } else if (typeof options !== "undefined") { @@ -85,12 +83,12 @@ export const setRequestHeader = (request: RequestInfo, options: FetchOptions | u * @constant * To append the header value to the given request * @param {RequestInfo} request - The request object or the url string - * @param {FetchOptions|undefined} options - The request options object + * @param {RequestInit|undefined} options - The request options object * @param {string} key - The header key string * @param {string } value - The header value string * @returns Nothing */ -export const appendRequestHeader = (request: RequestInfo, options: FetchOptions | undefined, key: string, value: string): void => { +export const appendRequestHeader = (request: RequestInfo, options: RequestInit | undefined, key: string, value: string): void => { if (typeof Request !== "undefined" && request instanceof Request) { (request as Request).headers.append(key, value); } else if (typeof options !== "undefined") { diff --git a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts index cde2e17427..def10cdebc 100644 --- a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts +++ b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts @@ -9,14 +9,13 @@ * @module RetryHandlerOptions */ -import { FetchOptions } from "../../fetchInit"; import { MiddlewareOption } from "./middlewareOption"; /** * @type * A type declaration for shouldRetry callback */ -export type ShouldRetry = (delay: number, attempt: number, request: RequestInfo, options: FetchOptions | undefined, response: Response) => boolean; +export type ShouldRetry = (delay: number, attempt: number, request: RequestInfo, options: RequestInit | undefined, response: Response) => boolean; /** * @class diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts index db867efad8..a60cd631b9 100644 --- a/http/typescript/fetch/src/middlewares/retryHandler.ts +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -11,7 +11,6 @@ import { MiddlewareContext } from "./middlewareContext"; import { HttpMethod } from "@microsoft/kiota-abstractions"; -import { FetchOptions } from "../fetchInit"; import { Middleware } from "./middleware"; import { getRequestHeader, setRequestHeader } from "./middlewareUtil"; import { RetryHandlerOptions } from "./options/retryHandlerOptions"; @@ -86,10 +85,10 @@ export class RetryHandler implements Middleware { * @private * To check whether the payload is buffered or not * @param {RequestInfo} request - The url string or the request object value - * @param {FetchOptions} options - The options of a request + * @param {RequestInit} options - The options of a request * @returns Whether the payload is buffered or not */ - private isBuffered(request: RequestInfo, options: FetchOptions | undefined): boolean { + private isBuffered(request: RequestInfo, options: RequestInit | undefined): boolean { const method = typeof request === "string" ? options.method : (request as Request).method; const isPutPatchOrPost: boolean = method === HttpMethod.PUT || method === HttpMethod.PATCH || method === HttpMethod.POST; if (isPutPatchOrPost) { diff --git a/http/typescript/fetch/tsconfig.json b/http/typescript/fetch/tsconfig.json index 8d419f91ed..88f3834a40 100644 --- a/http/typescript/fetch/tsconfig.json +++ b/http/typescript/fetch/tsconfig.json @@ -1,71 +1,33 @@ { "compilerOptions": { - /* Visit https://aka.ms/tsconfig.json to read more about this file */ - - /* Basic Options */ - "incremental": true, /* Enable incremental compilation */ - "target": "es2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ - "module": "es2020", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ - "lib": [ "ES2015", "ES2016", "ES2017", "ES2018", "ES2019", "ES2020"], /* Specify library files to be included in the compilation. */ - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "./dist", /* Redirect output structure to the directory. */ - "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - // "composite": true, /* Enable project compilation */ - // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ - // "removeComments": true, /* Do not emit comments to output. */ - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - - /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ - "noImplicitAny": false, /* Raise error on expressions and declarations with an implied 'any' type. */ - "strictNullChecks": false, /* Enable strict null checks. */ - "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - - /* Additional Checks */ - "noUnusedLocals": true, /* Report errors on unused locals. */ - "noUnusedParameters": true, /* Report errors on unused parameters. */ - "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ - - /* Module Resolution Options */ - "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "types": [], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - - /* Source Map Options */ - // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - - /* Advanced Options */ - "skipLibCheck": true, /* Skip type checking of declaration files. */ - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + "incremental": true, /* Enable incremental compilation */ + "target": "es2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ + "module": "es2020", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + "lib": [ + "ES2015", + "ES2016", + "ES2017", + "ES2018", + "ES2019", + "ES2020", + ], + "declaration": true, + "sourceMap": true, + "outDir": "./dist", + "rootDir": "./src", + /* Strict Type-Checking Options */ + "strict": true, + "noImplicitAny": false, + "strictNullChecks": false, + "strictFunctionTypes": true, + "noImplicitThis": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true } - } - \ No newline at end of file +} \ No newline at end of file diff --git a/http/typescript/package-lock.json b/http/typescript/package-lock.json new file mode 100644 index 0000000000..48e341a095 --- /dev/null +++ b/http/typescript/package-lock.json @@ -0,0 +1,3 @@ +{ + "lockfileVersion": 1 +} diff --git a/package-lock.json b/package-lock.json index 48e341a095..501d74f81c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,3 +1,11 @@ { - "lockfileVersion": 1 + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "typescript": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", + "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==" + } + } } From c3a31b5b0c5fd6901df95607c913843856b7f2ff Mon Sep 17 00:00:00 2001 From: "nikithauc@gmail.com" Date: Wed, 6 Oct 2021 00:49:45 -0700 Subject: [PATCH 07/34] adding fetch definitions --- abstractions/typescript/package.json | 66 ++++---- abstractions/typescript/src/utils/shims.ts | 6 +- http/typescript/fetch/.vscode/settings.json | 3 + http/typescript/fetch/package-lock.json | 49 +++--- http/typescript/fetch/package.json | 7 +- .../fetch/src/middlewares/fetchHandler.ts | 10 +- .../src/middlewares/middlewareContext.ts | 7 +- .../fetch/src/middlewares/middlewareUtil.ts | 83 +++++---- .../options/RetryHandlerOptions.ts | 2 +- .../fetch/src/middlewares/redirectHandler.ts | 14 +- .../fetch/src/middlewares/retryHandler.ts | 9 +- http/typescript/fetch/src/utils/fetch.shim.ts | 9 + .../fetch/src/utils/fetchDefinitions.ts | 157 ++++++++++++++++++ 13 files changed, 295 insertions(+), 127 deletions(-) create mode 100644 http/typescript/fetch/.vscode/settings.json create mode 100644 http/typescript/fetch/src/utils/fetch.shim.ts create mode 100644 http/typescript/fetch/src/utils/fetchDefinitions.ts diff --git a/abstractions/typescript/package.json b/abstractions/typescript/package.json index 47fd08b3ab..37ee3d1e8b 100644 --- a/abstractions/typescript/package.json +++ b/abstractions/typescript/package.json @@ -1,35 +1,35 @@ { - "name": "@microsoft/kiota-abstractions", - "version": "1.0.19", - "description": "Core abstractions for kiota generated libraries in TypeScript and JavaScript", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "build": "tsc -p tsconfig.json", - "test": "echo \"Error: no test specified\" && exit 1", - "clean": "rm -r ./dist" - }, - "repository": "git://github.com/microsoft/kiota.git", - "keywords": [ - "kiota", - "openAPI", - "Microsoft", - "Graph" - ], - "author": "Microsoft", - "license": "MIT", - "bugs": { - "url": "https://github.com/microsoft/kiota/issues" - }, - "homepage": "https://github.com/microsoft/kiota#readme", - "devDependencies": { - "@types/uuid": "^8.3.1", - "typescript": "^4.4.3" - }, - "publishConfig": { - "registry": "https://npm.pkg.github.com" - }, - "dependencies": { - "uuid": "^8.3.2" - } + "name": "@microsoft/kiota-abstractions", + "version": "1.0.19", + "description": "Core abstractions for kiota generated libraries in TypeScript and JavaScript", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc -p tsconfig.json", + "test": "echo \"Error: no test specified\" && exit 1", + "clean": "rm -r ./dist" + }, + "repository": "git://github.com/microsoft/kiota.git", + "keywords": [ + "kiota", + "openAPI", + "Microsoft", + "Graph" + ], + "author": "Microsoft", + "license": "MIT", + "bugs": { + "url": "https://github.com/microsoft/kiota/issues" + }, + "homepage": "https://github.com/microsoft/kiota#readme", + "devDependencies": { + "@types/uuid": "^8.3.1", + "typescript": "^4.4.3" + }, + "publishConfig": { + "registry": "https://npm.pkg.github.com" + }, + "dependencies": { + "uuid": "^8.3.2" + } } diff --git a/abstractions/typescript/src/utils/shims.ts b/abstractions/typescript/src/utils/shims.ts index 1d4141ed47..8ffd3e43da 100644 --- a/abstractions/typescript/src/utils/shims.ts +++ b/abstractions/typescript/src/utils/shims.ts @@ -1,5 +1,7 @@ interface Request {}; -interface RequestInit {}; +interface RequestInit { + +}; interface Response {}; interface Headers {}; -//interface ReadableStream{}; \ No newline at end of file +interface ReadableStream{}; \ No newline at end of file diff --git a/http/typescript/fetch/.vscode/settings.json b/http/typescript/fetch/.vscode/settings.json new file mode 100644 index 0000000000..55712c19f1 --- /dev/null +++ b/http/typescript/fetch/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib" +} \ No newline at end of file diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index 8d81e01dc2..512d6a355e 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -47,32 +47,18 @@ } } }, - "@types/node": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", - "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==", - "dev": true - }, - "@types/node-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-3.0.3.tgz", - "integrity": "sha512-HhggYPH5N+AQe/OmN6fmhKmRRt2XuNJow+R3pQwJxOOF9GuwM7O2mheyGeIrs5MOIeNjDEdgdoyHBOrFeJBR3g==", - "requires": { - "node-fetch": "*" - } - }, - "cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "node-fetch": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", + "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", "requires": { - "node-fetch": "2.6.1" + "whatwg-url": "^5.0.0" } }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, "tslib": { "version": "2.3.1", @@ -85,10 +71,19 @@ "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", "dev": true }, - "web-streams-polyfill": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.1.tgz", - "integrity": "sha512-Czi3fG883e96T4DLEPRvufrF2ydhOOW1+1a6c3gNjH2aIh50DNFBdfwh2AKoOf1rXvpvavAoA11Qdq9+BKjE0Q==" + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } } } } diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index fc2798e8f9..8fdbec574b 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -34,13 +34,10 @@ }, "dependencies": { "@microsoft/kiota-abstractions": "file:../../../abstractions/typescript", - "@types/node-fetch": "^3.0.3", - "cross-fetch": "^3.1.4", - "tslib": "^2.3.1", - "web-streams-polyfill": "^3.1.1" + "node-fetch": "^2.6.5", + "tslib": "^2.3.1" }, "devDependencies": { - "@types/node": "^16.10.2", "typescript": "^4.4.3" } } diff --git a/http/typescript/fetch/src/middlewares/fetchHandler.ts b/http/typescript/fetch/src/middlewares/fetchHandler.ts index b044a92e10..6d941a4fb6 100644 --- a/http/typescript/fetch/src/middlewares/fetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/fetchHandler.ts @@ -9,15 +9,17 @@ * @module FetchHandler */ -import fetch from "cross-fetch"; +import fetch from "node-fetch"; import { MiddlewareContext } from "./middlewareContext"; import { Middleware } from "./middleware"; +import { FetchResponse, FetchRequestInfo, FetchRequestInit } from "../utils/fetchDefinitions"; /** * @class * @implements Middleware * Class for FetchHandler */ + export class FetchHandler implements Middleware { /** @@ -26,7 +28,7 @@ export class FetchHandler implements Middleware { */ next: Middleware; - constructor(private customFetch?: (input: RequestInfo, init:RequestInit) => Promise) {}; + constructor(private customFetch?: (input: FetchRequestInfo, init: FetchRequestInit) => Promise) {}; /** * @public @@ -37,10 +39,10 @@ export class FetchHandler implements Middleware { */ public async execute(context: MiddlewareContext): Promise { if (this.customFetch) { - context.response = await this.customFetch(context.request, context.options); + context.response = await this.customFetch(context.request, context.options) as FetchResponse; } else { - context.response = await fetch(context.request, context.options); + context.response = await fetch(context.request, context.options) as FetchResponse; } return; } diff --git a/http/typescript/fetch/src/middlewares/middlewareContext.ts b/http/typescript/fetch/src/middlewares/middlewareContext.ts index 76161a9897..a945d7c84f 100644 --- a/http/typescript/fetch/src/middlewares/middlewareContext.ts +++ b/http/typescript/fetch/src/middlewares/middlewareContext.ts @@ -1,3 +1,4 @@ +import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; import { MiddlewareControl } from "./MiddlewareControl"; /** @@ -11,8 +12,8 @@ import { MiddlewareControl } from "./MiddlewareControl"; */ export interface MiddlewareContext { - request:RequestInfo, - response?: Response, - options?:RequestInit, + request:FetchRequestInfo, + response?: FetchResponse, + options?:FetchRequestInit, middlewareControl?: MiddlewareControl } \ No newline at end of file diff --git a/http/typescript/fetch/src/middlewares/middlewareUtil.ts b/http/typescript/fetch/src/middlewares/middlewareUtil.ts index 44f4205e19..3c405720d1 100644 --- a/http/typescript/fetch/src/middlewares/middlewareUtil.ts +++ b/http/typescript/fetch/src/middlewares/middlewareUtil.ts @@ -5,6 +5,8 @@ * ------------------------------------------------------------------------------------------- */ +import { FetchRequest, FetchRequestInfo, FetchRequestInit, FetchHeaders } from "../utils/fetchDefinitions"; + /** * @module MiddlewareUtil */ @@ -17,14 +19,15 @@ * @param {string} key - The header key string * @returns A header value for the given key from the request */ -export const getRequestHeader = (request: RequestInfo, options: RequestInit | undefined, key: string): string | null => { +export const getRequestHeader = (request: FetchRequestInfo, options: FetchRequestInit | undefined, key: string): string | null => { let value: string = null; - if (typeof Request !== "undefined" && request instanceof Request) { - value = (request as Request).headers.get(key); - } else if (typeof options !== "undefined" && options.headers !== undefined) { - if (typeof Headers !== "undefined" && options.headers instanceof Headers) { - value = (options.headers as Headers).get(key); - } else if (options.headers instanceof Array) { + + // check for request object + if (typeof options !== "undefined" && options.headers !== undefined) { + // if (typeof Headers !== "undefined" && options.headers instanceof Headers) { + // value = (options.headers[key]; + //} else + if (options.headers instanceof Array) { const headers = options.headers as string[][]; for (let i = 0, l = headers.length; i < l; i++) { if (headers[i][0] === key) { @@ -48,18 +51,17 @@ export const getRequestHeader = (request: RequestInfo, options: RequestInit | un * @param {string } value - The header value string * @returns Nothing */ -export const setRequestHeader = (request: RequestInfo, options: RequestInit | undefined, key: string, value: string): void => { - if (typeof Request !== "undefined" && request instanceof Request) { - (request as Request).headers.set(key, value); - } else if (typeof options !== "undefined") { - if (options.headers === undefined) { - options.headers = new Headers({ - [key]: value, - }); - } else { - if (typeof Headers !== "undefined" && options.headers instanceof Headers) { - (options.headers as Headers).set(key, value); - } else if (options.headers instanceof Array) { +export const setRequestHeader = (request: FetchRequestInfo, options: FetchRequestInit | undefined, key: string, value: string): void => { + if (typeof options !== "undefined") { + // if (options.headers === undefined) { + // options.headers = new Headers({ + // [key]: value, + // }); + // } else { + // if (typeof FetchHeaders !== "undefined" && options.headers instanceof Headers) { + // (options.headers as Headers).set(key, value); + // } else + if (options.headers instanceof Array) { let i = 0; const l = options.headers.length; for (; i < l; i++) { @@ -76,7 +78,7 @@ export const setRequestHeader = (request: RequestInfo, options: RequestInit | un Object.assign(options.headers, { [key]: value }); } } - } + //} }; /** @@ -88,28 +90,19 @@ export const setRequestHeader = (request: RequestInfo, options: RequestInit | un * @param {string } value - The header value string * @returns Nothing */ -export const appendRequestHeader = (request: RequestInfo, options: RequestInit | undefined, key: string, value: string): void => { - if (typeof Request !== "undefined" && request instanceof Request) { - (request as Request).headers.append(key, value); - } else if (typeof options !== "undefined") { - if (options.headers === undefined) { - options.headers = new Headers({ - [key]: value, - }); +export const appendRequestHeader = (request: FetchRequestInfo, options: FetchRequestInit | undefined, key: string, value: string): void => { + if (typeof options !== "undefined") { + if (options.headers instanceof Array) { + (options.headers as string[][]).push([key, value]); + } else if (options.headers === undefined) { + options.headers = { [key]: value }; + } else if (options.headers[key] === undefined) { + options.headers[key] = value; } else { - if (typeof Headers !== "undefined" && options.headers instanceof Headers) { - (options.headers as Headers).append(key, value); - } else if (options.headers instanceof Array) { - (options.headers as string[][]).push([key, value]); - } else if (options.headers === undefined) { - options.headers = { [key]: value }; - } else if (options.headers[key] === undefined) { - options.headers[key] = value; - } else { - options.headers[key] += `, ${value}`; - } + options.headers[key] += `, ${value}`; } } +//} }; /** @@ -119,8 +112,14 @@ export const appendRequestHeader = (request: RequestInfo, options: RequestInit | * @param {Request} request - The request object * @returns A promise that resolves to request object */ -export const cloneRequestWithNewUrl = async (newUrl: string, request: Request): Promise => { +export const cloneRequestWithNewUrl = async (newUrl: string, request: FetchRequest): Promise => { const body = request.headers.get("Content-Type") ? await request.blob() : await Promise.resolve(undefined); const { method, headers, referrer, referrerPolicy, mode, credentials, cache, redirect, integrity, keepalive, signal } = request; - return new Request(newUrl, { method, headers, body, referrer, referrerPolicy, mode, credentials, cache, redirect, integrity, keepalive, signal }); -}; + // foreach(){ + + // } + const s: FetchRequest = { + url: newUrl, method, headers, body, referrer, referrerPolicy, mode, credentials, cache, redirect, integrity, keepalive, signal + }; + return s; +} diff --git a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts index def10cdebc..6270aa9bc6 100644 --- a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts +++ b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts @@ -15,7 +15,7 @@ import { MiddlewareOption } from "./middlewareOption"; * @type * A type declaration for shouldRetry callback */ -export type ShouldRetry = (delay: number, attempt: number, request: RequestInfo, options: RequestInit | undefined, response: Response) => boolean; +export type ShouldRetry = (delay: number, attempt: number, request: RequestInit, options: RequestInit | undefined, response: Response) => boolean; /** * @class diff --git a/http/typescript/fetch/src/middlewares/redirectHandler.ts b/http/typescript/fetch/src/middlewares/redirectHandler.ts index 9d2ca6aa2f..1b97ebf6e0 100644 --- a/http/typescript/fetch/src/middlewares/redirectHandler.ts +++ b/http/typescript/fetch/src/middlewares/redirectHandler.ts @@ -14,6 +14,8 @@ import { MiddlewareContext } from "./middlewareContext"; import { Middleware } from "./middleware"; import { cloneRequestWithNewUrl } from "./middlewareUtil"; import { RedirectHandlerOptions } from "./options/redirectHandlerOption"; +import {FetchResponse, FetchRequestInfo, FetchRequest} from "../utils/fetchDefinitions" + /** * @class @@ -61,7 +63,7 @@ export class RedirectHandler implements Middleware { * @static * A member holding the manual redirect value */ - private static MANUAL_REDIRECT: RequestRedirect = "manual"; + private static MANUAL_REDIRECT = "manual"; /** Next middleware to be executed*/ next: Middleware | undefined; @@ -84,7 +86,7 @@ export class RedirectHandler implements Middleware { * @param {Response} response - The response object * @returns A boolean representing whether the response contains the redirect status code or not */ - private isRedirect(response: Response): boolean { + private isRedirect(response: FetchResponse): boolean { return RedirectHandler.REDIRECT_STATUS_CODES.indexOf(response.status) !== -1; } @@ -94,7 +96,7 @@ export class RedirectHandler implements Middleware { * @param {Response} response - The response object * @returns A boolean representing the whether the response has location header or not */ - private hasLocationHeader(response: Response): boolean { + private hasLocationHeader(response: FetchResponse): boolean { return response.headers.has(RedirectHandler.LOCATION_HEADER); } @@ -104,7 +106,7 @@ export class RedirectHandler implements Middleware { * @param {Response} response - The response object * @returns A redirect url from location header */ - private getLocationHeader(response: Response): string { + private getLocationHeader(response: FetchResponse): string { return response.headers.get(RedirectHandler.LOCATION_HEADER); } @@ -149,7 +151,7 @@ export class RedirectHandler implements Middleware { * @returns Nothing */ private async updateRequestUrl(redirectUrl: string, context: MiddlewareContext): Promise { - context.request = typeof context.request === "string" ? redirectUrl : await cloneRequestWithNewUrl(redirectUrl, context.request as Request); + context.request = typeof context.request === "string" ? redirectUrl : await cloneRequestWithNewUrl(redirectUrl, context.request); } /** @@ -184,7 +186,7 @@ export class RedirectHandler implements Middleware { if (redirectCount < options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && options.shouldRedirect(response)) { ++redirectCount; if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { - context.options.method = HttpMethod.GET; + context.options["method"] = HttpMethod.GET; delete context.options.body; } else { const redirectUrl: string = this.getLocationHeader(response); diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts index a60cd631b9..7ca241cfe5 100644 --- a/http/typescript/fetch/src/middlewares/retryHandler.ts +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -15,6 +15,7 @@ import { Middleware } from "./middleware"; import { getRequestHeader, setRequestHeader } from "./middlewareUtil"; import { RetryHandlerOptions } from "./options/retryHandlerOptions"; import { MiddlewareControl } from "./MiddlewareControl"; +import {FetchResponse, FetchRequestInit, FetchRequestInfo} from "../utils/fetchDefinitions" /** * @class @@ -77,7 +78,7 @@ export class RetryHandler implements Middleware { * @param {Response} response - The response object * @returns Whether the response has retry status code or not */ - private isRetry(response: Response): boolean { + private isRetry(response: FetchResponse): boolean { return RetryHandler.RETRY_STATUS_CODES.indexOf(response.status) !== -1; } @@ -88,8 +89,8 @@ export class RetryHandler implements Middleware { * @param {RequestInit} options - The options of a request * @returns Whether the payload is buffered or not */ - private isBuffered(request: RequestInfo, options: RequestInit | undefined): boolean { - const method = typeof request === "string" ? options.method : (request as Request).method; + private isBuffered(request: FetchRequestInfo, options: FetchRequestInit | undefined): boolean { + const method = typeof request === "string" ? options.method : request.method; const isPutPatchOrPost: boolean = method === HttpMethod.PUT || method === HttpMethod.PATCH || method === HttpMethod.POST; if (isPutPatchOrPost) { const isStream = getRequestHeader(request, options, "Content-Type") === "application/octet-stream"; @@ -108,7 +109,7 @@ export class RetryHandler implements Middleware { * @param {number} delay - The delay value in seconds * @returns A delay for a retry */ - private getDelay(response: Response, retryAttempts: number, delay: number): number { + private getDelay(response: FetchResponse, retryAttempts: number, delay: number): number { const getRandomness = () => Number(Math.random().toFixed(3)); const retryAfter = response.headers !== undefined ? response.headers.get(RetryHandler.RETRY_AFTER_HEADER) : null; let newDelay: number; diff --git a/http/typescript/fetch/src/utils/fetch.shim.ts b/http/typescript/fetch/src/utils/fetch.shim.ts new file mode 100644 index 0000000000..b5b7c786e7 --- /dev/null +++ b/http/typescript/fetch/src/utils/fetch.shim.ts @@ -0,0 +1,9 @@ +interface Request {}; +interface RequestInit { +}; +interface Response{}; +interface Headers { +} +interface ReadableStream{}; + +const s:RequestInit = {sd:""} \ No newline at end of file diff --git a/http/typescript/fetch/src/utils/fetchDefinitions.ts b/http/typescript/fetch/src/utils/fetchDefinitions.ts new file mode 100644 index 0000000000..546560bf1e --- /dev/null +++ b/http/typescript/fetch/src/utils/fetchDefinitions.ts @@ -0,0 +1,157 @@ + +export type FetchRequestInfo = string | FetchRequest; // We only ever call fetch() on string urls. + +interface FetchBody { + readonly body?: unknown + readonly bodyUsed?: boolean; + arrayBuffer?(): unknown; + blob?(): unknown; + formData?(): unknown; + json?(): unknown; + text?(): unknown; +} + +export interface FetchRequestInit extends RequestInit{ + /** + * A BodyInit object or null to set request's body. + */ + body?: unknown; + /** + * A string indicating how the request will interact with the browser's cache to set request's cache. + */ + cache?: unknown; + /** + * A string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. Sets request's credentials. + */ + credentials?: unknown; + /** + * A Headers object, an object literal, or an array of two-item arrays to set request's headers. + */ + headers?: unknown; + /** + * A cryptographic hash of the resource to be fetched by request. Sets request's integrity. + */ + integrity?: string; + /** + * A boolean to set request's keepalive. + */ + keepalive?: boolean; + /** + * A string to set request's method. + */ + method?: string; + /** + * A string to indicate whether the request will use CORS, or will be restricted to same-origin URLs. Sets request's mode. + */ + mode?: unknown; + /** + * A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect. + */ + redirect?: unknown; + /** + * A string whose value is a same-origin URL, "about:client", or the empty string, to set request's referrer. + */ + referrer?: string; + /** + * A referrer policy to set request's referrerPolicy. + */ + referrerPolicy?: unknown; + /** + * An AbortSignal to set request's signal. + */ + signal?: unknown | null; + /** + * Can only be null. Used to disassociate request from any Window. + */ + window?: any; + + //Node-Fetch + agent?: unknown; + compress?: boolean; + counter?: number; + follow?: number; + hostname?: string; + port?: number; + protocol?: string; + size?: number; + highWaterMark?: number; + insecureHTTPParser?: boolean; +} + +export interface FetchResponse extends Response,FetchBody{ + readonly headers: FetchHeaders; + readonly ok: boolean; + readonly redirected: boolean; + readonly status: number; + readonly statusText: string; + readonly type: unknown; + readonly url: string; + clone(): Response; +} + +export interface FetchHeaders extends Headers{ + append(name: string, value: string): void; + delete(name: string): void; + get(name: string): string | null; + has(name: string): boolean; + set(name: string, value: string): void; + forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: any): void; +} + +/** This Fetch API interface represents a resource request. */ +export interface FetchRequest extends Request, FetchBody { + /** + * Returns the cache mode associated with request, which is a string indicating how the request will interact with the browser's cache when fetching. + */ + readonly cache?: unknown; + /** + * Returns the credentials mode associated with request, which is a string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. + */ + readonly credentials?: unknown; + /** + * Returns the kind of resource requested by request, e.g., "document" or "script". + */ + readonly destination?: unknown; + /** + * Returns a Headers object consisting of the headers associated with request. Note that headers added in the network layer by the user agent will not be accounted for in this object, e.g., the "Host" header. + */ + readonly headers?: FetchHeaders; + /** + * Returns request's subresource integrity metadata, which is a cryptographic hash of the resource being fetched. Its value consists of multiple hashes separated by whitespace. [SRI] + */ + readonly integrity?: string; + /** + * Returns a boolean indicating whether or not request can outlive the global in which it was created. + */ + readonly keepalive?: boolean; + /** + * Returns request's HTTP method, which is "GET" by default. + */ + readonly method?: string; + /** + * Returns the mode associated with request, which is a string indicating whether the request will use CORS, or will be restricted to same-origin URLs. + */ + readonly mode?: unknown; + /** + * Returns the redirect mode associated with request, which is a string indicating how redirects for the request will be handled during fetching. A request will follow redirects by default. + */ + readonly redirect?: unknown; + /** + * Returns the referrer of request. Its value can be a same-origin URL if explicitly set in init, the empty string to indicate no referrer, and "about:client" when defaulting to the global's default. This is used during fetching to determine the value of the `Referer` header of the request being made. + */ + readonly referrer?: string; + /** + * Returns the referrer policy associated with request. This is used during fetching to compute the value of the request's referrer. + */ + readonly referrerPolicy?: unknown; + /** + * Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler. + */ + readonly signal?: unknown; + /** + * Returns the URL of request as a string. + */ + readonly url?: string; + clone?(): FetchRequest; +} + From 02d581296f95f2b44690da623fc477185eec9783 Mon Sep 17 00:00:00 2001 From: "nikithauc@gmail.com" Date: Wed, 6 Oct 2021 22:17:34 -0700 Subject: [PATCH 08/34] Adding dom.d.ts, url utils --- http/typescript/fetch/package-lock.json | 5 + http/typescript/fetch/package.json | 1 + http/typescript/fetch/src/httpClient.ts | 5 +- http/typescript/fetch/src/httpCore.ts | 22 +-- .../fetch/src/middlewares/fetchHandler.ts | 2 +- .../fetch/src/middlewares/middlewareUtil.ts | 91 ++------- .../options/RetryHandlerOptions.ts | 4 +- .../fetch/src/middlewares/redirectHandler.ts | 5 +- .../fetch/src/middlewares/retryHandler.ts | 4 +- http/typescript/fetch/src/utils/dom.d.ts | 1 + http/typescript/fetch/src/utils/fetch.shim.ts | 5 +- .../fetch/src/utils/fetchDefinitions.ts | 186 ++++++++++-------- .../fetch/src/utils/utils.browser.ts | 5 + http/typescript/fetch/src/utils/utils.ts | 1 + 14 files changed, 158 insertions(+), 179 deletions(-) create mode 100644 http/typescript/fetch/src/utils/dom.d.ts create mode 100644 http/typescript/fetch/src/utils/utils.browser.ts create mode 100644 http/typescript/fetch/src/utils/utils.ts diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index 512d6a355e..aa6d76a298 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -47,6 +47,11 @@ } } }, + "@types/node": { + "version": "16.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.3.tgz", + "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==" + }, "node-fetch": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index 8fdbec574b..1fc3262a4f 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -34,6 +34,7 @@ }, "dependencies": { "@microsoft/kiota-abstractions": "file:../../../abstractions/typescript", + "@types/node": "^16.10.3", "node-fetch": "^2.6.5", "tslib": "^2.3.1" }, diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index cbe600b139..73c7a12a50 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -2,6 +2,7 @@ import { Middleware } from "./middlewares/middleware"; import { MiddlewareContext } from "./middlewares/middlewareContext"; import { FetchHandler } from "./middlewares/fetchHandler"; import { MiddlewareFactory } from "./middlewares/middlewareFactory"; +import { FetchRequestInfo, FetchRequestInit , FetchResponse } from "./utils/fetchDefinitions"; /** Default fetch client with options and a middleware pipleline for requests execution. */ export class HttpClient { @@ -11,7 +12,7 @@ export class HttpClient { * @param middlewares middlewares to be used for requests execution. * @param defaultRequestSettings default request settings to be used for requests execution. */ - public constructor(private customFetch?: (request: RequestInfo, init?: RequestInit) => Promise, ...middlewares: Middleware[]) { + public constructor(private customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise, ...middlewares: Middleware[]) { // Use default middleware chain if middlewares and custom fetch function are not defined if(!middlewares && !customFetch){ @@ -66,7 +67,7 @@ export class HttpClient { * @param options request options. * @returns the promise resolving the response. */ - public async executeFetch(context: MiddlewareContext): Promise { + public async executeFetch(context: MiddlewareContext): Promise { if (this.customFetch && !this.middleware) { return this.customFetch(context.request, context.options); diff --git a/http/typescript/fetch/src/httpCore.ts b/http/typescript/fetch/src/httpCore.ts index 4f78a84dd0..dfecb1d2ba 100644 --- a/http/typescript/fetch/src/httpCore.ts +++ b/http/typescript/fetch/src/httpCore.ts @@ -1,7 +1,7 @@ import { AuthenticationProvider, BackingStoreFactory, BackingStoreFactorySingleton, HttpCore as IHttpCore, Parsable, ParseNodeFactory, RequestInformation, ResponseHandler, ParseNodeFactoryRegistry, enableBackingStoreForParseNodeFactory, SerializationWriterFactoryRegistry, enableBackingStoreForSerializationWriterFactory, SerializationWriterFactory } from '@microsoft/kiota-abstractions'; -import { URLSearchParams } from 'url'; import { HttpClient } from './httpClient'; -import {Headers as crossHeaders} from "cross-fetch" +import { FetchRequestInfo, FetchRequestInit , FetchResponse } from "./utils/fetchDefinitions"; +import {URLSearchParams} from "./utils/utils" import { MiddlewareContext } from './middlewares/middlewareContext'; @@ -30,7 +30,7 @@ export class HttpCore implements IHttpCore { throw new Error('http client cannot be null'); } } - private getResponseContentType = (response: Response): string | undefined => { + private getResponseContentType = (response: FetchResponse): string | undefined => { const header = response.headers.get("content-type")?.toLowerCase(); if (!header) return undefined; const segments = header.split(';'); @@ -47,7 +47,7 @@ export class HttpCore implements IHttpCore { if (responseHandler) { return await responseHandler.handleResponseAsync(response); } else { - const payload = await response.arrayBuffer(); + const payload = await response.arrayBuffer() as ArrayBuffer; const responseContentType = this.getResponseContentType(response); if (!responseContentType) throw new Error("no response content type found for deserialization"); @@ -67,7 +67,7 @@ export class HttpCore implements IHttpCore { if (responseHandler) { return await responseHandler.handleResponseAsync(response); } else { - const payload = await response.arrayBuffer(); + const payload = await response.arrayBuffer() as ArrayBuffer; const responseContentType = this.getResponseContentType(response); if (!responseContentType) throw new Error("no response content type found for deserialization"); @@ -94,7 +94,7 @@ export class HttpCore implements IHttpCore { case 'number': case 'boolean': case 'Date': - const payload = await response.arrayBuffer(); + const payload = await response.arrayBuffer() as ArrayBuffer; const responseContentType = this.getResponseContentType(response); if (!responseContentType) throw new Error("no response content type found for deserialization"); @@ -133,14 +133,14 @@ export class HttpCore implements IHttpCore { BackingStoreFactorySingleton.instance = backingStoreFactory; } } - private getRequestFromRequestInformation = (requestInfo: RequestInformation): RequestInit => { - const request = { + private getRequestFromRequestInformation = (requestInfo: RequestInformation): FetchRequestInit => { + const request: FetchRequestInit = { method: requestInfo.httpMethod?.toString(), body: requestInfo.content, - } as RequestInit; + } const headers: string[][] = []; - requestInfo.headers?.forEach((v, k) => (request.headers as Headers).set(k, v)); + requestInfo.headers?.forEach((v, k) => (request.headers[k] = v)); requestInfo.options?.forEach((v, k) => { if (k in request) { @@ -168,7 +168,7 @@ export class HttpCore implements IHttpCore { const context: MiddlewareContext = { request: url, options: this.getRequestFromRequestInformation(requestInformation), - //middlewareControl //set from middleware options + //middlewareControl : getMiddlewareOptions//set from middleware options } return context; diff --git a/http/typescript/fetch/src/middlewares/fetchHandler.ts b/http/typescript/fetch/src/middlewares/fetchHandler.ts index 6d941a4fb6..464edad437 100644 --- a/http/typescript/fetch/src/middlewares/fetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/fetchHandler.ts @@ -28,7 +28,7 @@ export class FetchHandler implements Middleware { */ next: Middleware; - constructor(private customFetch?: (input: FetchRequestInfo, init: FetchRequestInit) => Promise) {}; + constructor(private customFetch?: (input: FetchRequestInfo, init: FetchRequestInit) => Promise) {}; /** * @public diff --git a/http/typescript/fetch/src/middlewares/middlewareUtil.ts b/http/typescript/fetch/src/middlewares/middlewareUtil.ts index 3c405720d1..c34020bdac 100644 --- a/http/typescript/fetch/src/middlewares/middlewareUtil.ts +++ b/http/typescript/fetch/src/middlewares/middlewareUtil.ts @@ -5,7 +5,7 @@ * ------------------------------------------------------------------------------------------- */ -import { FetchRequest, FetchRequestInfo, FetchRequestInit, FetchHeaders } from "../utils/fetchDefinitions"; +import { FetchRequest, FetchRequestInfo, FetchRequestInit } from "../utils/fetchDefinitions"; /** * @module MiddlewareUtil @@ -15,29 +15,16 @@ import { FetchRequest, FetchRequestInfo, FetchRequestInit, FetchHeaders } from " * @constant * To get the request header from the request * @param {RequestInfo} request - The request object or the url string - * @param {RequestInit|undefined} options - The request options object + * @param {FetchOptions|undefined} options - The request options object * @param {string} key - The header key string * @returns A header value for the given key from the request */ export const getRequestHeader = (request: FetchRequestInfo, options: FetchRequestInit | undefined, key: string): string | null => { let value: string = null; - - // check for request object - if (typeof options !== "undefined" && options.headers !== undefined) { - // if (typeof Headers !== "undefined" && options.headers instanceof Headers) { - // value = (options.headers[key]; - //} else - if (options.headers instanceof Array) { - const headers = options.headers as string[][]; - for (let i = 0, l = headers.length; i < l; i++) { - if (headers[i][0] === key) { - value = headers[i][1]; - break; - } - } - } else if (options.headers[key] !== undefined) { - value = options.headers[key]; - } + if (typeof request !== 'string') { + value = (request as FetchRequest).headers.get(key); + } else if (typeof options !== "undefined" && options.headers !== undefined) { + value = options.headers[key]; } return value; }; @@ -46,80 +33,38 @@ export const getRequestHeader = (request: FetchRequestInfo, options: FetchReques * @constant * To set the header value to the given request * @param {RequestInfo} request - The request object or the url string - * @param {RequestInit|undefined} options - The request options object + * @param {FetchOptions|undefined} options - The request options object * @param {string} key - The header key string * @param {string } value - The header value string * @returns Nothing */ export const setRequestHeader = (request: FetchRequestInfo, options: FetchRequestInit | undefined, key: string, value: string): void => { - if (typeof options !== "undefined") { - // if (options.headers === undefined) { - // options.headers = new Headers({ - // [key]: value, - // }); - // } else { - // if (typeof FetchHeaders !== "undefined" && options.headers instanceof Headers) { - // (options.headers as Headers).set(key, value); - // } else - if (options.headers instanceof Array) { - let i = 0; - const l = options.headers.length; - for (; i < l; i++) { - const header = options.headers[i]; - if (header[0] === key) { - header[1] = value; - break; - } - } - if (i === l) { - (options.headers as string[][]).push([key, value]); - } - } else { - Object.assign(options.headers, { [key]: value }); - } - } - //} + if (typeof request !== 'string') { + (request as FetchRequest).headers.set(key, value); + } else if (typeof options !== "undefined") { + options.headers[key] = value; + } }; /** * @constant * To append the header value to the given request * @param {RequestInfo} request - The request object or the url string - * @param {RequestInit|undefined} options - The request options object + * @param {FetchOptions|undefined} options - The request options object * @param {string} key - The header key string * @param {string } value - The header value string * @returns Nothing */ export const appendRequestHeader = (request: FetchRequestInfo, options: FetchRequestInit | undefined, key: string, value: string): void => { - if (typeof options !== "undefined") { - if (options.headers instanceof Array) { - (options.headers as string[][]).push([key, value]); - } else if (options.headers === undefined) { - options.headers = { [key]: value }; - } else if (options.headers[key] === undefined) { + if (typeof request !== "string") { + (request as FetchRequest).headers.append(key, value); + } else if (typeof options !== "undefined") { + if (options.headers[key] === undefined) { options.headers[key] = value; } else { options.headers[key] += `, ${value}`; } } -//} -}; -/** - * @constant - * To clone the request with the new url - * @param {string} url - The new url string - * @param {Request} request - The request object - * @returns A promise that resolves to request object - */ -export const cloneRequestWithNewUrl = async (newUrl: string, request: FetchRequest): Promise => { - const body = request.headers.get("Content-Type") ? await request.blob() : await Promise.resolve(undefined); - const { method, headers, referrer, referrerPolicy, mode, credentials, cache, redirect, integrity, keepalive, signal } = request; - // foreach(){ +}; - // } - const s: FetchRequest = { - url: newUrl, method, headers, body, referrer, referrerPolicy, mode, credentials, cache, redirect, integrity, keepalive, signal - }; - return s; -} diff --git a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts index 6270aa9bc6..5ed3d970e8 100644 --- a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts +++ b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts @@ -10,12 +10,12 @@ */ import { MiddlewareOption } from "./middlewareOption"; - +import {FetchResponse, FetchRequestInit, FetchRequestInfo} from "../../utils/fetchDefinitions" /** * @type * A type declaration for shouldRetry callback */ -export type ShouldRetry = (delay: number, attempt: number, request: RequestInit, options: RequestInit | undefined, response: Response) => boolean; +export type ShouldRetry = (delay: number, attempt: number, request: string, options: FetchRequestInit | undefined, response: FetchResponse) => boolean; /** * @class diff --git a/http/typescript/fetch/src/middlewares/redirectHandler.ts b/http/typescript/fetch/src/middlewares/redirectHandler.ts index 1b97ebf6e0..afc208463f 100644 --- a/http/typescript/fetch/src/middlewares/redirectHandler.ts +++ b/http/typescript/fetch/src/middlewares/redirectHandler.ts @@ -12,9 +12,8 @@ import { HttpMethod } from "@microsoft/kiota-abstractions"; import { MiddlewareContext } from "./middlewareContext"; import { Middleware } from "./middleware"; -import { cloneRequestWithNewUrl } from "./middlewareUtil"; import { RedirectHandlerOptions } from "./options/redirectHandlerOption"; -import {FetchResponse, FetchRequestInfo, FetchRequest} from "../utils/fetchDefinitions" +import {FetchResponse} from "../utils/fetchDefinitions" /** @@ -151,7 +150,7 @@ export class RedirectHandler implements Middleware { * @returns Nothing */ private async updateRequestUrl(redirectUrl: string, context: MiddlewareContext): Promise { - context.request = typeof context.request === "string" ? redirectUrl : await cloneRequestWithNewUrl(redirectUrl, context.request); + context.request = redirectUrl; } /** diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts index 7ca241cfe5..01a1a1c4a4 100644 --- a/http/typescript/fetch/src/middlewares/retryHandler.ts +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -90,7 +90,7 @@ export class RetryHandler implements Middleware { * @returns Whether the payload is buffered or not */ private isBuffered(request: FetchRequestInfo, options: FetchRequestInit | undefined): boolean { - const method = typeof request === "string" ? options.method : request.method; + const method = options const isPutPatchOrPost: boolean = method === HttpMethod.PUT || method === HttpMethod.PATCH || method === HttpMethod.POST; if (isPutPatchOrPost) { const isStream = getRequestHeader(request, options, "Content-Type") === "application/octet-stream"; @@ -148,7 +148,7 @@ export class RetryHandler implements Middleware { */ private async sleep(delaySeconds: number): Promise { const delayMilliseconds = delaySeconds * 1000; - return new Promise((resolve) => setTimeout(resolve, delayMilliseconds)); + return new Promise((resolve) => setTimeout(resolve, delayMilliseconds)); // browser or node } private getOptions(context: MiddlewareContext): RetryHandlerOptions { diff --git a/http/typescript/fetch/src/utils/dom.d.ts b/http/typescript/fetch/src/utils/dom.d.ts new file mode 100644 index 0000000000..77213b167b --- /dev/null +++ b/http/typescript/fetch/src/utils/dom.d.ts @@ -0,0 +1 @@ +/// \ No newline at end of file diff --git a/http/typescript/fetch/src/utils/fetch.shim.ts b/http/typescript/fetch/src/utils/fetch.shim.ts index b5b7c786e7..8228d47c29 100644 --- a/http/typescript/fetch/src/utils/fetch.shim.ts +++ b/http/typescript/fetch/src/utils/fetch.shim.ts @@ -2,8 +2,7 @@ interface Request {}; interface RequestInit { }; interface Response{}; -interface Headers { -} +interface Headers {}; interface ReadableStream{}; -const s:RequestInit = {sd:""} \ No newline at end of file +interface fetch{}; \ No newline at end of file diff --git a/http/typescript/fetch/src/utils/fetchDefinitions.ts b/http/typescript/fetch/src/utils/fetchDefinitions.ts index 546560bf1e..f8dc2c2724 100644 --- a/http/typescript/fetch/src/utils/fetchDefinitions.ts +++ b/http/typescript/fetch/src/utils/fetchDefinitions.ts @@ -1,84 +1,46 @@ +import { type } from "os"; -export type FetchRequestInfo = string | FetchRequest; // We only ever call fetch() on string urls. +export type FetchRequestInfo = string; // We only ever call fetch() on string urls. + +export type FetchHeadersInit = Record; interface FetchBody { - readonly body?: unknown - readonly bodyUsed?: boolean; - arrayBuffer?(): unknown; - blob?(): unknown; - formData?(): unknown; - json?(): unknown; - text?(): unknown; + readonly body: ReadableStream | null; + readonly bodyUsed: boolean; + arrayBuffer(): Promise; + blob(): Promise; + formData(): Promise; + json(): Promise; + text(): Promise; } -export interface FetchRequestInit extends RequestInit{ - /** - * A BodyInit object or null to set request's body. - */ - body?: unknown; - /** - * A string indicating how the request will interact with the browser's cache to set request's cache. - */ - cache?: unknown; - /** - * A string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. Sets request's credentials. - */ - credentials?: unknown; - /** - * A Headers object, an object literal, or an array of two-item arrays to set request's headers. - */ - headers?: unknown; - /** - * A cryptographic hash of the resource to be fetched by request. Sets request's integrity. - */ - integrity?: string; - /** - * A boolean to set request's keepalive. - */ - keepalive?: boolean; - /** - * A string to set request's method. - */ - method?: string; - /** - * A string to indicate whether the request will use CORS, or will be restricted to same-origin URLs. Sets request's mode. - */ - mode?: unknown; - /** - * A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect. - */ - redirect?: unknown; - /** - * A string whose value is a same-origin URL, "about:client", or the empty string, to set request's referrer. - */ - referrer?: string; - /** - * A referrer policy to set request's referrerPolicy. - */ - referrerPolicy?: unknown; - /** - * An AbortSignal to set request's signal. - */ - signal?: unknown | null; - /** - * Can only be null. Used to disassociate request from any Window. - */ - window?: any; +export type FetchHeaders = Headers & { + append?(name: string, value: string): void; + delete?(name: string): void; + get?(name: string): string | null; + has?(name: string): boolean; + set?(name: string, value: string): void; + forEach?(callbackfn: (value: string, key: string, parent: FetchHeaders) => void, thisArg?: any): void; + [Symbol.iterator]?(): IterableIterator<[string, string]>; + /** + * Returns an iterator allowing to go through all key/value pairs contained in this object. + */ + entries?(): IterableIterator<[string, string]>; + /** + * Returns an iterator allowing to go through all keys of the key/value pairs contained in this object. + */ + keys?(): IterableIterator; + /** + * Returns an iterator allowing to go through all values of the key/value pairs contained in this object. + */ + values?(): IterableIterator; - //Node-Fetch - agent?: unknown; - compress?: boolean; - counter?: number; - follow?: number; - hostname?: string; - port?: number; - protocol?: string; - size?: number; - highWaterMark?: number; - insecureHTTPParser?: boolean; + /** Node-fetch extension */ + raw?(): Record; } -export interface FetchResponse extends Response,FetchBody{ + +export type FetchResponse = Response & FetchBody & { readonly headers: FetchHeaders; readonly ok: boolean; readonly redirected: boolean; @@ -89,17 +51,10 @@ export interface FetchResponse extends Response,FetchBody{ clone(): Response; } -export interface FetchHeaders extends Headers{ - append(name: string, value: string): void; - delete(name: string): void; - get(name: string): string | null; - has(name: string): boolean; - set(name: string, value: string): void; - forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: any): void; -} + /** This Fetch API interface represents a resource request. */ -export interface FetchRequest extends Request, FetchBody { +export type FetchRequest = Request | FetchBody & { /** * Returns the cache mode associated with request, which is a string indicating how the request will interact with the browser's cache when fetching. */ @@ -155,3 +110,70 @@ export interface FetchRequest extends Request, FetchBody { clone?(): FetchRequest; } + +export type FetchRequestInit = RequestInit |{ + /** + * A BodyInit object or null to set request's body. + */ + body?: unknown; + /** + * A string indicating how the request will interact with the browser's cache to set request's cache. + */ + cache?: unknown; + /** + * A string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. Sets request's credentials. + */ + credentials?: unknown; + /** + * A Headers object, an object literal, or an array of two-item arrays to set request's headers. + */ + headers?: FetchHeadersInit; + /** + * A cryptographic hash of the resource to be fetched by request. Sets request's integrity. + */ + integrity?: string; + /** + * A boolean to set request's keepalive. + */ + keepalive?: boolean; + /** + * A string to set request's method. + */ + method?: string; + /** + * A string to indicate whether the request will use CORS, or will be restricted to same-origin URLs. Sets request's mode. + */ + mode?: unknown; + /** + * A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect. + */ + redirect?: unknown; + /** + * A string whose value is a same-origin URL, "about:client", or the empty string, to set request's referrer. + */ + referrer?: string; + /** + * A referrer policy to set request's referrerPolicy. + */ + referrerPolicy?: unknown; + /** + * An AbortSignal to set request's signal. + */ + signal?: unknown | null; + /** + * Can only be null. Used to disassociate request from any Window. + */ + window?: any; + + //Node-Fetch + agent?: unknown; + compress?: boolean; + counter?: number; + follow?: number; + hostname?: string; + port?: number; + protocol?: string; + size?: number; + highWaterMark?: number; + insecureHTTPParser?: boolean; +} diff --git a/http/typescript/fetch/src/utils/utils.browser.ts b/http/typescript/fetch/src/utils/utils.browser.ts new file mode 100644 index 0000000000..ed6da80d1b --- /dev/null +++ b/http/typescript/fetch/src/utils/utils.browser.ts @@ -0,0 +1,5 @@ + + +const browserURLSearchParams = URLSearchParams; + +export { browserURLSearchParams as URLSearchParams}; \ No newline at end of file diff --git a/http/typescript/fetch/src/utils/utils.ts b/http/typescript/fetch/src/utils/utils.ts new file mode 100644 index 0000000000..2adcb5e77e --- /dev/null +++ b/http/typescript/fetch/src/utils/utils.ts @@ -0,0 +1 @@ +export {URLSearchParams} from "url"; \ No newline at end of file From 9b9c1b0d146c40cee709812bfc1ba594f3014095 Mon Sep 17 00:00:00 2001 From: "nikithauc@gmail.com" Date: Thu, 7 Oct 2021 17:44:25 -0700 Subject: [PATCH 09/34] splitting tsconfig --- abstractions/typescript/package.json | 11 +- .../typescript/src/requestInformation.ts | 2 +- abstractions/typescript/tsconfig.base.json | 12 + abstractions/typescript/tsconfig.cjs.json | 10 + abstractions/typescript/tsconfig.es.json | 10 + abstractions/typescript/tsconfig.json | 44 - .../typescript/fetch/{src/utils => }/dom.d.ts | 0 http/typescript/fetch/package-lock.json | 4279 ++++++++++++++++- http/typescript/fetch/package.json | 31 +- http/typescript/fetch/src/httpClient.ts | 4 +- .../src/middlewares/browserFetchHandler.ts | 41 + .../src/middlewares/customFetchHandler.ts | 44 + .../fetch/src/middlewares/fetchHandler.ts | 13 +- .../src/middlewares/middlewareContext.ts | 2 +- .../fetch/src/middlewares/middlewareUtil.ts | 5 + .../options/RetryHandlerOptions.ts | 5 +- .../fetch/src/middlewares/retryHandler.ts | 10 +- .../fetch/src/utils/fetchDefinitions.ts | 3 +- .../fetch/test/common/httpClient.ts | 0 .../middleware/RedirectHandlerOptions.ts | 52 + .../test/common/middleware/RetryHandler.ts | 253 + .../common/middleware/RetryHandlerOptions.ts | 95 + http/typescript/fetch/test/node/httpClient.ts | 0 http/typescript/fetch/tsconfig.base.json | 11 + http/typescript/fetch/tsconfig.cjs.json | 11 + http/typescript/fetch/tsconfig.es.json | 10 + http/typescript/fetch/tsconfig.json | 33 - http/typescript/fetch/tsconfig.test.json | 16 + 28 files changed, 4869 insertions(+), 138 deletions(-) create mode 100644 abstractions/typescript/tsconfig.base.json create mode 100644 abstractions/typescript/tsconfig.cjs.json create mode 100644 abstractions/typescript/tsconfig.es.json delete mode 100644 abstractions/typescript/tsconfig.json rename http/typescript/fetch/{src/utils => }/dom.d.ts (100%) create mode 100644 http/typescript/fetch/src/middlewares/browserFetchHandler.ts create mode 100644 http/typescript/fetch/src/middlewares/customFetchHandler.ts create mode 100644 http/typescript/fetch/test/common/httpClient.ts create mode 100644 http/typescript/fetch/test/common/middleware/RedirectHandlerOptions.ts create mode 100644 http/typescript/fetch/test/common/middleware/RetryHandler.ts create mode 100644 http/typescript/fetch/test/common/middleware/RetryHandlerOptions.ts create mode 100644 http/typescript/fetch/test/node/httpClient.ts create mode 100644 http/typescript/fetch/tsconfig.base.json create mode 100644 http/typescript/fetch/tsconfig.cjs.json create mode 100644 http/typescript/fetch/tsconfig.es.json delete mode 100644 http/typescript/fetch/tsconfig.json create mode 100644 http/typescript/fetch/tsconfig.test.json diff --git a/abstractions/typescript/package.json b/abstractions/typescript/package.json index 37ee3d1e8b..fd7c2cd713 100644 --- a/abstractions/typescript/package.json +++ b/abstractions/typescript/package.json @@ -2,10 +2,13 @@ "name": "@microsoft/kiota-abstractions", "version": "1.0.19", "description": "Core abstractions for kiota generated libraries in TypeScript and JavaScript", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "main": "dist/cjs/index.js", + "types": "dist/cjs/index.d.ts", + "module": "dist/esm/index.js", "scripts": { - "build": "tsc -p tsconfig.json", + "build": "npm run build:cjs && npm run build:es", + "build:cjs": "tsc -p tsconfig.cjs.json", + "build:es": "tsc -p tsconfig.es.json", "test": "echo \"Error: no test specified\" && exit 1", "clean": "rm -r ./dist" }, @@ -32,4 +35,4 @@ "dependencies": { "uuid": "^8.3.2" } -} +} \ No newline at end of file diff --git a/abstractions/typescript/src/requestInformation.ts b/abstractions/typescript/src/requestInformation.ts index 2ba87e51f1..7ce577f810 100644 --- a/abstractions/typescript/src/requestInformation.ts +++ b/abstractions/typescript/src/requestInformation.ts @@ -41,7 +41,7 @@ export class RequestInformation{ /** The Query Parameters of the request. */ public queryParameters: Map = new Map(); //TODO: case insensitive /** The Request Headers. */ - public headers: Headers = new Headers(); //TODO: case insensitive + public headers: Map = new Map(); //TODO: case insensitive public options?: Map = new Map(); diff --git a/abstractions/typescript/tsconfig.base.json b/abstractions/typescript/tsconfig.base.json new file mode 100644 index 0000000000..8a77f38aaa --- /dev/null +++ b/abstractions/typescript/tsconfig.base.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "importHelpers": false, + "noEmitOnError": true, + "noImplicitAny": false, + "moduleResolution": "node", + "removeComments": false, + "sourceMap": true, + "declaration": true, + "downlevelIteration": true + } +} diff --git a/abstractions/typescript/tsconfig.cjs.json b/abstractions/typescript/tsconfig.cjs.json new file mode 100644 index 0000000000..ed747f5a33 --- /dev/null +++ b/abstractions/typescript/tsconfig.cjs.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions":{ + "target": "es5", + "module": "commonjs", + "outDir": "./dist/cjs", + }, + "exclude": ["node_modules", "dist"], + "include": ["./src/**/*.ts",] +} \ No newline at end of file diff --git a/abstractions/typescript/tsconfig.es.json b/abstractions/typescript/tsconfig.es.json new file mode 100644 index 0000000000..205f4aa2a5 --- /dev/null +++ b/abstractions/typescript/tsconfig.es.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "es6", + "target": "es6", + "outDir": "dist/es/" + }, + "exclude": ["node_modules", "dist"], + "include": ["./src/**/*.ts", "./test/**/*.ts"] +} diff --git a/abstractions/typescript/tsconfig.json b/abstractions/typescript/tsconfig.json deleted file mode 100644 index 9e71b60250..0000000000 --- a/abstractions/typescript/tsconfig.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "compilerOptions": { - /* Visit https://aka.ms/tsconfig.json to read more about this file */ - - /* Basic Options */ - "incremental": true, /* Enable incremental compilation */ - "target": "es2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ - "module": "es2020", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ - "lib": [ "ES2015", "ES2016", "ES2017", "ES2018", "ES2019", "ES2020", "DOM"], /* Specify library files to be included in the compilation. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ - "sourceMap": true, /* Generates corresponding '.map' file. */ - "outDir": "./dist", /* Redirect output structure to the directory. */ - "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - - /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ - "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - "strictNullChecks": true, /* Enable strict null checks. */ - "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - - /* Additional Checks */ - "noUnusedLocals": true, /* Report errors on unused locals. */ - "noUnusedParameters": true, /* Report errors on unused parameters. */ - "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ - - /* Module Resolution Options */ - "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - /* Advanced Options */ - "skipLibCheck": true, /* Skip type checking of declaration files. */ - "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ - }, - "include": [ - //"./src/utils/shims.ts", - "./src" - ], - "exclude": ["node_modules"] -} diff --git a/http/typescript/fetch/src/utils/dom.d.ts b/http/typescript/fetch/dom.d.ts similarity index 100% rename from http/typescript/fetch/src/utils/dom.d.ts rename to http/typescript/fetch/dom.d.ts diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index aa6d76a298..9e0ec0f993 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -4,6 +4,393 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "dev": true + }, + "@babel/core": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.8", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", + "dev": true, + "requires": { + "@babel/types": "^7.15.6", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + } + }, + "@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "dev": true, + "requires": { + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", + "dev": true + }, + "@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz", + "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==", + "dev": true, + "requires": { + "@cspotcode/source-map-consumer": "0.8.0" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, "@microsoft/kiota-abstractions": { "version": "file:../../../abstractions/typescript", "requires": { @@ -47,48 +434,3884 @@ } } }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/samsam": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", + "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" + }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, + "@types/chai": { + "version": "4.2.22", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.22.tgz", + "integrity": "sha512-tFfcE+DSTzWAgifkjik9AySNqIyNoYwmR+uecPwwD/XRNfvOjmC/FjCxpiUGDkDVDphPfCUecSQVFw+lN3M3kQ==", + "dev": true + }, + "@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==", + "dev": true + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "@types/mocha": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", + "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", + "dev": true + }, "@types/node": { "version": "16.10.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.3.tgz", - "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==" + "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==", + "dev": true }, - "node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "@types/sinon": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.4.tgz", + "integrity": "sha512-fOYjrxQv8zJsqOY6V6ecP4eZhQBxtY80X0er1VVnUIAIZo74jHm8e1vguG5Yt4Iv8W2Wr7TgibB8MfRe32k9pA==", + "dev": true, "requires": { - "whatwg-url": "^5.0.0" + "@sinonjs/fake-timers": "^7.1.0" } }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } }, - "typescript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", - "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", "dev": true }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "requires": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "async": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.1.tgz", + "integrity": "sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg==", + "dev": true + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "requires": { + "resolve": "^1.17.0" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", + "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001264", + "electron-to-chromium": "^1.3.857", + "escalade": "^3.1.1", + "node-releases": "^1.1.77", + "picocolors": "^0.2.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001265", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", + "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", + "dev": true + }, + "chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "date-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "domain-browser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.861", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.861.tgz", + "integrity": "sha512-GZyflmpMnZRdZ1e2yAyvuFwz1MPSVQelwHX4TJZyXypB8NcxdPvPNwy5lOTxnlkrK13EiQzyTPugRSnj6cBgKg==", + "dev": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "engine.io": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.1.tgz", + "integrity": "sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.0", + "ws": "~7.4.2" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.3.tgz", + "integrity": "sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA==", + "dev": true, + "requires": { + "base64-arraybuffer": "0.1.4" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dev": true, + "requires": { + "source-map": "~0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-core-module": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", + "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", + "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.3.tgz", + "integrity": "sha512-0i77ZFLsb9U3DHi22WzmIngVzfoyxxbQcZRqlF3KoKmCJGq9nhFHoGi8FqBztN2rE8w6hURnZghetn0xpkVb6A==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" + }, + "karma": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.4.tgz", + "integrity": "sha512-hbhRogUYIulfkBTZT7xoPrCYhRBnBoqbbL4fszWD0ReFGUxU+LYBr3dwKdAluaDQ/ynT9/7C+Lf7pPNW4gSx4Q==", + "dev": true, + "requires": { + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "colors": "^1.4.0", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.3.0", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^3.1.0", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.28", + "yargs": "^16.1.1" + } + }, + "karma-chai": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/karma-chai/-/karma-chai-0.1.0.tgz", + "integrity": "sha1-vuWtQEAFF4Ea40u5RfdikJEIt5o=", + "dev": true + }, + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "dev": true, + "requires": { + "which": "^1.2.1" + } + }, + "karma-firefox-launcher": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.1.tgz", + "integrity": "sha512-VzDMgPseXak9DtfyE1O5bB2BwsMy1zzO1kUxVW1rP0yhC4tDNJ0p3JoFdzvrK4QqVzdqUMa9Rx9YzkdFp8hz3Q==", + "dev": true, + "requires": { + "is-wsl": "^2.2.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "karma-mocha": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", + "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", + "dev": true, + "requires": { + "minimist": "^1.2.3" + } + }, + "karma-typescript": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-5.5.2.tgz", + "integrity": "sha512-2rNhiCMrIF+VR8jMuovOLSRjNkjdoE/kQ4XYZU94lMkHNQtnqCaToAnztMj4fuOPRErL7VIkwvJEO7jBd47Q6A==", + "dev": true, + "requires": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2", + "assert": "^2.0.0", + "async": "^3.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.4.3", + "combine-source-map": "^0.8.0", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "convert-source-map": "^1.7.0", + "crypto-browserify": "^3.12.0", + "diff": "^4.0.1", + "domain-browser": "^4.16.0", + "events": "^3.2.0", + "glob": "^7.1.6", + "https-browserify": "^1.0.0", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.19", + "log4js": "^6.3.0", + "minimatch": "^3.0.4", + "os-browserify": "^0.3.0", + "pad": "^3.2.0", + "path-browserify": "^1.0.0", + "process": "^0.11.10", + "punycode": "^2.1.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.1.1", + "source-map": "^0.7.3", + "stream-browserify": "^3.0.0", + "stream-http": "^3.1.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.11", + "tmp": "^0.2.1", + "tty-browserify": "^0.0.1", + "url": "^0.11.0", + "util": "^0.12.1", + "vm-browserify": "^1.1.2" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log4js": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "dev": true, + "requires": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + }, + "mime-db": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", + "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", + "dev": true + }, + "mime-types": { + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", + "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "dev": true, + "requires": { + "mime-db": "1.50.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mocha": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "nise": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", + "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", + "requires": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node-fetch": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", + "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "node-releases": { + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "pad": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pad/-/pad-3.2.0.tgz", + "integrity": "sha512-2u0TrjcGbOjBTJpyewEl4hBO3OeX5wWue7eIFPzQTg6wFSvoaHcBTTUY5m+n0hd04gmTCPuY0kCpVIVuw5etwg==", + "dev": true, + "requires": { + "wcwidth": "^1.0.1" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", + "dev": true + }, + "sinon": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", + "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + }, + "dependencies": { + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "socket.io": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz", + "integrity": "sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw==", + "dev": true, + "requires": { + "@types/cookie": "^0.4.0", + "@types/cors": "^2.8.8", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.1", + "engine.io": "~4.1.0", + "socket.io-adapter": "~2.1.0", + "socket.io-parser": "~4.0.3" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz", + "integrity": "sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==", + "dev": true + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dev": true, + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "requires": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } + } + }, + "stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } + } + }, + "streamroller": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", + "dev": true, + "requires": { + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "ts-node": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", + "integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "0.6.1", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "yn": "3.1.1" + } + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", + "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "which-typed-array": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", + "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.7" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index 1fc3262a4f..094e86ccee 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -9,8 +9,12 @@ ], "types": "dist/index.d.ts", "scripts": { - "build": "tsc -p tsconfig.json", - "test": "echo \"Error: no test specified\" && exit 1", + "build": "npm run build:cjs && npm run build:es", + "build:cjs": "tsc -p tsconfig.cjs.json", + "build:es": "tsc -p tsconfig.es.json", + "test:cjs": "tsc -b tsconfig.test.json && mocha 'dist/cjs/test/common/**/*.js'", + "test:es": " tsc -b tsconfig.test.json && mocha 'dist/es/test/common/**/*.js' --require esm", + "test": "npm run test:cjs && npm run test:es", "clean": "rm -r ./dist" }, "repository": { @@ -34,11 +38,26 @@ }, "dependencies": { "@microsoft/kiota-abstractions": "file:../../../abstractions/typescript", - "@types/node": "^16.10.3", - "node-fetch": "^2.6.5", - "tslib": "^2.3.1" + "sinon": "^11.1.2" }, "devDependencies": { + "@types/chai": "^4.2.22", + "@types/mocha": "^9.0.0", + "@types/node": "^16.10.3", + "@types/sinon": "^10.0.4", + "chai": "^4.3.4", + "esm": "^3.2.25", + "karma": "^6.3.4", + "karma-chai": "^0.1.0", + "karma-chrome-launcher": "^3.1.0", + "karma-firefox-launcher": "^2.1.1", + "karma-mocha": "^2.0.1", + "karma-typescript": "^5.5.2", + "mocha": "^8.4.0", + "node-fetch": "^2.6.5", + "nyc": "^15.1.0", + "ts-node": "^10.2.1", + "tslib": "^2.3.1", "typescript": "^4.4.3" } -} +} \ No newline at end of file diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index 73c7a12a50..73967b740e 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -1,6 +1,6 @@ import { Middleware } from "./middlewares/middleware"; import { MiddlewareContext } from "./middlewares/middlewareContext"; -import { FetchHandler } from "./middlewares/fetchHandler"; +import { customFetchHandler } from "./middlewares/customFetchHandler"; import { MiddlewareFactory } from "./middlewares/middlewareFactory"; import { FetchRequestInfo, FetchRequestInit , FetchResponse } from "./utils/fetchDefinitions"; @@ -21,7 +21,7 @@ export class HttpClient { if (middlewares) { if(customFetch){ - this.setMiddleware(...middlewares, new FetchHandler(customFetch)); + this.setMiddleware(...middlewares, new customFetchHandler(customFetch)); } else { this.setMiddleware(...middlewares); diff --git a/http/typescript/fetch/src/middlewares/browserFetchHandler.ts b/http/typescript/fetch/src/middlewares/browserFetchHandler.ts new file mode 100644 index 0000000000..13c9c117ff --- /dev/null +++ b/http/typescript/fetch/src/middlewares/browserFetchHandler.ts @@ -0,0 +1,41 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module FetchHandler + */ + +import { MiddlewareContext } from "./middlewareContext"; +import { Middleware } from "./middleware"; +import { FetchResponse, FetchRequestInfo, FetchRequestInit } from "../utils/fetchDefinitions"; + +/** + * @class + * @implements Middleware + * Class for FetchHandler + */ + +export class browserFetchHandler implements Middleware { + + /** + * @private + * The next middleware in the middleware chain + */ + next: Middleware; + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The request context object + * @returns A promise that resolves to nothing + */ + public async execute(context: MiddlewareContext): Promise { + context.response = await fetch(context.request, context.options as RequestInit) as FetchResponse; + return; + } +} diff --git a/http/typescript/fetch/src/middlewares/customFetchHandler.ts b/http/typescript/fetch/src/middlewares/customFetchHandler.ts new file mode 100644 index 0000000000..58a0cc7819 --- /dev/null +++ b/http/typescript/fetch/src/middlewares/customFetchHandler.ts @@ -0,0 +1,44 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module FetchHandler + */ + +import fetch from "node-fetch"; +import { MiddlewareContext } from "./middlewareContext"; +import { Middleware } from "./middleware"; +import { FetchResponse, FetchRequestInfo, FetchRequestInit } from "../utils/fetchDefinitions"; + +/** + * @class + * @implements Middleware + * Class for FetchHandler + */ + +export class customFetchHandler implements Middleware { + + /** + * @private + * The next middleware in the middleware chain + */ + next: Middleware; + + constructor(private customFetch?: (input: FetchRequestInfo, init: FetchRequestInit) => Promise) { }; + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The request context object + * @returns A promise that resolves to nothing + */ + public async execute(context: MiddlewareContext): Promise { + context.response = await this.customFetch(context.request, context.options) as FetchResponse; + return; + } +} diff --git a/http/typescript/fetch/src/middlewares/fetchHandler.ts b/http/typescript/fetch/src/middlewares/fetchHandler.ts index 464edad437..755206ecbf 100644 --- a/http/typescript/fetch/src/middlewares/fetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/fetchHandler.ts @@ -9,10 +9,10 @@ * @module FetchHandler */ -import fetch from "node-fetch"; +import {fetch as nodeFetch} from "node-fetch"; import { MiddlewareContext } from "./middlewareContext"; import { Middleware } from "./middleware"; -import { FetchResponse, FetchRequestInfo, FetchRequestInit } from "../utils/fetchDefinitions"; +import { FetchResponse } from "../utils/fetchDefinitions"; /** * @class @@ -28,8 +28,6 @@ export class FetchHandler implements Middleware { */ next: Middleware; - constructor(private customFetch?: (input: FetchRequestInfo, init: FetchRequestInit) => Promise) {}; - /** * @public * @async @@ -38,12 +36,7 @@ export class FetchHandler implements Middleware { * @returns A promise that resolves to nothing */ public async execute(context: MiddlewareContext): Promise { - if (this.customFetch) { - context.response = await this.customFetch(context.request, context.options) as FetchResponse; - } - else { - context.response = await fetch(context.request, context.options) as FetchResponse; - } + context.response = await nodeFetch(context.request, context.options) as FetchResponse; return; } } diff --git a/http/typescript/fetch/src/middlewares/middlewareContext.ts b/http/typescript/fetch/src/middlewares/middlewareContext.ts index a945d7c84f..533047b926 100644 --- a/http/typescript/fetch/src/middlewares/middlewareContext.ts +++ b/http/typescript/fetch/src/middlewares/middlewareContext.ts @@ -1,5 +1,5 @@ import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; -import { MiddlewareControl } from "./MiddlewareControl"; +import { MiddlewareControl } from "./middlewareControl"; /** * @interface diff --git a/http/typescript/fetch/src/middlewares/middlewareUtil.ts b/http/typescript/fetch/src/middlewares/middlewareUtil.ts index c34020bdac..1287de73ca 100644 --- a/http/typescript/fetch/src/middlewares/middlewareUtil.ts +++ b/http/typescript/fetch/src/middlewares/middlewareUtil.ts @@ -21,11 +21,16 @@ import { FetchRequest, FetchRequestInfo, FetchRequestInit } from "../utils/fetch */ export const getRequestHeader = (request: FetchRequestInfo, options: FetchRequestInit | undefined, key: string): string | null => { let value: string = null; + console.log(" inside get requestheader" + value); if (typeof request !== 'string') { + console.log(" inside ! string" + value); value = (request as FetchRequest).headers.get(key); } else if (typeof options !== "undefined" && options.headers !== undefined) { + console.log(" inside option =svalue" + value); value = options.headers[key]; + console.log(" inside option =svalue" + value); } + console.log("value" + value); return value; }; diff --git a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts index 5ed3d970e8..5197a95d77 100644 --- a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts +++ b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts @@ -10,7 +10,7 @@ */ import { MiddlewareOption } from "./middlewareOption"; -import {FetchResponse, FetchRequestInit, FetchRequestInfo} from "../../utils/fetchDefinitions" +import {FetchResponse, FetchRequestInit} from "../../utils/fetchDefinitions" /** * @type * A type declaration for shouldRetry callback @@ -19,7 +19,8 @@ export type ShouldRetry = (delay: number, attempt: number, request: string, opti /** * @class - * @implements MiddlewareOptions + * @implements Middleware + * Options * Class for RetryHandlerOptions */ diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts index 01a1a1c4a4..21457ce0e9 100644 --- a/http/typescript/fetch/src/middlewares/retryHandler.ts +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -14,7 +14,7 @@ import { HttpMethod } from "@microsoft/kiota-abstractions"; import { Middleware } from "./middleware"; import { getRequestHeader, setRequestHeader } from "./middlewareUtil"; import { RetryHandlerOptions } from "./options/retryHandlerOptions"; -import { MiddlewareControl } from "./MiddlewareControl"; +import { MiddlewareControl } from "./middlewareControl"; import {FetchResponse, FetchRequestInit, FetchRequestInfo} from "../utils/fetchDefinitions" /** @@ -90,7 +90,7 @@ export class RetryHandler implements Middleware { * @returns Whether the payload is buffered or not */ private isBuffered(request: FetchRequestInfo, options: FetchRequestInit | undefined): boolean { - const method = options + const method = options.method; const isPutPatchOrPost: boolean = method === HttpMethod.PUT || method === HttpMethod.PATCH || method === HttpMethod.POST; if (isPutPatchOrPost) { const isStream = getRequestHeader(request, options, "Content-Type") === "application/octet-stream"; @@ -156,7 +156,7 @@ export class RetryHandler implements Middleware { if (context.middlewareControl instanceof MiddlewareControl) { options = context.middlewareControl.getMiddlewareOptions(RetryHandlerOptions) as RetryHandlerOptions; } - if (typeof options === "undefined") { + if (!options) { options = Object.assign(new RetryHandlerOptions(), this.options); } return options; @@ -173,10 +173,10 @@ export class RetryHandler implements Middleware { */ private async executeWithRetry(context: MiddlewareContext, retryAttempts: number, options: RetryHandlerOptions): Promise { await this.next.execute(context); - if (retryAttempts < options.maxRetries && this.isRetry(context.response) && this.isBuffered(context.request, context.options) && options.shouldRetry(options.delay, retryAttempts, context.request, context.options, context.response)) { + if (retryAttempts < options.maxRetries && this.isRetry(context.response) && this.isBuffered(context.request, context.options) && options.shouldRetry(options.delay, retryAttempts, context.request, context.options, context.response!)) { ++retryAttempts; setRequestHeader(context.request, context.options, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); - const delay = this.getDelay(context.response, retryAttempts, options.delay); + const delay = this.getDelay(context.response!, retryAttempts, options.delay); await this.sleep(delay); return await this.executeWithRetry(context, retryAttempts, options); } else { diff --git a/http/typescript/fetch/src/utils/fetchDefinitions.ts b/http/typescript/fetch/src/utils/fetchDefinitions.ts index f8dc2c2724..b6519a43cf 100644 --- a/http/typescript/fetch/src/utils/fetchDefinitions.ts +++ b/http/typescript/fetch/src/utils/fetchDefinitions.ts @@ -52,7 +52,6 @@ export type FetchResponse = Response & FetchBody & { } - /** This Fetch API interface represents a resource request. */ export type FetchRequest = Request | FetchBody & { /** @@ -176,4 +175,4 @@ export type FetchRequestInit = RequestInit |{ size?: number; highWaterMark?: number; insecureHTTPParser?: boolean; -} +} \ No newline at end of file diff --git a/http/typescript/fetch/test/common/httpClient.ts b/http/typescript/fetch/test/common/httpClient.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/http/typescript/fetch/test/common/middleware/RedirectHandlerOptions.ts b/http/typescript/fetch/test/common/middleware/RedirectHandlerOptions.ts new file mode 100644 index 0000000000..307cefde45 --- /dev/null +++ b/http/typescript/fetch/test/common/middleware/RedirectHandlerOptions.ts @@ -0,0 +1,52 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +import { assert } from "chai"; + +import { RedirectHandlerOptions } from "../../../src/middlewares/options/redirectHandlerOption"; + +describe("RedirectHandlerOptions.ts", () => { + describe("constructor", () => { + it("Should initialize the instance with given options", () => { + const shouldRedirect = (response: Response) => { + if (response.status === 301) { + return true; + } + return false; + }; + const maxRedirects = 5; + const options = new RedirectHandlerOptions(maxRedirects, shouldRedirect); + assert.equal(options.maxRedirects, maxRedirects); + assert.equal(options.shouldRedirect, shouldRedirect); + }); + + it("Should throw error for setting max redirects more than allowed", () => { + try { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const options = new RedirectHandlerOptions(100); + throw new Error("Test Failed - Something wrong with the max redirects value redirection"); + } catch (error) { + assert.equal(error.name, "MaxLimitExceeded"); + } + }); + it("Should throw error for setting max redirects to negative", () => { + try { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const options = new RedirectHandlerOptions(-10); + throw new Error(" Test Failed - Something wrong with the max redirects value redirection"); + } catch (error) { + assert.equal(error.name, "MinExpectationNotMet"); + } + }); + + it("Should initialize instance with default options", () => { + const options = new RedirectHandlerOptions(); + assert.equal(options.maxRedirects, RedirectHandlerOptions["DEFAULT_MAX_REDIRECTS"]); + assert.equal(options.shouldRedirect, RedirectHandlerOptions["defaultShouldRetry"]); + }); + }); +}); diff --git a/http/typescript/fetch/test/common/middleware/RetryHandler.ts b/http/typescript/fetch/test/common/middleware/RetryHandler.ts new file mode 100644 index 0000000000..68fa03f9fc --- /dev/null +++ b/http/typescript/fetch/test/common/middleware/RetryHandler.ts @@ -0,0 +1,253 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +import { assert } from "chai"; +import * as sinon from "sinon"; + +import { MiddlewareContext } from "../../../src/middlewares/middlewareContext"; +import { FetchRequestInit } from "../../../src/utils/fetchDefinitions"; +import { MiddlewareControl } from "../../../src/middlewares/middlewareControl"; +import { RetryHandlerOptions, ShouldRetry } from "../../../src/middlewares/options/retryHandlerOptions"; +import { RetryHandler } from "../../../src/middlewares/RetryHandler"; +import { FetchHandler } from "../../../src/middlewares/fetchHandler"; +console.log(typeof Response) + +var Response = Response; +if(typeof Response != "object"){ + getResponse().then((res)=>{ console.log(res);Response = res}); + +} +async function getResponse(){ + const s = await import("node-fetch"); + console.log(s) + return s["Response"]; + +} +describe("RetryHandler.ts", function () { + this.timeout(20 * 1000); + const retryHandler = new RetryHandler(); + const retryHandlerOptions = new RetryHandlerOptions(); + const tooManyRequestsResponseWithRetryAfterDelay = new Response("", { + status: 429, + statusText: "TooManyRequests", + headers: { + "Retry-After": "10", + }, + }); + const tooManyRequestsResponseWithRetyAfterDate = new Response("", { + status: 429, + statusText: "TooManyRequests", + headers: { + "Retry-After": new Date(Date.now() + 10000).toUTCString(), + }, + }); + const serviceUnavailableResponse = new Response("", { + status: 503, + statusText: "ServiceUnavailable", + }); + const gatewayTimeoutResponse = new Response("", { + status: 504, + statusText: "GatewayTimeout", + }); + const nonRetryResponse = new Response("", { + status: 200, + statusText: "OK", + }); + + describe("constructor", () => { + it("Should set the option member with retryHanderOptions", () => { + const handler = new RetryHandler(retryHandlerOptions); + assert.isDefined(handler["options"]); + }); + + it("Should create retryHandler instance with default retryHandlerOptions", () => { + const handler = new RetryHandler(); + assert.isDefined(handler["options"]); + }); + }); + + describe("isRetry", () => { + it("Should return true for 429 response", () => { + assert.isTrue(retryHandler["isRetry"](tooManyRequestsResponseWithRetryAfterDelay)); + }); + + it("Should return true for 503 response", () => { + assert.isTrue(retryHandler["isRetry"](serviceUnavailableResponse)); + }); + + it("Should return true for 504 response", () => { + assert.isTrue(retryHandler["isRetry"](gatewayTimeoutResponse)); + }); + + it("Should return false for non retry response", () => { + assert.isFalse(retryHandler["isRetry"](nonRetryResponse)); + }); + }); + + describe("isBuffered", () => { + const url = "dummy_url"; + it("Should succeed for non post, patch, put requests", () => { + const options: FetchRequestInit = { + method: "GET", + }; + assert.isTrue(retryHandler["isBuffered"](url, options)); + }); + + it("Should succeed for post request with non stream request", () => { + const options: FetchRequestInit = { + method: "POST", + body: "test", + }; + assert.isTrue(retryHandler["isBuffered"](url, options)); + }); + + it("Should fail for stream request", () => { + const options: FetchRequestInit + = { + method: "PUT", + headers: { + "Content-Type": "application/octet-stream", + }, + }; + assert.isFalse(retryHandler["isBuffered"](url, options)); + }); + }); + + describe("getDelay", () => { + it("Should return retry delay from the response header", () => { + const delay = retryHandler["getDelay"](tooManyRequestsResponseWithRetryAfterDelay, 1, 5); + assert.equal(delay, 10); + }); + + it("Should return retry delay from the response header mentioning delay time", () => { + const delay = retryHandler["getDelay"](tooManyRequestsResponseWithRetyAfterDate, 1, 5); + assert.isDefined(delay); + }); + + it("Should return delay without exponential backoff", () => { + const delay = retryHandler["getDelay"](gatewayTimeoutResponse, 1, 10); + assert.isAbove(delay, 10); + assert.isBelow(delay, 11); + }); + + it("Should return delay with exponential backoff", () => { + const delay = retryHandler["getDelay"](gatewayTimeoutResponse, 2, 10); + assert.isAbove(delay, 12); + assert.isBelow(delay, 13); + }); + + it("Should return max delay for if the calculated delay is more", () => { + const delay = retryHandler["getDelay"](gatewayTimeoutResponse, 10, 100); + assert.isAbove(delay, 180); + assert.isBelow(delay, 181); + }); + }); + + describe("getExponentialBackOffTime", () => { + it("Should return 0 delay for 0th attempt i.e for a fresh request", () => { + const time = retryHandler["getExponentialBackOffTime"](0); + assert.equal(time, 0); + }); + + it("Should return attempt time", () => { + const time = retryHandler["getExponentialBackOffTime"](1); + assert.equal(time, 1); + }); + }); + + describe("sleep", async () => { + it("Should run the sleep method for 1 second", async () => { + await retryHandler["sleep"](1); + }); + }); + + describe("getOptions", () => { + it("Should return the options in the context object", () => { + const delay = 10; + const maxRetries = 8; + const shouldRetry: ShouldRetry = () => false; + const options = new RetryHandlerOptions(delay, maxRetries, shouldRetry); + const cxt: MiddlewareContext = { + request: "url", + middlewareControl: new MiddlewareControl([options]), + }; + const o = retryHandler["getOptions"](cxt); + assert.equal(o.delay, delay); + assert.equal(o.maxRetries, maxRetries); + assert.equal(o.shouldRetry, shouldRetry); + }); + + it("Should return the default set of options in the middleware", () => { + const cxt: MiddlewareContext = { + request: "url", + }; + const o = retryHandler["getOptions"](cxt); + assert.equal(o.delay, retryHandler["options"].delay); + assert.equal(o.maxRetries, retryHandler["options"].maxRetries); + assert.equal(o.shouldRetry, retryHandler["options"].shouldRetry); + }); + }); + + describe("executeWithRetry", async () => { + const options = new RetryHandlerOptions(); + const handler = new RetryHandler(options); + const fetchHandler = new FetchHandler(); + handler.next = fetchHandler; + + + const cxt: MiddlewareContext = { + request: "url", + options: { + method: "GET", + }, + }; + it("Should return non retried response incase of maxRetries busted out", async () => { + sinon.stub(fetchHandler, "execute").callsFake((ctx: MiddlewareContext): Promise => { + console.log("calls fake"); + ctx.response = new Response(null, { status: 429 }), new Response("ok", { status: 200 }); + return; + }) + await handler["executeWithRetry"](cxt, RetryHandlerOptions["MAX_MAX_RETRIES"], options); + assert.equal(cxt.response.status, 429); + }); + + // it("Should return succeeded response for non retry response", async () => { + // dummyHTTPHandler.setResponses([new Response("ok", { status: 200 })]); + // await handler["executeWithRetry"](cxt, 0, options); + // assert.equal(cxt.response.status, 200); + // }); + + // it("Should return non retried response for streaming request", async () => { + // const c: MiddlewareContext = { + // request: "url", + // options: { + // method: "POST", + // headers: { + // "Content-Type": "application/octet-stream", + // }, + // }, + // }; + // dummyHTTPHandler.setResponses([new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); + // await handler["executeWithRetry"](c, 0, options); + // assert.equal(c.response.status, 429); + // }); + + // it("Should successfully retry and return ok response", async () => { + // const opts = new RetryHandlerOptions(1); + // dummyHTTPHandler.setResponses([new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); + // await handler["executeWithRetry"](cxt, 0, opts); + // assert.equal(cxt.response.status, 200); + // }); + + // it("Should fail by exceeding max retries", async () => { + // const opts = new RetryHandlerOptions(1, 2); + // dummyHTTPHandler.setResponses([new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); + // await handler["executeWithRetry"](cxt, 0, opts); + // assert.equal(cxt.response.status, 429); + //}); +}); +}); diff --git a/http/typescript/fetch/test/common/middleware/RetryHandlerOptions.ts b/http/typescript/fetch/test/common/middleware/RetryHandlerOptions.ts new file mode 100644 index 0000000000..103254701c --- /dev/null +++ b/http/typescript/fetch/test/common/middleware/RetryHandlerOptions.ts @@ -0,0 +1,95 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +import { assert } from "chai"; + +import { RetryHandlerOptions, ShouldRetry } from "../../../src/middlewares/options/retryHandlerOptions"; + +describe("RetryHandlerOptions.ts", () => { + describe("Constructor", () => { + it("Should use default values if not given", () => { + const options = new RetryHandlerOptions(); + assert.equal(options["delay"], RetryHandlerOptions["DEFAULT_DELAY"]); + assert.equal(options["maxRetries"], RetryHandlerOptions["DEFAULT_MAX_RETRIES"]); + assert.equal(options["shouldRetry"], RetryHandlerOptions["defaultShouldRetry"]); + }); + + it("Should throw error for both delay and maxRetries are higher than the limit", () => { + try { + const options = new RetryHandlerOptions(1000, 1000); + throw new Error("Test Failed - Something wrong with the delay and maxRetries max limit validation"); + } catch (error) { + assert.equal(error.name, "MaxLimitExceeded"); + } + }); + + it("Should throw error for delay is higher than the limit", () => { + try { + const options = new RetryHandlerOptions(1000, 2); + throw new Error("Test Failed - Test Failed - Something wrong with the delay max limit validation"); + } catch (error) { + assert.equal(error.name, "MaxLimitExceeded"); + } + }); + + it("Should throw error for maxRetries is higher than the limit", () => { + try { + const options = new RetryHandlerOptions(1, 2000); + throw new Error("Test Failed - Something wrong with the maxRetries max limit validation"); + } catch (error) { + assert.equal(error.name, "MaxLimitExceeded"); + } + }); + + it("Should throw error for both delay and maxRetries are negative", () => { + try { + const options = new RetryHandlerOptions(-1, -100); + throw new Error("Test Failed - Something wrong with the delay and maxRetries max limit validation"); + } catch (error) { + assert.equal(error.name, "MinExpectationNotMet"); + } + }); + + it("Should throw error for delay is negative", () => { + try { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const options = new RetryHandlerOptions(-5, 2); + throw new Error("Test Failed - Something wrong with the delay max limit validation"); + } catch (error) { + assert.equal(error.name, "MinExpectationNotMet"); + } + }); + + it("Should throw error for maxRetries is negative", () => { + try { + const options = new RetryHandlerOptions(1, -10); + throw new Error("Test Failed - Something wrong with the maxRetries max limit validation"); + } catch (error) { + assert.equal(error.name, "MinExpectationNotMet"); + } + }); + + it("Should accept all the given values", () => { + const delay = 1; + const maxRetries = 3; + const shouldRetry: ShouldRetry = (d, a, req, o, res) => { + return false; + }; + const options = new RetryHandlerOptions(delay, maxRetries, shouldRetry); + assert.equal(options.delay, delay); + assert.equal(options.maxRetries, maxRetries); + assert.equal(options.shouldRetry, shouldRetry); + }); + }); + + describe("getMaxDelay", () => { + it("Should return the max delay value", () => { + const options = new RetryHandlerOptions(); + assert.equal(options.getMaxDelay(), RetryHandlerOptions["MAX_DELAY"]); + }); + }); +}); diff --git a/http/typescript/fetch/test/node/httpClient.ts b/http/typescript/fetch/test/node/httpClient.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/http/typescript/fetch/tsconfig.base.json b/http/typescript/fetch/tsconfig.base.json new file mode 100644 index 0000000000..bcd34dddb6 --- /dev/null +++ b/http/typescript/fetch/tsconfig.base.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "importHelpers": true, + "noEmitOnError": true, + "noImplicitAny": false, + "moduleResolution": "node", + "removeComments": false, + "sourceMap": true, + "declaration": true + } +} diff --git a/http/typescript/fetch/tsconfig.cjs.json b/http/typescript/fetch/tsconfig.cjs.json new file mode 100644 index 0000000000..b355ff9eaf --- /dev/null +++ b/http/typescript/fetch/tsconfig.cjs.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions":{ + "target": "es5", + "module": "commonjs", + "outDir": "./dist/cjs", + "composite": true + }, + "exclude": ["node_modules", "dist"], + "include": ["./src/**/*.ts"] +} \ No newline at end of file diff --git a/http/typescript/fetch/tsconfig.es.json b/http/typescript/fetch/tsconfig.es.json new file mode 100644 index 0000000000..205f4aa2a5 --- /dev/null +++ b/http/typescript/fetch/tsconfig.es.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "es6", + "target": "es6", + "outDir": "dist/es/" + }, + "exclude": ["node_modules", "dist"], + "include": ["./src/**/*.ts", "./test/**/*.ts"] +} diff --git a/http/typescript/fetch/tsconfig.json b/http/typescript/fetch/tsconfig.json deleted file mode 100644 index 88f3834a40..0000000000 --- a/http/typescript/fetch/tsconfig.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "compilerOptions": { - "incremental": true, /* Enable incremental compilation */ - "target": "es2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ - "module": "es2020", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ - "lib": [ - "ES2015", - "ES2016", - "ES2017", - "ES2018", - "ES2019", - "ES2020", - ], - "declaration": true, - "sourceMap": true, - "outDir": "./dist", - "rootDir": "./src", - /* Strict Type-Checking Options */ - "strict": true, - "noImplicitAny": false, - "strictNullChecks": false, - "strictFunctionTypes": true, - "noImplicitThis": true, - "noUnusedParameters": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedIndexedAccess": true, - "moduleResolution": "node", - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true - } -} \ No newline at end of file diff --git a/http/typescript/fetch/tsconfig.test.json b/http/typescript/fetch/tsconfig.test.json new file mode 100644 index 0000000000..33f639d635 --- /dev/null +++ b/http/typescript/fetch/tsconfig.test.json @@ -0,0 +1,16 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions":{ + "target": "es5", + "module": "commonjs", + "outDir": "./dist/cjs/test", + "lib":["dom"] + }, + "exclude": ["node_modules", "dist","src"], + "include": ["./test/**/*.ts"], + "references": [ + { + "path": "./tsconfig.cjs.json" + } + ] +} \ No newline at end of file From 090c2015e05c710e72ce7bea1c65ed75ff2a4523 Mon Sep 17 00:00:00 2001 From: "nikithauc@gmail.com" Date: Fri, 8 Oct 2021 18:07:49 -0700 Subject: [PATCH 10/34] adding redirect and middlewareutil tests --- http/typescript/fetch/package.json | 2 +- .../fetch/src/middlewares/middlewareUtil.ts | 9 +- .../fetch/src/utils/fetchDefinitions.ts | 2 +- .../test/common/middleware/MiddlewareUtil.ts | 145 ++++++++ .../test/common/middleware/RedirectHandler.ts | 342 ++++++++++++++++++ .../test/common/middleware/RetryHandler.ts | 101 +++--- .../common/middleware/dummyFetchHandler.ts | 61 ++++ .../typescript/fetch/test/common/testUtils.ts | 5 + 8 files changed, 606 insertions(+), 61 deletions(-) create mode 100644 http/typescript/fetch/test/common/middleware/MiddlewareUtil.ts create mode 100644 http/typescript/fetch/test/common/middleware/RedirectHandler.ts create mode 100644 http/typescript/fetch/test/common/middleware/dummyFetchHandler.ts create mode 100644 http/typescript/fetch/test/common/testUtils.ts diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index 094e86ccee..5a57b7724a 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -12,7 +12,7 @@ "build": "npm run build:cjs && npm run build:es", "build:cjs": "tsc -p tsconfig.cjs.json", "build:es": "tsc -p tsconfig.es.json", - "test:cjs": "tsc -b tsconfig.test.json && mocha 'dist/cjs/test/common/**/*.js'", + "test:cjs": "tsc -b tsconfig.test.json && mocha 'dist/cjs/test/common/**/*.js' -grep MiddlewareUtil.ts", "test:es": " tsc -b tsconfig.test.json && mocha 'dist/es/test/common/**/*.js' --require esm", "test": "npm run test:cjs && npm run test:es", "clean": "rm -r ./dist" diff --git a/http/typescript/fetch/src/middlewares/middlewareUtil.ts b/http/typescript/fetch/src/middlewares/middlewareUtil.ts index 1287de73ca..39072b81ec 100644 --- a/http/typescript/fetch/src/middlewares/middlewareUtil.ts +++ b/http/typescript/fetch/src/middlewares/middlewareUtil.ts @@ -26,7 +26,7 @@ export const getRequestHeader = (request: FetchRequestInfo, options: FetchReques console.log(" inside ! string" + value); value = (request as FetchRequest).headers.get(key); } else if (typeof options !== "undefined" && options.headers !== undefined) { - console.log(" inside option =svalue" + value); + console.log(options.headers); value = options.headers[key]; console.log(" inside option =svalue" + value); } @@ -47,6 +47,10 @@ export const setRequestHeader = (request: FetchRequestInfo, options: FetchReques if (typeof request !== 'string') { (request as FetchRequest).headers.set(key, value); } else if (typeof options !== "undefined") { + if(!options.headers){ + options.headers = {}; + } + console.log(options.headers); options.headers[key] = value; } }; @@ -64,6 +68,9 @@ export const appendRequestHeader = (request: FetchRequestInfo, options: FetchReq if (typeof request !== "string") { (request as FetchRequest).headers.append(key, value); } else if (typeof options !== "undefined") { + if(!options.headers){ + options.headers = {}; + } if (options.headers[key] === undefined) { options.headers[key] = value; } else { diff --git a/http/typescript/fetch/src/utils/fetchDefinitions.ts b/http/typescript/fetch/src/utils/fetchDefinitions.ts index b6519a43cf..abed5e9601 100644 --- a/http/typescript/fetch/src/utils/fetchDefinitions.ts +++ b/http/typescript/fetch/src/utils/fetchDefinitions.ts @@ -110,7 +110,7 @@ export type FetchRequest = Request | FetchBody & { } -export type FetchRequestInit = RequestInit |{ +export type FetchRequestInit = Omit &{ /** * A BodyInit object or null to set request's body. */ diff --git a/http/typescript/fetch/test/common/middleware/MiddlewareUtil.ts b/http/typescript/fetch/test/common/middleware/MiddlewareUtil.ts new file mode 100644 index 0000000000..9cb1741899 --- /dev/null +++ b/http/typescript/fetch/test/common/middleware/MiddlewareUtil.ts @@ -0,0 +1,145 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ +/* tslint:disable */ +import { assert } from "chai"; + +import { FetchRequestInit } from "../../../src/utils/fetchDefinitions"; +import { appendRequestHeader, getRequestHeader, setRequestHeader } from "../../../src/middlewares/middlewareUtil"; + +describe("MiddlewareUtil.ts", async () => { + describe("getRequestHeader", () => { + const value = "application/json"; + const url = "dummy_url"; + + it("Should get header from headers object", () => { + const options: FetchRequestInit = { + method: "test", + headers: { + version: "version", + "Content-Type": value, + }, + }; + const headerValue: string = getRequestHeader(url, options, "Content-Type"); + const headerVersion: string = getRequestHeader(url, options, "version"); + assert.equal(headerValue, value); + assert.equal(headerVersion, "version"); + }); + + it("Should get header from record of headers", () => { + const options: FetchRequestInit = { + method: "test", + headers: { + version: "version", + "Content-Type": value, + }, + }; + const headerValue: string = getRequestHeader(url, options, "Content-Type"); + const headerVersion: string = getRequestHeader(url, options, "version"); + assert.equal(headerValue, value); + assert.equal(headerVersion, "version"); + }); + }); + + describe("setRequestHeader", () => { + const key = "Content-Type"; + const value = "application/json"; + const url = "dummy_url"; + + it("Should set header for undefined headers", () => { + const options: FetchRequestInit = { + method: "test", + }; + setRequestHeader(url, options, key, value); + assert.isDefined(options.headers); + assert.equal(options.headers[key], value); + }); + + it("Should set header for empty headers", () => { + const options: FetchRequestInit = { + method: "test", + headers: {} + }; + setRequestHeader(url, options, key, value); + assert.isDefined(options.headers); + assert.equal(options.headers[key], value); + }); + + it("Should set header in headers object", () => { + const options: FetchRequestInit = { + method: "test", + headers: { + version: "version", + }, + }; + setRequestHeader(url, options, key, value); + assert.equal(options.headers[key], value); + }); + + it("Should replace header in headers object if header is already present", () => { + const options: FetchRequestInit = { + method: "test", + headers: { + version: "version", + [key]: value, + }, + }; + setRequestHeader(url, options, key, value); + assert.equal(options.headers[key], value); + }); + }); + + describe("appendRequestHeader", () => { + const key = "Content-Type"; + const value = "application/json"; + const firstValue = "text/html"; + const url = "dummy_url"; + + it("Should set header for empty headers", () => { + const options: FetchRequestInit = { + method: "test", + }; + appendRequestHeader(url, options, key, value); + assert.isDefined(options.headers); + assert.equal(options.headers[key], value); + }); + + it("Should set header in headers object if header is not present", () => { + const options: FetchRequestInit = { + method: "test", + headers: { + version: "version", + }, + }; + appendRequestHeader(url, options, key, value); + assert.equal(options.headers[key], value); + }); + + it("Should append header in headers object", () => { + const options: FetchRequestInit = { + method: "test", + headers: { + version: "version", + [key]: firstValue, + }, + }; + appendRequestHeader(url, options, key, value); + assert.equal(options.headers[key], `${firstValue}, ${value}`); + }); + + it("Should append header in headers object even if the value is duplicate", () => { + const options: FetchRequestInit = { + method: "test", + headers: { + version: "version", + [key]: value, + }, + }; + appendRequestHeader(url, options, key, value); + assert.equal(options.headers[key], `${value}, ${value}`); + }); + }); +}); diff --git a/http/typescript/fetch/test/common/middleware/RedirectHandler.ts b/http/typescript/fetch/test/common/middleware/RedirectHandler.ts new file mode 100644 index 0000000000..d74df5f110 --- /dev/null +++ b/http/typescript/fetch/test/common/middleware/RedirectHandler.ts @@ -0,0 +1,342 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +import { assert } from "chai"; + +import { MiddlewareContext } from "../../../src/middlewares/middlewareContext"; +import { MiddlewareControl } from "../../../src/middlewares/middlewareControl"; +import { RedirectHandlerOptions } from "../../../src/middlewares/options/redirectHandlerOption"; +import { RedirectHandler } from "../../../src/middlewares/redirectHandler"; +import { DummyFetchHandler } from "./dummyFetchHandler"; +import { getResponse } from "../testUtils" + +var Response = Response; +if (typeof Response != "object") { + Response = getResponse(); + +} + +const redirectHandlerOptions = new RedirectHandlerOptions(); +const redirectHandler = new RedirectHandler(); +describe("RedirectHandler.ts", () => { + describe("constructor", () => { + it("Should create an instance with given options", () => { + const handler = new RedirectHandler(redirectHandlerOptions); + assert.isDefined(handler["options"]); + }); + + it("Should create an instance with default set of options", () => { + const handler = new RedirectHandler(); + assert.isDefined(handler["options"]); + }); + }); + + describe("isRedirect", () => { + it("Should return true for response having 301 status code", () => { + const response = new Response("Dummy", { + status: 301, + }); + assert.isTrue(redirectHandler["isRedirect"](response)); + }); + + it("Should return true for response having 302 status code", () => { + const response = new Response("Dummy", { + status: 302, + }); + assert.isTrue(redirectHandler["isRedirect"](response)); + }); + + it("Should return true for response having 303 status code", () => { + const response = new Response("Dummy", { + status: 303, + }); + assert.isTrue(redirectHandler["isRedirect"](response)); + }); + + it("Should return true for response having 307 status code", () => { + const response = new Response("Dummy", { + status: 307, + }); + assert.isTrue(redirectHandler["isRedirect"](response)); + }); + + it("Should return true for response having 308 status code", () => { + const response = new Response("Dummy", { + status: 308, + }); + assert.isTrue(redirectHandler["isRedirect"](response)); + }); + + it("Should return false for non redirect status codes", () => { + const response = new Response("Dummy", { + status: 200, + }); + assert.isFalse(redirectHandler["isRedirect"](response)); + }); + }); + + describe("hasLocationHeader", () => { + it("Should return true for response with location header", () => { + const res = new Response("Dummy", { + status: 301, + headers: { + location: "https://dummylocation.microsoft.com", + }, + }); + assert.isTrue(redirectHandler["hasLocationHeader"](res)); + }); + + it("Should return false for response without location header", () => { + const res = new Response("Dummy", { + status: 301, + }); + assert.isFalse(redirectHandler["hasLocationHeader"](res)); + }); + }); + + describe("getLocationHeader", () => { + it("Should return location from response", () => { + const location = "https://dummylocation.microsoft.com"; + const res = new Response("Dummy", { + status: 301, + headers: { + location, + }, + }); + assert.equal(redirectHandler["getLocationHeader"](res), location); + }); + + it("Should return null for response without location header", () => { + const res = new Response("Dummy", { + status: 301, + }); + assert.equal(redirectHandler["getLocationHeader"](res), null); + }); + }); + + describe("isRelativeURL", () => { + it("Should return true for a relative url", () => { + const url = "/graphproxy/me"; + assert.isTrue(redirectHandler["isRelativeURL"](url)); + }); + + it("Should return false for a absolute url", () => { + const url = "https://graph.microsoft.com/v1.0/graphproxy/me"; + assert.isFalse(redirectHandler["isRelativeURL"](url)); + }); + }); + + describe("shouldDropAuthorizationHeader", () => { + it("Should return true for urls with different domain", () => { + const requestUrl = "https://graph.microsoft.com/v1.0/me"; + const redirectedUrl = "https://graphredirection.microsoft.com/v1.0/me"; + assert.isTrue(redirectHandler["shouldDropAuthorizationHeader"](requestUrl, redirectedUrl)); + }); + + it("Should return true for urls with different domain and one without path", () => { + const requestUrl = "https://graph.microsoft.com/v1.0/me"; + const redirectedUrl = "https://graphredirection.microsoft.com/"; + assert.isTrue(redirectHandler["shouldDropAuthorizationHeader"](requestUrl, redirectedUrl)); + }); + + it("Should return true for urls with different domain without path", () => { + const requestUrl = "https://graph.microsoft.com/"; + const redirectedUrl = "https://graphredirection.microsoft.com"; + assert.isTrue(redirectHandler["shouldDropAuthorizationHeader"](requestUrl, redirectedUrl)); + }); + + it("Should return false relative urls", () => { + const requestUrl = "/graph/me/"; + const redirectedUrl = "/graphRedirection/me"; + assert.isFalse(redirectHandler["shouldDropAuthorizationHeader"](requestUrl, redirectedUrl)); + }); + + it("Should return false redirect url is relative", () => { + const requestUrl = "https://graph.microsoft.com/v1.0/me"; + const redirectedUrl = "/graphRedirection"; + assert.isFalse(redirectHandler["shouldDropAuthorizationHeader"](requestUrl, redirectedUrl)); + }); + + it("Should return false for urls with same domain", () => { + const requestUrl = "https://graph.microsoft.com/v1.0/me"; + const redirectedUrl = "https://graph.microsoft.com/v2.0/me"; + assert.isFalse(redirectHandler["shouldDropAuthorizationHeader"](requestUrl, redirectedUrl)); + }); + }); + + describe("getOptions", () => { + it("Should return the options in the context object", () => { + const maxRedirects = 10; + const shouldRedirect = () => false; + const options = new RedirectHandlerOptions(maxRedirects, shouldRedirect); + const cxt: MiddlewareContext = { + request: "url", + middlewareControl: new MiddlewareControl([options]), + }; + const o = redirectHandler["getOptions"](cxt); + assert.equal(o.maxRedirects, maxRedirects); + assert.equal(o.shouldRedirect, shouldRedirect); + }); + + it("Should return the default set of options in the middleware", () => { + const cxt: MiddlewareContext = { + request: "url", + }; + const o = redirectHandler["getOptions"](cxt); + assert.equal(o.maxRedirects, redirectHandler["options"].maxRedirects); + assert.equal(o.shouldRedirect, redirectHandler["options"].shouldRedirect); + }); + }); + + describe("executeWithRedirect", async () => { + const context: MiddlewareContext = { + request: "/me", + options: { + method: "GET", + }, + }; + const dummyFetchHandler = new DummyFetchHandler(); + const handler = new RedirectHandler(); + handler.next = dummyFetchHandler; + it("Should not redirect for the redirect count equal to maxRedirects", async () => { + const maxRedirect = 1; + const options = new RedirectHandlerOptions(maxRedirect); + dummyFetchHandler.setResponses([new Response("", { status: 301 }), new Response("ok", { status: 200 })]); + await handler["executeWithRedirect"](context, maxRedirect, options); + assert.equal(context.response.status, 301); + }); + + it("Should not redirect for the non redirect response", async () => { + const options = new RedirectHandlerOptions(); + dummyFetchHandler.setResponses([new Response("", { status: 200 })]); + await handler["executeWithRedirect"](context, 0, options); + assert.equal(context.response.status, 200); + }); + + it("Should not redirect for the redirect response without location header", async () => { + const options = new RedirectHandlerOptions(); + dummyFetchHandler.setResponses([new Response("", { status: 301 }), new Response("ok", { status: 200 })]); + await handler["executeWithRedirect"](context, 0, options); + assert.equal(context.response.status, 301); + }); + + it("Should not redirect for shouldRedirect callback returning false", async () => { + const options = new RedirectHandlerOptions(undefined, () => false); + dummyFetchHandler.setResponses([new Response("", { status: 301 }), new Response("ok", { status: 200 })]); + await handler["executeWithRedirect"](context, 0, options); + assert.equal(context.response.status, 301); + }); + + it("Should drop body and change method to get for SEE_OTHER status code", async () => { + const options = new RedirectHandlerOptions(); + dummyFetchHandler.setResponses([ + new Response("", { + status: 303, + headers: { + [RedirectHandler["LOCATION_HEADER"]]: "/location", + }, + }), + new Response("ok", { status: 200 }), + ]); + await handler["executeWithRedirect"](context, 0, options); + assert.isUndefined(context.options.body); + assert.equal(context.options.method, "GET"); + assert.equal(context.response.status, 200); + }); + + it("Should not drop Authorization header for relative url redirect", async () => { + const options = new RedirectHandlerOptions(); + const cxt: MiddlewareContext = { + request: "/me", + options: { + method: "POST", + body: "dummy body", + headers: { + [RedirectHandler["AUTHORIZATION_HEADER"]]: "Bearer TEST", + }, + }, + }; + dummyFetchHandler.setResponses([ + new Response("", { + status: 301, + headers: { + [RedirectHandler["LOCATION_HEADER"]]: "/location", + }, + }), + new Response("ok", { status: 200 }), + ]); + await handler["executeWithRedirect"](cxt, 0, options); + assert.isDefined(cxt.options.headers[RedirectHandler["AUTHORIZATION_HEADER"]]); + assert.equal(cxt.response.status, 200); + }); + + it("Should not drop Authorization header for same authority redirect url", async () => { + const options = new RedirectHandlerOptions(); + const cxt: MiddlewareContext = { + request: "https://graph.microsoft.com/v1.0/me", + options: { + method: "POST", + body: "dummy body", + headers: { + [RedirectHandler["AUTHORIZATION_HEADER"]]: "Bearer TEST", + }, + }, + }; + dummyFetchHandler.setResponses([ + new Response("", { + status: 301, + headers: { + [RedirectHandler["LOCATION_HEADER"]]: "https://graph.microsoft.com/v2.0/me", + }, + }), + new Response("ok", { status: 200 }), + ]); + await handler["executeWithRedirect"](cxt, 0, options); + assert.isDefined(cxt.options.headers[RedirectHandler["AUTHORIZATION_HEADER"]]); + assert.equal(cxt.response.status, 200); + }); + + it("Should return success response after successful redirect", async () => { + const options = new RedirectHandlerOptions(); + const cxt: MiddlewareContext = { + request: "https://graph.microsoft.com/v1.0/me", + options: { + method: "POST", + body: "dummy body", + }, + }; + dummyFetchHandler.setResponses([ + new Response(null, { + status: 301, + headers: { + [RedirectHandler["LOCATION_HEADER"]]: "https://graphredirect.microsoft.com/v1.0/me", + }, + }), + new Response("ok", { status: 200 }), + ]); + await handler["executeWithRedirect"](cxt, 0, options); + assert.equal(cxt.response.status, 200); + }); + }); + + describe("execute", async () => { + it("Should set the redirect value in options to manual", async () => { + const context: MiddlewareContext = { + request: "/me", + options: { + method: "GET", + }, + }; + const dummyFetchHandler = new DummyFetchHandler(); + const handler = new RedirectHandler(); + handler.next = dummyFetchHandler; + dummyFetchHandler.setResponses([new Response("", { status: 200 })]); + await handler.execute(context); + assert.equal(context.options.redirect, RedirectHandler["MANUAL_REDIRECT"]); + }); + }); +}); diff --git a/http/typescript/fetch/test/common/middleware/RetryHandler.ts b/http/typescript/fetch/test/common/middleware/RetryHandler.ts index 68fa03f9fc..c85be76984 100644 --- a/http/typescript/fetch/test/common/middleware/RetryHandler.ts +++ b/http/typescript/fetch/test/common/middleware/RetryHandler.ts @@ -4,27 +4,19 @@ * See License in the project root for license information. * ------------------------------------------------------------------------------------------- */ - import { assert } from "chai"; -import * as sinon from "sinon"; import { MiddlewareContext } from "../../../src/middlewares/middlewareContext"; import { FetchRequestInit } from "../../../src/utils/fetchDefinitions"; import { MiddlewareControl } from "../../../src/middlewares/middlewareControl"; import { RetryHandlerOptions, ShouldRetry } from "../../../src/middlewares/options/retryHandlerOptions"; import { RetryHandler } from "../../../src/middlewares/RetryHandler"; -import { FetchHandler } from "../../../src/middlewares/fetchHandler"; -console.log(typeof Response) +import { DummyFetchHandler } from "./dummyFetchHandler"; +import { getResponse } from "../testUtils" var Response = Response; -if(typeof Response != "object"){ - getResponse().then((res)=>{ console.log(res);Response = res}); - -} -async function getResponse(){ - const s = await import("node-fetch"); - console.log(s) - return s["Response"]; +if (typeof Response != "object") { + Response = getResponse(); } describe("RetryHandler.ts", function () { @@ -106,8 +98,7 @@ describe("RetryHandler.ts", function () { }); it("Should fail for stream request", () => { - const options: FetchRequestInit - = { + const options: FetchRequestInit = { method: "PUT", headers: { "Content-Type": "application/octet-stream", @@ -195,10 +186,8 @@ describe("RetryHandler.ts", function () { describe("executeWithRetry", async () => { const options = new RetryHandlerOptions(); const handler = new RetryHandler(options); - const fetchHandler = new FetchHandler(); - handler.next = fetchHandler; - - + const dummyFetchHandler = new DummyFetchHandler(); + handler.next = dummyFetchHandler; const cxt: MiddlewareContext = { request: "url", options: { @@ -206,48 +195,44 @@ describe("RetryHandler.ts", function () { }, }; it("Should return non retried response incase of maxRetries busted out", async () => { - sinon.stub(fetchHandler, "execute").callsFake((ctx: MiddlewareContext): Promise => { - console.log("calls fake"); - ctx.response = new Response(null, { status: 429 }), new Response("ok", { status: 200 }); - return; - }) + dummyFetchHandler.setResponses([new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); await handler["executeWithRetry"](cxt, RetryHandlerOptions["MAX_MAX_RETRIES"], options); assert.equal(cxt.response.status, 429); }); - // it("Should return succeeded response for non retry response", async () => { - // dummyHTTPHandler.setResponses([new Response("ok", { status: 200 })]); - // await handler["executeWithRetry"](cxt, 0, options); - // assert.equal(cxt.response.status, 200); - // }); - - // it("Should return non retried response for streaming request", async () => { - // const c: MiddlewareContext = { - // request: "url", - // options: { - // method: "POST", - // headers: { - // "Content-Type": "application/octet-stream", - // }, - // }, - // }; - // dummyHTTPHandler.setResponses([new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); - // await handler["executeWithRetry"](c, 0, options); - // assert.equal(c.response.status, 429); - // }); - - // it("Should successfully retry and return ok response", async () => { - // const opts = new RetryHandlerOptions(1); - // dummyHTTPHandler.setResponses([new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); - // await handler["executeWithRetry"](cxt, 0, opts); - // assert.equal(cxt.response.status, 200); - // }); - - // it("Should fail by exceeding max retries", async () => { - // const opts = new RetryHandlerOptions(1, 2); - // dummyHTTPHandler.setResponses([new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); - // await handler["executeWithRetry"](cxt, 0, opts); - // assert.equal(cxt.response.status, 429); - //}); -}); + it("Should return succeeded response for non retry response", async () => { + dummyFetchHandler.setResponses([new Response("ok", { status: 200 })]); + await handler["executeWithRetry"](cxt, 0, options); + assert.equal(cxt.response.status, 200); + }); + + it("Should return non retried response for streaming request", async () => { + const c: MiddlewareContext = { + request: "url", + options: { + method: "POST", + headers: { + "Content-Type": "application/octet-stream", + }, + }, + }; + dummyFetchHandler.setResponses([new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); + await handler["executeWithRetry"](c, 0, options); + assert.equal(c.response.status, 429); + }); + + it("Should successfully retry and return ok response", async () => { + const opts = new RetryHandlerOptions(1); + dummyFetchHandler.setResponses([new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); + await handler["executeWithRetry"](cxt, 0, opts); + assert.equal(cxt.response.status, 200); + }); + + it("Should fail by exceeding max retries", async () => { + const opts = new RetryHandlerOptions(1, 2); + dummyFetchHandler.setResponses([new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); + await handler["executeWithRetry"](cxt, 0, opts); + assert.equal(cxt.response.status, 429); + }); + }); }); diff --git a/http/typescript/fetch/test/common/middleware/dummyFetchHandler.ts b/http/typescript/fetch/test/common/middleware/dummyFetchHandler.ts new file mode 100644 index 0000000000..2ddd70b57f --- /dev/null +++ b/http/typescript/fetch/test/common/middleware/dummyFetchHandler.ts @@ -0,0 +1,61 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module DummyHTTPMessageHandler + */ + +import { MiddlewareContext } from "../../../src/middlewares/middlewareContext"; +import { Middleware } from "../../../src/middlewares/middleware"; + +/** + * @class + * @implements Middleware + * Class representing DummyHTTPMessageHandler + */ +export class DummyFetchHandler implements Middleware { + /** + * @private + * A member holding the array of response objects + */ + private responses: Response[]; + + next; + + /** + * @public + * @constructor + * To create an instance of DummyHTTPMessageHandler + * @param {Response[]} [responses = []] - The array of response objects + * @returns An instance of DummyHTTPMessageHandler + */ + public constructor(responses: Response[] = []) { + this.responses = responses; + } + + /** + * @public + * To set the array of responses + * @param {Response[]} response - The array of responses + * @returns Nothing + */ + public setResponses(responses: Response[]): void { + this.responses = responses; + } + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The request context object + * @returns A promise that resolves to nothing + */ + public async execute(context: MiddlewareContext) { + context.response = this.responses.shift(); + return; + } +} diff --git a/http/typescript/fetch/test/common/testUtils.ts b/http/typescript/fetch/test/common/testUtils.ts new file mode 100644 index 0000000000..51b17b8daa --- /dev/null +++ b/http/typescript/fetch/test/common/testUtils.ts @@ -0,0 +1,5 @@ +import {Response} from "node-fetch" + +export function getResponse(){ + return Response; +} \ No newline at end of file From 64640dc021b19b8e73a269a246de86c7f63280ad Mon Sep 17 00:00:00 2001 From: "nikithauc@gmail.com" Date: Tue, 12 Oct 2021 01:27:13 -0700 Subject: [PATCH 11/34] add karma tests --- http/typescript/fetch/karma.conf.js | 13 +++ http/typescript/fetch/package.json | 9 +- http/typescript/fetch/src/browser/index.ts | 11 +++ http/typescript/fetch/src/httpClient.ts | 14 ++- http/typescript/fetch/src/index.ts | 12 ++- .../defaultFetchHandler.ts} | 21 +++-- .../middlewares/browser/middlewareFactory.ts | 38 ++++++++ .../src/middlewares/customFetchHandler.ts | 2 +- ...fetchHandler.ts => defaultFetchHandler.ts} | 9 +- .../src/middlewares/middlewareFactory.ts | 25 ++--- .../fetch/src/middlewares/middlewareUtil.ts | 6 -- .../{utils.browser.ts => browser/utils.ts} | 0 .../fetch/test/browser/MiddlewareFactory.ts | 21 +++++ .../fetch/test/browser/httpClient.ts | 94 +++++++++++++++++++ .../fetch/test/common/httpClient.ts | 0 .../test/common/middleware/RetryHandler.ts | 4 +- .../fetch/test/node/MiddlewareFactory.ts | 22 +++++ .../middleware => node}/RedirectHandler.ts | 10 +- .../RedirectHandlerOptions.ts | 2 +- http/typescript/fetch/test/node/httpClient.ts | 92 ++++++++++++++++++ .../fetch/test/{common => }/testUtils.ts | 0 http/typescript/fetch/tsconfig.cjs.json | 2 +- 22 files changed, 356 insertions(+), 51 deletions(-) create mode 100644 http/typescript/fetch/karma.conf.js create mode 100644 http/typescript/fetch/src/browser/index.ts rename http/typescript/fetch/src/middlewares/{browserFetchHandler.ts => browser/defaultFetchHandler.ts} (65%) create mode 100644 http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts rename http/typescript/fetch/src/middlewares/{fetchHandler.ts => defaultFetchHandler.ts} (86%) rename http/typescript/fetch/src/utils/{utils.browser.ts => browser/utils.ts} (100%) create mode 100644 http/typescript/fetch/test/browser/MiddlewareFactory.ts create mode 100644 http/typescript/fetch/test/browser/httpClient.ts delete mode 100644 http/typescript/fetch/test/common/httpClient.ts create mode 100644 http/typescript/fetch/test/node/MiddlewareFactory.ts rename http/typescript/fetch/test/{common/middleware => node}/RedirectHandler.ts (96%) rename http/typescript/fetch/test/{common/middleware => node}/RedirectHandlerOptions.ts (95%) rename http/typescript/fetch/test/{common => }/testUtils.ts (100%) diff --git a/http/typescript/fetch/karma.conf.js b/http/typescript/fetch/karma.conf.js new file mode 100644 index 0000000000..f929361554 --- /dev/null +++ b/http/typescript/fetch/karma.conf.js @@ -0,0 +1,13 @@ +module.exports = function(config) { + config.set({ + frameworks: ["mocha", "chai", "karma-typescript"], + files: ["test/common/**/*.ts", "src/**/*.ts", "test/browser/**/*.ts", "src/*.ts", "test/testUtils.ts"], + preprocessors: { + "**/*.ts": ["karma-typescript"], + }, + karmaTypescriptConfig: { + tsconfig: "./tsconfig.cjs.json", + }, + browsers: ["ChromeHeadless"], + }); +}; \ No newline at end of file diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index 5a57b7724a..ef3e1d8d88 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -12,10 +12,13 @@ "build": "npm run build:cjs && npm run build:es", "build:cjs": "tsc -p tsconfig.cjs.json", "build:es": "tsc -p tsconfig.es.json", - "test:cjs": "tsc -b tsconfig.test.json && mocha 'dist/cjs/test/common/**/*.js' -grep MiddlewareUtil.ts", - "test:es": " tsc -b tsconfig.test.json && mocha 'dist/es/test/common/**/*.js' --require esm", + "test:cjs": "npm run build:cjs && mocha 'dist/cjs/test/common/**/*.js' && mocha 'dist/cjs/test/node/**/*.js'", + "test:es": " npm run build:es && mocha 'dist/es/test/common/**/*.js' --require esm && && mocha 'dist/es/test/node/**/*.js' --require esm", "test": "npm run test:cjs && npm run test:es", - "clean": "rm -r ./dist" + "clean": "rm -r ./dist", + "testn": "npm run build:cjs && mocha 'dist/cjs/test/node/**/*.js'", + "karma": "karma start --single-run --browsers ChromeHeadless karma.conf.js" + }, "repository": { "type": "git", diff --git a/http/typescript/fetch/src/browser/index.ts b/http/typescript/fetch/src/browser/index.ts new file mode 100644 index 0000000000..0b8f0cfe06 --- /dev/null +++ b/http/typescript/fetch/src/browser/index.ts @@ -0,0 +1,11 @@ +export * from '../httpCore'; +export * from '../httpClient'; +export * from '../middlewares/middleware'; +export * from '../middlewares/browser/defaultFetchHandler'; +export * from '../middlewares/customFetchHandler'; +export * from '../middlewares/retryHandler'; +export * from '../middlewares/options/retryHandlerOptions'; +export * from '../middlewares/middlewareContext'; +export * from '../middlewares/browser/middlewareFactory'; +export * from '../middlewares/middlewareControl'; +export * from '../middlewares/middlewareUtil'; diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index 73967b740e..c363775590 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -3,6 +3,7 @@ import { MiddlewareContext } from "./middlewares/middlewareContext"; import { customFetchHandler } from "./middlewares/customFetchHandler"; import { MiddlewareFactory } from "./middlewares/middlewareFactory"; import { FetchRequestInfo, FetchRequestInit , FetchResponse } from "./utils/fetchDefinitions"; +import { defaultFetchHandler } from "./middlewares/defaultFetchHandler"; /** Default fetch client with options and a middleware pipleline for requests execution. */ export class HttpClient { @@ -15,11 +16,15 @@ export class HttpClient { public constructor(private customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise, ...middlewares: Middleware[]) { // Use default middleware chain if middlewares and custom fetch function are not defined - if(!middlewares && !customFetch){ + if( middlewares === undefined && !customFetch){ this.setMiddleware(...(MiddlewareFactory.getDefaultMiddlewareChain())); } - if (middlewares) { + if((middlewares === null || middlewares.length === 0) && !customFetch){ + console.log("hhhererrrr") + this.setMiddleware(new defaultFetchHandler()); + } + if (middlewares && middlewares.length >= 1) { if(customFetch){ this.setMiddleware(...middlewares, new customFetchHandler(customFetch)); } @@ -73,8 +78,9 @@ export class HttpClient { return this.customFetch(context.request, context.options); } if (this.middleware) { - await this.middleware.execute(context); - + console.log("execute from browser"); + const s= await this.middleware.execute(context); + return context.response; } else diff --git a/http/typescript/fetch/src/index.ts b/http/typescript/fetch/src/index.ts index 1848ad07c5..3916eba5e1 100644 --- a/http/typescript/fetch/src/index.ts +++ b/http/typescript/fetch/src/index.ts @@ -1,3 +1,13 @@ export * from './httpCore'; export * from './httpClient'; -export * from './middlewares/middleware'; \ No newline at end of file +export * from './middlewares/middleware'; +export * from './middlewares/defaultFetchHandler'; +export * from './middlewares/customFetchHandler'; +export * from './middlewares/redirectHandler'; +export * from './middlewares/retryHandler'; +export * from './middlewares/options/redirectHandlerOption'; +export * from './middlewares/options/retryHandlerOptions'; +export * from './middlewares/middlewareContext'; +export * from './middlewares/middlewareFactory'; +export * from './middlewares/middlewareControl'; +export * from './middlewares/middlewareUtil'; diff --git a/http/typescript/fetch/src/middlewares/browserFetchHandler.ts b/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts similarity index 65% rename from http/typescript/fetch/src/middlewares/browserFetchHandler.ts rename to http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts index 13c9c117ff..b85cd47cce 100644 --- a/http/typescript/fetch/src/middlewares/browserFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts @@ -9,9 +9,9 @@ * @module FetchHandler */ -import { MiddlewareContext } from "./middlewareContext"; -import { Middleware } from "./middleware"; -import { FetchResponse, FetchRequestInfo, FetchRequestInit } from "../utils/fetchDefinitions"; +import { MiddlewareContext } from "../middlewareContext"; +import { Middleware } from "../middleware"; +import { FetchResponse } from "../../utils/fetchDefinitions"; /** * @class @@ -19,13 +19,17 @@ import { FetchResponse, FetchRequestInfo, FetchRequestInit } from "../utils/fetc * Class for FetchHandler */ -export class browserFetchHandler implements Middleware { +export class defaultFetchHandler implements Middleware { /** - * @private - * The next middleware in the middleware chain - */ - next: Middleware; + * @private + * The next middleware in the middleware chain + */ + next: Middleware; + + constructor(){ + console.log("from browser sds"); + } /** * @public @@ -35,6 +39,7 @@ export class browserFetchHandler implements Middleware { * @returns A promise that resolves to nothing */ public async execute(context: MiddlewareContext): Promise { + console.log("from browser *************************"); context.response = await fetch(context.request, context.options as RequestInit) as FetchResponse; return; } diff --git a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts new file mode 100644 index 0000000000..803cbe02c6 --- /dev/null +++ b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts @@ -0,0 +1,38 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/** + * @module MiddlewareFactory + */ + +import { defaultFetchHandler} from "./defaultFetchHandler"; +import { Middleware } from "../middleware"; +import { RetryHandlerOptions } from "../options/retryHandlerOptions"; +import { RetryHandler } from "../retryHandler"; + + +/** + * @class + * Class containing function(s) related to the middleware pipelines. + */ +export class MiddlewareFactory { + /** + * @public + * @static + * Returns the default middleware chain an array with the middleware handlers + * @param {AuthenticationProvider} authProvider - The authentication provider instance + * @returns an array of the middleware handlers of the default middleware chain + */ + public static getDefaultMiddlewareChain(): Middleware[] { + const middleware: Middleware[] = []; + const retryHandler = new RetryHandler(new RetryHandlerOptions()); + middleware.push(retryHandler); + middleware.push(new defaultFetchHandler()); + + return middleware; + } +} diff --git a/http/typescript/fetch/src/middlewares/customFetchHandler.ts b/http/typescript/fetch/src/middlewares/customFetchHandler.ts index 58a0cc7819..aee364103f 100644 --- a/http/typescript/fetch/src/middlewares/customFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/customFetchHandler.ts @@ -9,7 +9,7 @@ * @module FetchHandler */ -import fetch from "node-fetch"; + import { MiddlewareContext } from "./middlewareContext"; import { Middleware } from "./middleware"; import { FetchResponse, FetchRequestInfo, FetchRequestInit } from "../utils/fetchDefinitions"; diff --git a/http/typescript/fetch/src/middlewares/fetchHandler.ts b/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts similarity index 86% rename from http/typescript/fetch/src/middlewares/fetchHandler.ts rename to http/typescript/fetch/src/middlewares/defaultFetchHandler.ts index 755206ecbf..a680954fcc 100644 --- a/http/typescript/fetch/src/middlewares/fetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts @@ -20,13 +20,17 @@ import { FetchResponse } from "../utils/fetchDefinitions"; * Class for FetchHandler */ -export class FetchHandler implements Middleware { +export class defaultFetchHandler implements Middleware { /** * @private * The next middleware in the middleware chain */ - next: Middleware; + next: Middleware; + + constructor(){ + console.log("from node sds"); + } /** * @public @@ -36,6 +40,7 @@ export class FetchHandler implements Middleware { * @returns A promise that resolves to nothing */ public async execute(context: MiddlewareContext): Promise { + console.log("from node") context.response = await nodeFetch(context.request, context.options) as FetchResponse; return; } diff --git a/http/typescript/fetch/src/middlewares/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/middlewareFactory.ts index 763c7b8ec7..0c6219a1e4 100644 --- a/http/typescript/fetch/src/middlewares/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/middlewareFactory.ts @@ -9,21 +9,13 @@ * @module MiddlewareFactory */ -import { FetchHandler} from "./fetchHandler"; +import { defaultFetchHandler} from "./defaultFetchHandler"; import { Middleware } from "./middleware"; import { RedirectHandlerOptions } from "./options/redirectHandlerOption"; import { RetryHandlerOptions } from "./options/retryHandlerOptions"; import { RedirectHandler } from "./redirectHandler"; import { RetryHandler } from "./retryHandler"; -/** - * @private - * To check whether the environment is node or not - * @returns A boolean representing the environment is node or not - */ -const isNodeEnvironment = (): boolean => { - return typeof process === "object" && typeof require === "function"; -}; /** * @class @@ -38,15 +30,14 @@ export class MiddlewareFactory { * @returns an array of the middleware handlers of the default middleware chain */ public static getDefaultMiddlewareChain(): Middleware[] { - const middleware: Middleware[] = []; + const middlewareArray: Middleware[] = []; const retryHandler = new RetryHandler(new RetryHandlerOptions()); - middleware.push(retryHandler); - if (isNodeEnvironment()) { - const redirectHandler = new RedirectHandler(new RedirectHandlerOptions()); - middleware.push(redirectHandler); - } - middleware.push(new FetchHandler()); + middlewareArray.push(retryHandler); + const redirectHandler = new RedirectHandler(new RedirectHandlerOptions()); + middlewareArray.push(redirectHandler); + + middlewareArray.push(new defaultFetchHandler()); - return middleware; + return middlewareArray; } } diff --git a/http/typescript/fetch/src/middlewares/middlewareUtil.ts b/http/typescript/fetch/src/middlewares/middlewareUtil.ts index 39072b81ec..5ca4a3f039 100644 --- a/http/typescript/fetch/src/middlewares/middlewareUtil.ts +++ b/http/typescript/fetch/src/middlewares/middlewareUtil.ts @@ -21,16 +21,11 @@ import { FetchRequest, FetchRequestInfo, FetchRequestInit } from "../utils/fetch */ export const getRequestHeader = (request: FetchRequestInfo, options: FetchRequestInit | undefined, key: string): string | null => { let value: string = null; - console.log(" inside get requestheader" + value); if (typeof request !== 'string') { - console.log(" inside ! string" + value); value = (request as FetchRequest).headers.get(key); } else if (typeof options !== "undefined" && options.headers !== undefined) { - console.log(options.headers); value = options.headers[key]; - console.log(" inside option =svalue" + value); } - console.log("value" + value); return value; }; @@ -50,7 +45,6 @@ export const setRequestHeader = (request: FetchRequestInfo, options: FetchReques if(!options.headers){ options.headers = {}; } - console.log(options.headers); options.headers[key] = value; } }; diff --git a/http/typescript/fetch/src/utils/utils.browser.ts b/http/typescript/fetch/src/utils/browser/utils.ts similarity index 100% rename from http/typescript/fetch/src/utils/utils.browser.ts rename to http/typescript/fetch/src/utils/browser/utils.ts diff --git a/http/typescript/fetch/test/browser/MiddlewareFactory.ts b/http/typescript/fetch/test/browser/MiddlewareFactory.ts new file mode 100644 index 0000000000..e65f941bc0 --- /dev/null +++ b/http/typescript/fetch/test/browser/MiddlewareFactory.ts @@ -0,0 +1,21 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +import { assert } from "chai"; + +import { RetryHandler, defaultFetchHandler, MiddlewareFactory } from "../../src/browser"; + +describe("MiddlewareFactory", () => { + it("Should return the default pipeline", () => { + + const defaultMiddleWareArray = MiddlewareFactory.getDefaultMiddlewareChain(); + + assert.equal(defaultMiddleWareArray.length,2); + assert.isTrue(defaultMiddleWareArray[0] instanceof RetryHandler); + assert.isTrue(defaultMiddleWareArray[1] instanceof defaultFetchHandler); + }); +}); diff --git a/http/typescript/fetch/test/browser/httpClient.ts b/http/typescript/fetch/test/browser/httpClient.ts new file mode 100644 index 0000000000..14652dfc32 --- /dev/null +++ b/http/typescript/fetch/test/browser/httpClient.ts @@ -0,0 +1,94 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +import { assert } from "chai"; + +import { HttpClient } from "../../src/httpClient"; +import { defaultFetchHandler } from "../../src/middlewares/defaultFetchHandler"; +import { MiddlewareContext } from "../../src/middlewares/middlewareContext"; +import { FetchRequestInfo, FetchRequestInit } from "../../src/utils/fetchDefinitions"; +import { DummyFetchHandler } from "../common/middleware/dummyFetchHandler"; + +describe("HTTPClient.ts", () => { + const dummyFetchHandler: DummyFetchHandler = new DummyFetchHandler(); + const httpClient: HttpClient = new HttpClient(undefined,null); + + // describe("constructor", () => { + // it("Should create an instance and populate middleware member", async() => { + // assert.isDefined(httpClient["middleware"]); + // assert.equal(httpClient["middleware"], dummyFetchHandler); + // }); + + // it("Should create an instance and populate middleware member when passing a middleware array", () => { + // const client = new HttpClient(undefined,...[dummyFetchHandler]); + // assert.isDefined(client["middleware"]); + // assert.equal(client["middleware"], dummyFetchHandler); + // }); + + // it("Should throw an error if middleware is undefined", () => { + + // const client = new HttpClient(); + + // assert.isNotNull(client["middleware"]); + + // }); + + // it("Should throw an error if middleware is passed as an empty array", () => { + // try { + // // eslint-disable-next-line @typescript-eslint/no-unused-vars + // const client = new HttpClient(...[]); + // throw new Error("Test failed - Expected error was not thrown"); + // } catch (error) { + // assert.equal(error.name, "InvalidMiddlewareChain"); + // } + // }); + // }); + + describe("sendRequest", async () => { + it("Should throw error for invalid request options incase if the url and options are passed", async () => { + try { + const url = "dummy_url"; + const context: MiddlewareContext = { + request: url, + options:{ + method:"GET" + } + }; + console.log("erer"); + assert.isTrue(httpClient["middleware"] instanceof defaultFetchHandler) + await httpClient.executeFetch(context); + //throw new Error("Test Failed - Something wrong with the context validation"); + } catch (error) { + //assert.equal(error.name, "InvalidRequestOptions"); + } + }); + + // it("Should execute for context object with Request instance", async () => { + // const request: FetchRequestInfo = "dummy_url"; + // const options: FetchRequestInit = { + // method: "GET" + // }; + // const context: MiddlewareContext = { + // request, + // options + // }; + // await httpClient.executeFetch(context); + // }); + + // it("Should execute for context object with request uri and options", async () => { + // const url = "dummy_url"; + // const options: FetchRequestInit = { + // method: "GET", + // }; + // const context: MiddlewareContext = { + // request: url, + // options, + // }; + // await httpClient.executeFetch(context); + //}); + }); +}); diff --git a/http/typescript/fetch/test/common/httpClient.ts b/http/typescript/fetch/test/common/httpClient.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/http/typescript/fetch/test/common/middleware/RetryHandler.ts b/http/typescript/fetch/test/common/middleware/RetryHandler.ts index c85be76984..70dae2053e 100644 --- a/http/typescript/fetch/test/common/middleware/RetryHandler.ts +++ b/http/typescript/fetch/test/common/middleware/RetryHandler.ts @@ -10,9 +10,9 @@ import { MiddlewareContext } from "../../../src/middlewares/middlewareContext"; import { FetchRequestInit } from "../../../src/utils/fetchDefinitions"; import { MiddlewareControl } from "../../../src/middlewares/middlewareControl"; import { RetryHandlerOptions, ShouldRetry } from "../../../src/middlewares/options/retryHandlerOptions"; -import { RetryHandler } from "../../../src/middlewares/RetryHandler"; +import { RetryHandler } from "../../../src/middlewares/retryHandler"; import { DummyFetchHandler } from "./dummyFetchHandler"; -import { getResponse } from "../testUtils" +import { getResponse } from "../../testUtils" var Response = Response; if (typeof Response != "object") { diff --git a/http/typescript/fetch/test/node/MiddlewareFactory.ts b/http/typescript/fetch/test/node/MiddlewareFactory.ts new file mode 100644 index 0000000000..504e977648 --- /dev/null +++ b/http/typescript/fetch/test/node/MiddlewareFactory.ts @@ -0,0 +1,22 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +import { assert } from "chai"; + +import { RetryHandler, defaultFetchHandler, MiddlewareFactory, RedirectHandler} from "../../src"; + +describe("MiddlewareFactory", () => { + it("Should return the default pipeline", () => { + + const defaultMiddleWareArray = MiddlewareFactory.getDefaultMiddlewareChain(); + assert.equal(defaultMiddleWareArray.length,3); + + assert.isTrue(defaultMiddleWareArray[0] instanceof RetryHandler); + assert.isTrue(defaultMiddleWareArray[1] instanceof RedirectHandler); + assert.isTrue(defaultMiddleWareArray[2] instanceof defaultFetchHandler); + }); +}); diff --git a/http/typescript/fetch/test/common/middleware/RedirectHandler.ts b/http/typescript/fetch/test/node/RedirectHandler.ts similarity index 96% rename from http/typescript/fetch/test/common/middleware/RedirectHandler.ts rename to http/typescript/fetch/test/node/RedirectHandler.ts index d74df5f110..ec365d88aa 100644 --- a/http/typescript/fetch/test/common/middleware/RedirectHandler.ts +++ b/http/typescript/fetch/test/node/RedirectHandler.ts @@ -7,11 +7,11 @@ import { assert } from "chai"; -import { MiddlewareContext } from "../../../src/middlewares/middlewareContext"; -import { MiddlewareControl } from "../../../src/middlewares/middlewareControl"; -import { RedirectHandlerOptions } from "../../../src/middlewares/options/redirectHandlerOption"; -import { RedirectHandler } from "../../../src/middlewares/redirectHandler"; -import { DummyFetchHandler } from "./dummyFetchHandler"; +import { MiddlewareContext } from "../../src/middlewares/middlewareContext"; +import { MiddlewareControl } from "../../src/middlewares/middlewareControl"; +import { RedirectHandlerOptions } from "../../src/middlewares/options/redirectHandlerOption"; +import { RedirectHandler } from "../../src/middlewares/redirectHandler"; +import { DummyFetchHandler } from "../common/middleware/dummyFetchHandler"; import { getResponse } from "../testUtils" var Response = Response; diff --git a/http/typescript/fetch/test/common/middleware/RedirectHandlerOptions.ts b/http/typescript/fetch/test/node/RedirectHandlerOptions.ts similarity index 95% rename from http/typescript/fetch/test/common/middleware/RedirectHandlerOptions.ts rename to http/typescript/fetch/test/node/RedirectHandlerOptions.ts index 307cefde45..9cd84d1f0d 100644 --- a/http/typescript/fetch/test/common/middleware/RedirectHandlerOptions.ts +++ b/http/typescript/fetch/test/node/RedirectHandlerOptions.ts @@ -7,7 +7,7 @@ import { assert } from "chai"; -import { RedirectHandlerOptions } from "../../../src/middlewares/options/redirectHandlerOption"; +import { RedirectHandlerOptions } from "../../src/middlewares/options/redirectHandlerOption"; describe("RedirectHandlerOptions.ts", () => { describe("constructor", () => { diff --git a/http/typescript/fetch/test/node/httpClient.ts b/http/typescript/fetch/test/node/httpClient.ts index e69de29bb2..4e9175e8c3 100644 --- a/http/typescript/fetch/test/node/httpClient.ts +++ b/http/typescript/fetch/test/node/httpClient.ts @@ -0,0 +1,92 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +import { assert } from "chai"; + +import { HttpClient } from "../../src/httpClient"; +import { MiddlewareContext } from "../../src/middlewares/middlewareContext"; +import { FetchRequestInfo, FetchRequestInit } from "../../src/utils/fetchDefinitions"; +import { DummyFetchHandler } from "../common/middleware/dummyFetchHandler"; + +describe("HTTPClient.ts", () => { + const dummyFetchHandler: DummyFetchHandler = new DummyFetchHandler(); + const httpClient: HttpClient = new HttpClient(undefined,null); + + // describe("constructor", () => { + // it("Should create an instance and populate middleware member", async() => { + // assert.isDefined(httpClient["middleware"]); + // assert.equal(httpClient["middleware"], dummyFetchHandler); + // }); + + // it("Should create an instance and populate middleware member when passing a middleware array", () => { + // const client = new HttpClient(undefined,...[dummyFetchHandler]); + // assert.isDefined(client["middleware"]); + // assert.equal(client["middleware"], dummyFetchHandler); + // }); + + // it("Should throw an error if middleware is undefined", () => { + + // const client = new HttpClient(); + + // assert.isNotNull(client["middleware"]); + + // }); + + // it("Should throw an error if middleware is passed as an empty array", () => { + // try { + // // eslint-disable-next-line @typescript-eslint/no-unused-vars + // const client = new HttpClient(...[]); + // throw new Error("Test failed - Expected error was not thrown"); + // } catch (error) { + // assert.equal(error.name, "InvalidMiddlewareChain"); + // } + // }); + // }); + + describe("sendRequest", async () => { + it("Should throw error for invalid request options incase if the url and options are passed", async () => { + try { + const url = "dummy_url"; + const context: MiddlewareContext = { + request: url, + options:{ + method:"GET" + } + }; + console.log("erer"); + await httpClient.executeFetch(context); + //throw new Error("Test Failed - Something wrong with the context validation"); + } catch (error) { + //assert.equal(error.name, "InvalidRequestOptions"); + } + }); + + // it("Should execute for context object with Request instance", async () => { + // const request: FetchRequestInfo = "dummy_url"; + // const options: FetchRequestInit = { + // method: "GET" + // }; + // const context: MiddlewareContext = { + // request, + // options + // }; + // await httpClient.executeFetch(context); + // }); + + // it("Should execute for context object with request uri and options", async () => { + // const url = "dummy_url"; + // const options: FetchRequestInit = { + // method: "GET", + // }; + // const context: MiddlewareContext = { + // request: url, + // options, + // }; + // await httpClient.executeFetch(context); + //}); + }); +}); diff --git a/http/typescript/fetch/test/common/testUtils.ts b/http/typescript/fetch/test/testUtils.ts similarity index 100% rename from http/typescript/fetch/test/common/testUtils.ts rename to http/typescript/fetch/test/testUtils.ts diff --git a/http/typescript/fetch/tsconfig.cjs.json b/http/typescript/fetch/tsconfig.cjs.json index b355ff9eaf..b802b7093c 100644 --- a/http/typescript/fetch/tsconfig.cjs.json +++ b/http/typescript/fetch/tsconfig.cjs.json @@ -7,5 +7,5 @@ "composite": true }, "exclude": ["node_modules", "dist"], - "include": ["./src/**/*.ts"] + "include": ["./src/**/*.ts", "./test"] } \ No newline at end of file From de1dfdc851b56bdfdf2144a8bb93a22cd47bdce3 Mon Sep 17 00:00:00 2001 From: "nikithauc@gmail.com" Date: Tue, 12 Oct 2021 16:46:34 -0700 Subject: [PATCH 12/34] installing rollup, http client tests node --- http/typescript/fetch/karma.conf.js | 3 +- http/typescript/fetch/package-lock.json | 263 ++++++++++++++---- http/typescript/fetch/package.json | 17 +- http/typescript/fetch/rollup.config.js | 43 +++ http/typescript/fetch/src/demo.ts | 20 ++ http/typescript/fetch/src/httpClient.ts | 40 +-- http/typescript/fetch/src/index.ts | 2 + .../browser/defaultFetchHandler.ts | 5 - .../middlewares/browser/middlewareFactory.ts | 1 + .../src/middlewares/defaultFetchHandler.ts | 5 - .../src/middlewares/middlewareFactory.ts | 14 +- .../fetch/test/browser/httpClient.ts | 94 ------- http/typescript/fetch/test/node/httpClient.ts | 167 ++++++----- 13 files changed, 425 insertions(+), 249 deletions(-) create mode 100644 http/typescript/fetch/rollup.config.js create mode 100644 http/typescript/fetch/src/demo.ts delete mode 100644 http/typescript/fetch/test/browser/httpClient.ts diff --git a/http/typescript/fetch/karma.conf.js b/http/typescript/fetch/karma.conf.js index f929361554..956aae3abb 100644 --- a/http/typescript/fetch/karma.conf.js +++ b/http/typescript/fetch/karma.conf.js @@ -1,7 +1,8 @@ module.exports = function(config) { config.set({ frameworks: ["mocha", "chai", "karma-typescript"], - files: ["test/common/**/*.ts", "src/**/*.ts", "test/browser/**/*.ts", "src/*.ts", "test/testUtils.ts"], + //files: ["src/browser/index.ts", "test/common/**/*.ts", "test/browser/**/*.ts", "test/testUtils.ts"], + files: [{ pattern: "dist/es/test/rolledup.js", type: "module" }], preprocessors: { "**/*.ts": ["karma-typescript"], }, diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index 9e0ec0f993..299074defb 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -8,7 +8,6 @@ "version": "7.15.8", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", - "dev": true, "requires": { "@babel/highlight": "^7.14.5" } @@ -201,8 +200,7 @@ "@babel/helper-validator-identifier": { "version": "7.15.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" }, "@babel/helper-validator-option": { "version": "7.14.5", @@ -225,7 +223,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", @@ -434,6 +431,50 @@ } } }, + "@rollup/plugin-commonjs": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.0.tgz", + "integrity": "sha512-XDQimjHl0kNotAV5lLo34XoygaI0teqiKGJ100B3iCU8+15YscJPeqk2KqkqD3NIe1H8ZTUo5lYjUFZyEgASTw==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.0.5.tgz", + "integrity": "sha512-mVaw6uxtvuGx/XCI4qBQXsDZJUfyx5vp39iE0J/7Hd6wDhEbjHr6aES7Nr9yWbuE0BY+oKp6N7Bq6jX5NCGNmQ==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + } + } + }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -513,6 +554,11 @@ "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "dev": true }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, "@types/mocha": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", @@ -522,8 +568,15 @@ "@types/node": { "version": "16.10.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.3.tgz", - "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==", - "dev": true + "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==" + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "requires": { + "@types/node": "*" + } }, "@types/sinon": { "version": "10.0.4", @@ -683,8 +736,7 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-arraybuffer": { "version": "0.1.4", @@ -738,7 +790,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -878,12 +929,22 @@ "ieee754": "^1.1.13" } }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==" + }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -948,7 +1009,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -959,7 +1019,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -968,7 +1027,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -976,8 +1034,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" } } }, @@ -1083,11 +1140,15 @@ } } }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, "component-emitter": { "version": "1.3.0", @@ -1098,8 +1159,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "connect": { "version": "3.7.0", @@ -1292,6 +1352,11 @@ "type-detect": "^4.0.0" } }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, "default-require-extensions": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", @@ -1550,8 +1615,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "esm": { "version": "3.2.25", @@ -1565,6 +1629,11 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -1692,21 +1761,18 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "gensync": { "version": "1.0.0-beta.2", @@ -1757,7 +1823,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1798,7 +1863,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -1812,8 +1876,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { "version": "1.0.2", @@ -1953,7 +2016,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -1962,8 +2024,7 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "inline-source-map": { "version": "0.6.2", @@ -2041,7 +2102,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -2091,6 +2151,11 @@ "is-extglob": "^2.1.1" } }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + }, "is-nan": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", @@ -2128,6 +2193,14 @@ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, + "is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "requires": { + "@types/estree": "*" + } + }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -2336,11 +2409,35 @@ "istanbul-lib-report": "^3.0.0" } }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "4.0.0", @@ -2619,6 +2716,14 @@ } } }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -2651,6 +2756,11 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -2706,7 +2816,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -3112,7 +3221,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -3217,8 +3325,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "3.1.1", @@ -3229,8 +3336,7 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-to-regexp": { "version": "1.8.0", @@ -3268,8 +3374,7 @@ "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" }, "pkg-dir": { "version": "4.2.0", @@ -3390,7 +3495,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -3474,7 +3578,6 @@ "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -3511,11 +3614,39 @@ "inherits": "^2.0.1" } }, + "rollup": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.0.tgz", + "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==", + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "dependencies": { + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + } + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safer-buffer": { "version": "2.1.2", @@ -3702,8 +3833,21 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "spawn-wrap": { "version": "2.0.0", @@ -3879,11 +4023,27 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } }, + "terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -4235,8 +4395,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "3.0.3", diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index ef3e1d8d88..a449ace785 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -2,12 +2,15 @@ "name": "@microsoft/kiota-http-fetch", "version": "1.0.8", "description": "Kiota HttpCore implementation with fetch", - "main": "dist/index.js", + "main": "dist/cjs/src/index.js", "files": [ "dist/", "src/" ], "types": "dist/index.d.ts", + "browser": { + "dist/cjs/src/index.js": "dist/es/src/browser/index.js" + }, "scripts": { "build": "npm run build:cjs && npm run build:es", "build:cjs": "tsc -p tsconfig.cjs.json", @@ -16,9 +19,9 @@ "test:es": " npm run build:es && mocha 'dist/es/test/common/**/*.js' --require esm && && mocha 'dist/es/test/node/**/*.js' --require esm", "test": "npm run test:cjs && npm run test:es", "clean": "rm -r ./dist", - "testn": "npm run build:cjs && mocha 'dist/cjs/test/node/**/*.js'", - "karma": "karma start --single-run --browsers ChromeHeadless karma.conf.js" - + "testn": "npm run build:cjs && mocha 'dist/cjs/test/node/**/*.js' --grep HTTPClient.ts", + "karma": "karma start --single-run --browsers ChromeHeadless karma.conf.js", + "rollup": "rollup -c" }, "repository": { "type": "git", @@ -41,6 +44,10 @@ }, "dependencies": { "@microsoft/kiota-abstractions": "file:../../../abstractions/typescript", + "@rollup/plugin-commonjs": "^21.0.0", + "@rollup/plugin-node-resolve": "^13.0.5", + "rollup": "^2.58.0", + "rollup-plugin-terser": "^7.0.2", "sinon": "^11.1.2" }, "devDependencies": { @@ -63,4 +70,4 @@ "tslib": "^2.3.1", "typescript": "^4.4.3" } -} \ No newline at end of file +} diff --git a/http/typescript/fetch/rollup.config.js b/http/typescript/fetch/rollup.config.js new file mode 100644 index 0000000000..30f70742b3 --- /dev/null +++ b/http/typescript/fetch/rollup.config.js @@ -0,0 +1,43 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +import { terser } from "rollup-plugin-terser"; +import resolve from "@rollup/plugin-node-resolve"; +import commonjs from "@rollup/plugin-commonjs"; + +const copyRight = `/** +* ------------------------------------------------------------------------------------------- +* Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. +* See License in the project root for license information. +* ------------------------------------------------------------------------------------------- +*/`; + +const config = [{ + input: ["dist/es/test/commmon/**/*.js,dist/es/test/browser/**/*.js"], + output: { + file: "dist/es/test/rolledup.js", + format: "esm", + name: "MicrosoftGraph", + }, + external: ['@microsoft/kiota-abstractions'], + plugins: [ + // resolve({ + // browser: true, + // preferBuiltins: false, + + // }), + commonjs({ include: "node_modules/**" }), + terser({ + format: { + comments: false, + preamble: copyRight, + }, + }), + ], +}]; + +export default config; \ No newline at end of file diff --git a/http/typescript/fetch/src/demo.ts b/http/typescript/fetch/src/demo.ts new file mode 100644 index 0000000000..9cf8237fa1 --- /dev/null +++ b/http/typescript/fetch/src/demo.ts @@ -0,0 +1,20 @@ +import { HttpClient } from "./httpClient" + + + +async function name(): Promise { + const httpClient = new HttpClient(undefined, null); + const context = { + request:"url", + options:{method:"GET"} + } + + const s = await httpClient.executeFetch(context); + + +} + +name().then().catch((err)=> err); + + + diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index c363775590..0f712a2f95 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -2,7 +2,7 @@ import { Middleware } from "./middlewares/middleware"; import { MiddlewareContext } from "./middlewares/middlewareContext"; import { customFetchHandler } from "./middlewares/customFetchHandler"; import { MiddlewareFactory } from "./middlewares/middlewareFactory"; -import { FetchRequestInfo, FetchRequestInit , FetchResponse } from "./utils/fetchDefinitions"; +import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "./utils/fetchDefinitions"; import { defaultFetchHandler } from "./middlewares/defaultFetchHandler"; /** Default fetch client with options and a middleware pipleline for requests execution. */ @@ -11,25 +11,35 @@ export class HttpClient { /** * Instantiates a new HttpClient. * @param middlewares middlewares to be used for requests execution. - * @param defaultRequestSettings default request settings to be used for requests execution. + * @param custom fetch function */ public constructor(private customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise, ...middlewares: Middleware[]) { // Use default middleware chain if middlewares and custom fetch function are not defined - if( middlewares === undefined && !customFetch){ - this.setMiddleware(...(MiddlewareFactory.getDefaultMiddlewareChain())); - } + if (!middlewares.length) { - if((middlewares === null || middlewares.length === 0) && !customFetch){ - console.log("hhhererrrr") - this.setMiddleware(new defaultFetchHandler()); + if (this.customFetch) { + this.setMiddleware(...(MiddlewareFactory.getDefaultMiddlewareChain(customFetch))); + } + else { + this.setMiddleware(...(MiddlewareFactory.getDefaultMiddlewareChain())); + } } - if (middlewares && middlewares.length >= 1) { - if(customFetch){ - this.setMiddleware(...middlewares, new customFetchHandler(customFetch)); + else { + if (middlewares[0] === null) { + if(!customFetch){ + this.setMiddleware((new defaultFetchHandler())); + } + return; + } else { - this.setMiddleware(...middlewares); + if (this.customFetch) { + this.setMiddleware(...middlewares, new customFetchHandler(customFetch)); + } + else { + this.setMiddleware(...middlewares); + } } } } @@ -73,14 +83,12 @@ export class HttpClient { * @returns the promise resolving the response. */ public async executeFetch(context: MiddlewareContext): Promise { - if (this.customFetch && !this.middleware) { return this.customFetch(context.request, context.options); } + if (this.middleware) { - console.log("execute from browser"); - const s= await this.middleware.execute(context); - + await this.middleware.execute(context); return context.response; } else diff --git a/http/typescript/fetch/src/index.ts b/http/typescript/fetch/src/index.ts index 3916eba5e1..7f196262c9 100644 --- a/http/typescript/fetch/src/index.ts +++ b/http/typescript/fetch/src/index.ts @@ -11,3 +11,5 @@ export * from './middlewares/middlewareContext'; export * from './middlewares/middlewareFactory'; export * from './middlewares/middlewareControl'; export * from './middlewares/middlewareUtil'; +export * from './utils/fetchDefinitions'; +export * from './utils/utils'; \ No newline at end of file diff --git a/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts b/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts index b85cd47cce..1390054ac3 100644 --- a/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts @@ -27,10 +27,6 @@ export class defaultFetchHandler implements Middleware { */ next: Middleware; - constructor(){ - console.log("from browser sds"); - } - /** * @public * @async @@ -39,7 +35,6 @@ export class defaultFetchHandler implements Middleware { * @returns A promise that resolves to nothing */ public async execute(context: MiddlewareContext): Promise { - console.log("from browser *************************"); context.response = await fetch(context.request, context.options as RequestInit) as FetchResponse; return; } diff --git a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts index 803cbe02c6..7b351365e2 100644 --- a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts @@ -13,6 +13,7 @@ import { defaultFetchHandler} from "./defaultFetchHandler"; import { Middleware } from "../middleware"; import { RetryHandlerOptions } from "../options/retryHandlerOptions"; import { RetryHandler } from "../retryHandler"; +import { FetchRequestInfo, FetchRequestInit } from "../../utils/fetchDefinitions"; /** diff --git a/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts b/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts index a680954fcc..b3b5df87b0 100644 --- a/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts @@ -28,10 +28,6 @@ export class defaultFetchHandler implements Middleware { */ next: Middleware; - constructor(){ - console.log("from node sds"); - } - /** * @public * @async @@ -40,7 +36,6 @@ export class defaultFetchHandler implements Middleware { * @returns A promise that resolves to nothing */ public async execute(context: MiddlewareContext): Promise { - console.log("from node") context.response = await nodeFetch(context.request, context.options) as FetchResponse; return; } diff --git a/http/typescript/fetch/src/middlewares/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/middlewareFactory.ts index 0c6219a1e4..cea44c52bf 100644 --- a/http/typescript/fetch/src/middlewares/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/middlewareFactory.ts @@ -9,12 +9,14 @@ * @module MiddlewareFactory */ -import { defaultFetchHandler} from "./defaultFetchHandler"; +import { customFetchHandler } from "./customFetchHandler"; +import { defaultFetchHandler } from "./defaultFetchHandler"; import { Middleware } from "./middleware"; import { RedirectHandlerOptions } from "./options/redirectHandlerOption"; import { RetryHandlerOptions } from "./options/retryHandlerOptions"; import { RedirectHandler } from "./redirectHandler"; import { RetryHandler } from "./retryHandler"; +import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; /** @@ -29,15 +31,19 @@ export class MiddlewareFactory { * @param {AuthenticationProvider} authProvider - The authentication provider instance * @returns an array of the middleware handlers of the default middleware chain */ - public static getDefaultMiddlewareChain(): Middleware[] { + public static getDefaultMiddlewareChain(customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise): Middleware[] { const middlewareArray: Middleware[] = []; const retryHandler = new RetryHandler(new RetryHandlerOptions()); middlewareArray.push(retryHandler); const redirectHandler = new RedirectHandler(new RedirectHandlerOptions()); middlewareArray.push(redirectHandler); + if (customFetch) { + middlewareArray.push(new customFetchHandler(customFetch)); + } else { + middlewareArray.push(new defaultFetchHandler()); + } - middlewareArray.push(new defaultFetchHandler()); - + return middlewareArray; } } diff --git a/http/typescript/fetch/test/browser/httpClient.ts b/http/typescript/fetch/test/browser/httpClient.ts deleted file mode 100644 index 14652dfc32..0000000000 --- a/http/typescript/fetch/test/browser/httpClient.ts +++ /dev/null @@ -1,94 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -import { assert } from "chai"; - -import { HttpClient } from "../../src/httpClient"; -import { defaultFetchHandler } from "../../src/middlewares/defaultFetchHandler"; -import { MiddlewareContext } from "../../src/middlewares/middlewareContext"; -import { FetchRequestInfo, FetchRequestInit } from "../../src/utils/fetchDefinitions"; -import { DummyFetchHandler } from "../common/middleware/dummyFetchHandler"; - -describe("HTTPClient.ts", () => { - const dummyFetchHandler: DummyFetchHandler = new DummyFetchHandler(); - const httpClient: HttpClient = new HttpClient(undefined,null); - - // describe("constructor", () => { - // it("Should create an instance and populate middleware member", async() => { - // assert.isDefined(httpClient["middleware"]); - // assert.equal(httpClient["middleware"], dummyFetchHandler); - // }); - - // it("Should create an instance and populate middleware member when passing a middleware array", () => { - // const client = new HttpClient(undefined,...[dummyFetchHandler]); - // assert.isDefined(client["middleware"]); - // assert.equal(client["middleware"], dummyFetchHandler); - // }); - - // it("Should throw an error if middleware is undefined", () => { - - // const client = new HttpClient(); - - // assert.isNotNull(client["middleware"]); - - // }); - - // it("Should throw an error if middleware is passed as an empty array", () => { - // try { - // // eslint-disable-next-line @typescript-eslint/no-unused-vars - // const client = new HttpClient(...[]); - // throw new Error("Test failed - Expected error was not thrown"); - // } catch (error) { - // assert.equal(error.name, "InvalidMiddlewareChain"); - // } - // }); - // }); - - describe("sendRequest", async () => { - it("Should throw error for invalid request options incase if the url and options are passed", async () => { - try { - const url = "dummy_url"; - const context: MiddlewareContext = { - request: url, - options:{ - method:"GET" - } - }; - console.log("erer"); - assert.isTrue(httpClient["middleware"] instanceof defaultFetchHandler) - await httpClient.executeFetch(context); - //throw new Error("Test Failed - Something wrong with the context validation"); - } catch (error) { - //assert.equal(error.name, "InvalidRequestOptions"); - } - }); - - // it("Should execute for context object with Request instance", async () => { - // const request: FetchRequestInfo = "dummy_url"; - // const options: FetchRequestInit = { - // method: "GET" - // }; - // const context: MiddlewareContext = { - // request, - // options - // }; - // await httpClient.executeFetch(context); - // }); - - // it("Should execute for context object with request uri and options", async () => { - // const url = "dummy_url"; - // const options: FetchRequestInit = { - // method: "GET", - // }; - // const context: MiddlewareContext = { - // request: url, - // options, - // }; - // await httpClient.executeFetch(context); - //}); - }); -}); diff --git a/http/typescript/fetch/test/node/httpClient.ts b/http/typescript/fetch/test/node/httpClient.ts index 4e9175e8c3..4cc52520af 100644 --- a/http/typescript/fetch/test/node/httpClient.ts +++ b/http/typescript/fetch/test/node/httpClient.ts @@ -7,86 +7,119 @@ import { assert } from "chai"; -import { HttpClient } from "../../src/httpClient"; -import { MiddlewareContext } from "../../src/middlewares/middlewareContext"; -import { FetchRequestInfo, FetchRequestInit } from "../../src/utils/fetchDefinitions"; +import { defaultFetchHandler, HttpClient, RetryHandler, RedirectHandler, customFetchHandler } from "../../src"; import { DummyFetchHandler } from "../common/middleware/dummyFetchHandler"; describe("HTTPClient.ts", () => { - const dummyFetchHandler: DummyFetchHandler = new DummyFetchHandler(); - const httpClient: HttpClient = new HttpClient(undefined,null); + + + describe("constructor", () => { + const dummyFetchHandler: DummyFetchHandler = new DummyFetchHandler(); + + const dummyCustomFetch = ():Promise =>{ + return null; + } + it("Should create an instance and populate middleware member", async () => { + const httpClient: HttpClient = new HttpClient(undefined, dummyFetchHandler); + assert.isDefined(httpClient["middleware"]); + assert.equal(httpClient["middleware"], dummyFetchHandler); + }); + + it("Should create an instance and populate middleware member when passing a middleware array", () => { + const client = new HttpClient(undefined, ...[dummyFetchHandler]); + assert.isDefined(client["middleware"]); + assert.equal(client["middleware"], dummyFetchHandler); + }); + + it("Should set default middleware array if middleware parameter is undefined && customFetch is undefined", () => { + + const client = new HttpClient(); + + assert.isNotNull(client["middleware"]); + const next = client["middleware"].next; + + assert.isTrue(client["middleware"] instanceof RetryHandler); + assert.isTrue(next instanceof RedirectHandler); + assert.isTrue(next.next instanceof defaultFetchHandler); + + }); + + it("Should set default middleware array with customFetchHandler if middleware parameter is undefined && customFetch is defined", () => { + + const client = new HttpClient(dummyCustomFetch); + + assert.isNotNull(client["middleware"]); + assert.isNotNull(client[""]); - // describe("constructor", () => { - // it("Should create an instance and populate middleware member", async() => { - // assert.isDefined(httpClient["middleware"]); - // assert.equal(httpClient["middleware"], dummyFetchHandler); - // }); + const next = client["middleware"].next; - // it("Should create an instance and populate middleware member when passing a middleware array", () => { - // const client = new HttpClient(undefined,...[dummyFetchHandler]); - // assert.isDefined(client["middleware"]); - // assert.equal(client["middleware"], dummyFetchHandler); - // }); + assert.isTrue(client["middleware"] instanceof RetryHandler); + assert.isTrue(next instanceof RedirectHandler); + assert.isTrue(next.next instanceof customFetchHandler); + + }); - // it("Should throw an error if middleware is undefined", () => { + it("Should set to default fetch handler middleware array if middleware parameter is null && customFetch is undefined", () => { - // const client = new HttpClient(); + const client = new HttpClient(undefined,null); - // assert.isNotNull(client["middleware"]); - - // }); + assert.isNotNull(client["middleware"]); + + assert.isTrue(client["middleware"] instanceof defaultFetchHandler); + + }); + + it("Should only set custom fetch if middleware parameter is null && customFetch is defined", () => { + + const client = new HttpClient(dummyCustomFetch, null); + + assert.isUndefined(client["middleware"]); + assert.equal(client["customFetch"], dummyCustomFetch); + + }); + }); - // it("Should throw an error if middleware is passed as an empty array", () => { + // describe("sendRequest", async () => { + // it("Should throw error for invalid request options incase if the url and options are passed", async () => { // try { - // // eslint-disable-next-line @typescript-eslint/no-unused-vars - // const client = new HttpClient(...[]); - // throw new Error("Test failed - Expected error was not thrown"); + // const url = "dummy_url"; + // const context: MiddlewareContext = { + // request: url, + // options: { + // method: "GET" + // } + // }; + + // assert.isTrue(httpClient["middleware"] instanceof defaultFetchHandler) + // await httpClient.executeFetch(context); + // throw new Error("Test Failed - Something wrong with the context validation"); // } catch (error) { - // assert.equal(error.name, "InvalidMiddlewareChain"); + // assert.equal(error.name, "InvalidRequestOptions"); // } // }); - // }); - describe("sendRequest", async () => { - it("Should throw error for invalid request options incase if the url and options are passed", async () => { - try { - const url = "dummy_url"; - const context: MiddlewareContext = { - request: url, - options:{ - method:"GET" - } - }; - console.log("erer"); - await httpClient.executeFetch(context); - //throw new Error("Test Failed - Something wrong with the context validation"); - } catch (error) { - //assert.equal(error.name, "InvalidRequestOptions"); - } - }); + // it("Should execute for context object with Request instance", async () => { + // const request: FetchRequestInfo = "dummy_url"; + // const options: FetchRequestInit = { + // method: "GET" + // }; + // const context: MiddlewareContext = { + // request, + // options + // }; + // await httpClient.executeFetch(context); + // }); - // it("Should execute for context object with Request instance", async () => { - // const request: FetchRequestInfo = "dummy_url"; - // const options: FetchRequestInit = { - // method: "GET" - // }; - // const context: MiddlewareContext = { - // request, - // options - // }; - // await httpClient.executeFetch(context); - // }); - - // it("Should execute for context object with request uri and options", async () => { - // const url = "dummy_url"; - // const options: FetchRequestInit = { - // method: "GET", - // }; - // const context: MiddlewareContext = { - // request: url, - // options, - // }; - // await httpClient.executeFetch(context); - //}); - }); + // it("Should execute for context object with request uri and options", async () => { + // const url = "dummy_url"; + // const options: FetchRequestInit = { + // method: "GET", + // }; + // const context: MiddlewareContext = { + // request: url, + // options, + // }; + // await httpClient.executeFetch(context); + // }); + // }); }); From cf02bd82777762b6bf325d1d44c6a48b1f6f6188 Mon Sep 17 00:00:00 2001 From: "nikithauc@gmail.com" Date: Wed, 13 Oct 2021 17:17:22 -0700 Subject: [PATCH 13/34] setting the browser tests --- abstractions/typescript/package.json | 5 +- http/typescript/fetch/package.json | 10 +- http/typescript/fetch/rollup.config.js | 23 ++-- .../middlewares/browser/middlewareFactory.ts | 19 ++- .../fetch/test/browser/httpClient.ts | 125 ++++++++++++++++++ http/typescript/fetch/test/browser/index.ts | 5 + 6 files changed, 164 insertions(+), 23 deletions(-) create mode 100644 http/typescript/fetch/test/browser/httpClient.ts create mode 100644 http/typescript/fetch/test/browser/index.ts diff --git a/abstractions/typescript/package.json b/abstractions/typescript/package.json index fd7c2cd713..a1ae96693a 100644 --- a/abstractions/typescript/package.json +++ b/abstractions/typescript/package.json @@ -4,7 +4,10 @@ "description": "Core abstractions for kiota generated libraries in TypeScript and JavaScript", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", - "module": "dist/esm/index.js", + "module": "dist/es/index.js", + "browser": { + "dist/cjs/index.js": "dist/es/index.js" + }, "scripts": { "build": "npm run build:cjs && npm run build:es", "build:cjs": "tsc -p tsconfig.cjs.json", diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index a449ace785..f1bf031d9b 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -7,9 +7,13 @@ "dist/", "src/" ], - "types": "dist/index.d.ts", + "types": "dist/cjs/src/index.d.ts", "browser": { - "dist/cjs/src/index.js": "dist/es/src/browser/index.js" + "./dist/es/src/index.js": "./dist/es/src/browser/index.js", + "./dist/es/src/utils/utils.js": "./dist/es/src/utils/browser/utils.js", + "./dist/es/src/middlewares/defaultFetchHandler.js": "./dist/es/src/middlewares/browser/defaultFetchHandler.js", + "./dist/es/src/middlewares/middlewareFactory.js": "./dist/es/src/middlewares/browser/middlewareFactory.js", + "./dist/cjs/src/middlewares/middlewareFactory.js": "./dist/es/src/middlewares/browser/middlewareFactory.js" }, "scripts": { "build": "npm run build:cjs && npm run build:es", @@ -70,4 +74,4 @@ "tslib": "^2.3.1", "typescript": "^4.4.3" } -} +} \ No newline at end of file diff --git a/http/typescript/fetch/rollup.config.js b/http/typescript/fetch/rollup.config.js index 30f70742b3..650bf408ed 100644 --- a/http/typescript/fetch/rollup.config.js +++ b/http/typescript/fetch/rollup.config.js @@ -17,26 +17,25 @@ const copyRight = `/** */`; const config = [{ - input: ["dist/es/test/commmon/**/*.js,dist/es/test/browser/**/*.js"], + input: ["dist/es/test/browser/index.js"], output: { file: "dist/es/test/rolledup.js", format: "esm", name: "MicrosoftGraph", }, - external: ['@microsoft/kiota-abstractions'], plugins: [ - // resolve({ - // browser: true, - // preferBuiltins: false, + commonjs({ include: ["node_modules/**"] }), + resolve({ + browser: true, + preferBuiltins: false, - // }), - commonjs({ include: "node_modules/**" }), - terser({ - format: { - comments: false, - preamble: copyRight, - }, }), + // terser({ + // format: { + // comments: false, + // preamble: copyRight, + // }, + // }), ], }]; diff --git a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts index 7b351365e2..34bedbe09c 100644 --- a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts @@ -13,7 +13,8 @@ import { defaultFetchHandler} from "./defaultFetchHandler"; import { Middleware } from "../middleware"; import { RetryHandlerOptions } from "../options/retryHandlerOptions"; import { RetryHandler } from "../retryHandler"; -import { FetchRequestInfo, FetchRequestInit } from "../../utils/fetchDefinitions"; +import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../../utils/fetchDefinitions"; +import { customFetchHandler } from "../customFetchHandler"; /** @@ -28,12 +29,16 @@ export class MiddlewareFactory { * @param {AuthenticationProvider} authProvider - The authentication provider instance * @returns an array of the middleware handlers of the default middleware chain */ - public static getDefaultMiddlewareChain(): Middleware[] { - const middleware: Middleware[] = []; + public static getDefaultMiddlewareChain(customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit)=> Promise): Middleware[] { + console.log("getting the browser default middleware chain **************************"); + const middlewareArray: Middleware[] = []; const retryHandler = new RetryHandler(new RetryHandlerOptions()); - middleware.push(retryHandler); - middleware.push(new defaultFetchHandler()); - - return middleware; + middlewareArray.push(retryHandler); + if (customFetch) { + middlewareArray.push(new customFetchHandler(customFetch)); + } else { + middlewareArray.push(new defaultFetchHandler()); + } + return middlewareArray; } } diff --git a/http/typescript/fetch/test/browser/httpClient.ts b/http/typescript/fetch/test/browser/httpClient.ts new file mode 100644 index 0000000000..bfe4016562 --- /dev/null +++ b/http/typescript/fetch/test/browser/httpClient.ts @@ -0,0 +1,125 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +import { assert } from "chai"; + +import { defaultFetchHandler, HttpClient, RetryHandler, RedirectHandler, customFetchHandler } from "../../src"; +import { DummyFetchHandler } from "../common/middleware/dummyFetchHandler"; + +describe("HTTPClient.ts", () => { + + + describe("constructor", () => { + const dummyFetchHandler: DummyFetchHandler = new DummyFetchHandler(); + + const dummyCustomFetch = ():Promise =>{ + return null; + } + it("Should create an instance and populate middleware member", async () => { + const httpClient: HttpClient = new HttpClient(undefined, dummyFetchHandler); + assert.isDefined(httpClient["middleware"]); + assert.equal(httpClient["middleware"], dummyFetchHandler); + }); + + it("Should create an instance and populate middleware member when passing a middleware array", () => { + const client = new HttpClient(undefined, ...[dummyFetchHandler]); + assert.isDefined(client["middleware"]); + assert.equal(client["middleware"], dummyFetchHandler); + }); + + it("Should set default middleware array if middleware parameter is undefined && customFetch is undefined", () => { + + const client = new HttpClient(); + + assert.isNotNull(client["middleware"]); + const next = client["middleware"].next; + + assert.isTrue(client["middleware"] instanceof RetryHandler); + assert.isTrue(next instanceof defaultFetchHandler); + + }); + + it("Should set default middleware array with customFetchHandler if middleware parameter is undefined && customFetch is defined", () => { + + const client = new HttpClient(dummyCustomFetch); + + assert.isNotNull(client["middleware"]); + assert.isNotNull(client[""]); + + const next = client["middleware"].next; + + console.log("browser test") + console.log(client["middleware"]); + assert.isTrue(client["middleware"] instanceof RetryHandler); + assert.isTrue(next instanceof customFetchHandler); + + }); + + it("Should set to default fetch handler middleware array if middleware parameter is null && customFetch is undefined", () => { + + const client = new HttpClient(undefined,null); + + assert.isNotNull(client["middleware"]); + + assert.isTrue(client["middleware"] instanceof defaultFetchHandler); + + }); + + it("Should only set custom fetch if middleware parameter is null && customFetch is defined", () => { + + const client = new HttpClient(dummyCustomFetch, null); + + assert.isUndefined(client["middleware"]); + assert.equal(client["customFetch"], dummyCustomFetch); + + }); + }); + + // describe("sendRequest", async () => { + // it("Should throw error for invalid request options incase if the url and options are passed", async () => { + // try { + // const url = "dummy_url"; + // const context: MiddlewareContext = { + // request: url, + // options: { + // method: "GET" + // } + // }; + + // assert.isTrue(httpClient["middleware"] instanceof defaultFetchHandler) + // await httpClient.executeFetch(context); + // throw new Error("Test Failed - Something wrong with the context validation"); + // } catch (error) { + // assert.equal(error.name, "InvalidRequestOptions"); + // } + // }); + + // it("Should execute for context object with Request instance", async () => { + // const request: FetchRequestInfo = "dummy_url"; + // const options: FetchRequestInit = { + // method: "GET" + // }; + // const context: MiddlewareContext = { + // request, + // options + // }; + // await httpClient.executeFetch(context); + // }); + + // it("Should execute for context object with request uri and options", async () => { + // const url = "dummy_url"; + // const options: FetchRequestInit = { + // method: "GET", + // }; + // const context: MiddlewareContext = { + // request: url, + // options, + // }; + // await httpClient.executeFetch(context); + // }); + // }); +}); diff --git a/http/typescript/fetch/test/browser/index.ts b/http/typescript/fetch/test/browser/index.ts new file mode 100644 index 0000000000..477ad5b15d --- /dev/null +++ b/http/typescript/fetch/test/browser/index.ts @@ -0,0 +1,5 @@ +export * from "./MiddlewareFactory" +export * from "../common/middleware/MiddlewareUtil" +export * from "../common/middleware/RetryHandler"; +export * from "../common/middleware/RetryHandlerOptions"; +export * from "./httpClient"; From 5aaca76461b5e8b4818099a3364b2528dc0499a8 Mon Sep 17 00:00:00 2001 From: "nikithauc@gmail.com" Date: Thu, 14 Oct 2021 21:15:54 -0700 Subject: [PATCH 14/34] adding abstraction tests --- abstractions/typescript/karma.conf.js | 13 + abstractions/typescript/package-lock.json | 3637 ++++++++++++++++- abstractions/typescript/package.json | 36 +- abstractions/typescript/rollup.config.js | 28 + .../baseBearerTokenAuthenticationProvider.ts | 6 +- abstractions/typescript/src/dom.shims.d.ts | 7 + abstractions/typescript/src/index.ts | 2 +- .../typescript/src/requestInformation.ts | 62 +- abstractions/typescript/src/utils/shims.ts | 7 - abstractions/typescript/test/browser/index.ts | 2 + .../test/browser/requestInformation.ts | 20 + .../test/common/requestInformation.ts | 22 + .../test/node/requestInformation.ts | 21 + abstractions/typescript/tsconfig.cjs.json | 2 +- http/typescript/fetch/.npmignore | 4 +- http/typescript/fetch/dom.shim.d.ts | 13 + http/typescript/fetch/karma.conf.js | 3 +- http/typescript/fetch/package-lock.json | 3500 +++++++++++++++- http/typescript/fetch/package.json | 23 +- http/typescript/fetch/rollup.config.js | 18 +- http/typescript/fetch/src/browser/index.ts | 4 +- http/typescript/fetch/src/demo.ts | 20 - .../fetch/src/fetchRequestAdapter.ts | 129 +- http/typescript/fetch/src/httpClient.ts | 4 - http/typescript/fetch/src/index.ts | 6 +- .../fetch/src/kiotaClientFactory.ts | 16 - .../src/middlewares/MiddlewareControl.ts | 12 +- .../middlewares/browser/middlewareFactory.ts | 1 - .../options/RetryHandlerOptions.ts | 10 +- .../middlewares/options/middlewareOption.ts | 3 - .../options/redirectHandlerOption.ts | 9 +- .../fetch/src/middlewares/retryHandler.ts | 6 +- http/typescript/fetch/src/utils/fetch.shim.ts | 8 - .../headersUtil.ts} | 24 +- .../{dom.d.ts => src/utils/referDom.d.ts} | 0 .../test/common/middleware/MiddlewareUtil.ts | 30 +- http/typescript/fetch/tsconfig.cjs.json | 3 +- http/typescript/fetch/tsconfig.test.json | 16 - 38 files changed, 7334 insertions(+), 393 deletions(-) create mode 100644 abstractions/typescript/karma.conf.js create mode 100644 abstractions/typescript/rollup.config.js create mode 100644 abstractions/typescript/src/dom.shims.d.ts delete mode 100644 abstractions/typescript/src/utils/shims.ts create mode 100644 abstractions/typescript/test/browser/index.ts create mode 100644 abstractions/typescript/test/browser/requestInformation.ts create mode 100644 abstractions/typescript/test/common/requestInformation.ts create mode 100644 abstractions/typescript/test/node/requestInformation.ts create mode 100644 http/typescript/fetch/dom.shim.d.ts delete mode 100644 http/typescript/fetch/src/demo.ts delete mode 100644 http/typescript/fetch/src/kiotaClientFactory.ts delete mode 100644 http/typescript/fetch/src/middlewares/options/middlewareOption.ts delete mode 100644 http/typescript/fetch/src/utils/fetch.shim.ts rename http/typescript/fetch/src/{middlewares/middlewareUtil.ts => utils/headersUtil.ts} (65%) rename http/typescript/fetch/{dom.d.ts => src/utils/referDom.d.ts} (100%) delete mode 100644 http/typescript/fetch/tsconfig.test.json diff --git a/abstractions/typescript/karma.conf.js b/abstractions/typescript/karma.conf.js new file mode 100644 index 0000000000..ed70e00538 --- /dev/null +++ b/abstractions/typescript/karma.conf.js @@ -0,0 +1,13 @@ +module.exports = function(config) { + config.set({ + frameworks: ["mocha", "chai", "karma-typescript"], + files: [{ pattern: "dist/es/test/index.js", type: "module" }], + preprocessors: { + "**/*.ts": ["karma-typescript"], + }, + karmaTypescriptConfig: { + tsconfig: "./tsconfig.cjs.json", + }, + browsers: ["ChromeHeadless"], + }); +}; \ No newline at end of file diff --git a/abstractions/typescript/package-lock.json b/abstractions/typescript/package-lock.json index 6cc1dd2e9c..a1978ebd11 100644 --- a/abstractions/typescript/package-lock.json +++ b/abstractions/typescript/package-lock.json @@ -4,22 +4,3657 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "dev": true + }, + "@babel/core": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.8", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", + "dev": true, + "requires": { + "@babel/types": "^7.15.6", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + } + }, + "@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "dev": true, + "requires": { + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", + "dev": true + }, + "@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@rollup/plugin-commonjs": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.0.tgz", + "integrity": "sha512-XDQimjHl0kNotAV5lLo34XoygaI0teqiKGJ100B3iCU8+15YscJPeqk2KqkqD3NIe1H8ZTUo5lYjUFZyEgASTw==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.0.5.tgz", + "integrity": "sha512-mVaw6uxtvuGx/XCI4qBQXsDZJUfyx5vp39iE0J/7Hd6wDhEbjHr6aES7Nr9yWbuE0BY+oKp6N7Bq6jX5NCGNmQ==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + } + } + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@types/chai": { + "version": "4.2.22", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.22.tgz", + "integrity": "sha512-tFfcE+DSTzWAgifkjik9AySNqIyNoYwmR+uecPwwD/XRNfvOjmC/FjCxpiUGDkDVDphPfCUecSQVFw+lN3M3kQ==", + "dev": true + }, + "@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/mocha": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", + "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", + "dev": true + }, + "@types/node": { + "version": "16.10.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.9.tgz", + "integrity": "sha512-H9ReOt+yqIJPCutkTYjFjlyK6WEMQYT9hLZMlWtOjFQY2ItppsWZ6RJf8Aw+jz5qTYceuHvFgPIaKOHtLAEWBw==", + "dev": true + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/sinon": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.4.tgz", + "integrity": "sha512-fOYjrxQv8zJsqOY6V6ecP4eZhQBxtY80X0er1VVnUIAIZo74jHm8e1vguG5Yt4Iv8W2Wr7TgibB8MfRe32k9pA==", + "dev": true, + "requires": { + "@sinonjs/fake-timers": "^7.1.0" + } + }, "@types/uuid": { "version": "8.3.1", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==", "dev": true }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "requires": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "async": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.1.tgz", + "integrity": "sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg==", + "dev": true + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "requires": { + "resolve": "^1.17.0" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz", + "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001265", + "electron-to-chromium": "^1.3.867", + "escalade": "^3.1.1", + "node-releases": "^2.0.0", + "picocolors": "^1.0.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001267", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001267.tgz", + "integrity": "sha512-r1mjTzAuJ9W8cPBGbbus8E0SKcUP7gn03R14Wk8FlAlqhH9hroy9nLqmpuXlfKEw/oILW+FGz47ipXV2O7x8lg==", + "dev": true + }, + "chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "date-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "domain-browser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.869", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.869.tgz", + "integrity": "sha512-mcoyZ2jd691yAx0OHqqGw+aPCcRYVDw/bqPy660aBfcQkUcWcfAVsbL4M9WeevflKH4MfpKCtnOngVLM7HzSzA==", + "dev": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "engine.io": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.1.tgz", + "integrity": "sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.0", + "ws": "~7.4.2" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.3.tgz", + "integrity": "sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA==", + "dev": true, + "requires": { + "base64-arraybuffer": "0.1.4" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dev": true, + "requires": { + "source-map": "~0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", + "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0" + } + }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.2.tgz", + "integrity": "sha512-o5+eTUYzCJ11/+JhW5/FUCdfsdoYVdQ/8I/OveE2XsjehYn5DdeSnNQAbjYaO8gQ6hvGTN6GM6ddQqpTVG5j8g==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", + "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "karma": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.4.tgz", + "integrity": "sha512-hbhRogUYIulfkBTZT7xoPrCYhRBnBoqbbL4fszWD0ReFGUxU+LYBr3dwKdAluaDQ/ynT9/7C+Lf7pPNW4gSx4Q==", + "dev": true, + "requires": { + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "colors": "^1.4.0", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.3.0", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^3.1.0", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.28", + "yargs": "^16.1.1" + } + }, + "karma-chai": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/karma-chai/-/karma-chai-0.1.0.tgz", + "integrity": "sha1-vuWtQEAFF4Ea40u5RfdikJEIt5o=", + "dev": true + }, + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "dev": true, + "requires": { + "which": "^1.2.1" + } + }, + "karma-firefox-launcher": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.1.tgz", + "integrity": "sha512-VzDMgPseXak9DtfyE1O5bB2BwsMy1zzO1kUxVW1rP0yhC4tDNJ0p3JoFdzvrK4QqVzdqUMa9Rx9YzkdFp8hz3Q==", + "dev": true, + "requires": { + "is-wsl": "^2.2.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "karma-mocha": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", + "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", + "dev": true, + "requires": { + "minimist": "^1.2.3" + } + }, + "karma-typescript": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-5.5.2.tgz", + "integrity": "sha512-2rNhiCMrIF+VR8jMuovOLSRjNkjdoE/kQ4XYZU94lMkHNQtnqCaToAnztMj4fuOPRErL7VIkwvJEO7jBd47Q6A==", + "dev": true, + "requires": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2", + "assert": "^2.0.0", + "async": "^3.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.4.3", + "combine-source-map": "^0.8.0", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "convert-source-map": "^1.7.0", + "crypto-browserify": "^3.12.0", + "diff": "^4.0.1", + "domain-browser": "^4.16.0", + "events": "^3.2.0", + "glob": "^7.1.6", + "https-browserify": "^1.0.0", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.19", + "log4js": "^6.3.0", + "minimatch": "^3.0.4", + "os-browserify": "^0.3.0", + "pad": "^3.2.0", + "path-browserify": "^1.0.0", + "process": "^0.11.10", + "punycode": "^2.1.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.1.1", + "source-map": "^0.7.3", + "stream-browserify": "^3.0.0", + "stream-http": "^3.1.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.11", + "tmp": "^0.2.1", + "tty-browserify": "^0.0.1", + "url": "^0.11.0", + "util": "^0.12.1", + "vm-browserify": "^1.1.2" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log4js": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "dev": true, + "requires": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + }, + "mime-db": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", + "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", + "dev": true + }, + "mime-types": { + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", + "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "dev": true, + "requires": { + "mime-db": "1.50.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mocha": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "node-releases": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz", + "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "pad": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pad/-/pad-3.2.0.tgz", + "integrity": "sha512-2u0TrjcGbOjBTJpyewEl4hBO3OeX5wWue7eIFPzQTg6wFSvoaHcBTTUY5m+n0hd04gmTCPuY0kCpVIVuw5etwg==", + "dev": true, + "requires": { + "wcwidth": "^1.0.1" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rollup": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.0.tgz", + "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "dependencies": { + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "socket.io": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz", + "integrity": "sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw==", + "dev": true, + "requires": { + "@types/cookie": "^0.4.0", + "@types/cors": "^2.8.8", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.1", + "engine.io": "~4.1.0", + "socket.io-adapter": "~2.1.0", + "socket.io-parser": "~4.0.3" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz", + "integrity": "sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==", + "dev": true + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dev": true, + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "requires": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } + } + }, + "stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } + } + }, + "streamroller": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", + "dev": true, + "requires": { + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typescript": { "version": "4.4.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", "dev": true }, + "ua-parser-js": { + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", + "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.7" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } -} \ No newline at end of file +} diff --git a/abstractions/typescript/package.json b/abstractions/typescript/package.json index 9f945d4a88..b16e1c0c1c 100644 --- a/abstractions/typescript/package.json +++ b/abstractions/typescript/package.json @@ -2,18 +2,19 @@ "name": "@microsoft/kiota-abstractions", "version": "1.0.21", "description": "Core abstractions for kiota generated libraries in TypeScript and JavaScript", - "main": "dist/cjs/index.js", - "types": "dist/cjs/index.d.ts", - "module": "dist/es/index.js", - "browser": { - "dist/cjs/index.js": "dist/es/index.js" - }, + "main": "dist/cjs/src/index.js", + "types": "dist/cjs/src/index.d.ts", + "module": "dist/es/src/index.js", "scripts": { "build": "npm run build:cjs && npm run build:es", "build:cjs": "tsc -p tsconfig.cjs.json", "build:es": "tsc -p tsconfig.es.json", - "test": "echo \"Error: no test specified\" && exit 1", - "clean": "rm -r ./dist" + "test:cjs": "npm run build:cjs && mocha 'dist/cjs/test/common/**/*.js' && mocha 'dist/cjs/test/node/**/*.js'", + "test:es": " npm run build:es && mocha 'dist/es/test/common/**/*.js' --require esm && mocha 'dist/es/test/node/**/*.js' --require esm", + "test": "npm run test:cjs && npm run test:es", + "clean": "rm -r ./dist", + "karma": "npm run rollup && karma start --single-run --browsers ChromeHeadless karma.conf.js", + "rollup": "rollup -c" }, "repository": "git://github.com/microsoft/kiota.git", "keywords": [ @@ -29,8 +30,25 @@ }, "homepage": "https://github.com/microsoft/kiota#readme", "devDependencies": { + "@types/chai": "^4.2.22", + "@types/mocha": "^9.0.0", + "@types/sinon": "^10.0.4", + "chai": "^4.3.4", + "esm": "^3.2.25", + "karma": "^6.3.4", + "karma-chai": "^0.1.0", + "karma-chrome-launcher": "^3.1.0", + "karma-firefox-launcher": "^2.1.1", + "karma-mocha": "^2.0.1", + "karma-typescript": "^5.5.2", + "mocha": "^8.4.0", + "@types/node": "^16.10.5", "@types/uuid": "^8.3.1", - "typescript": "^4.4.3" + "typescript": "^4.4.3", + "@rollup/plugin-commonjs": "^21.0.0", + "@rollup/plugin-node-resolve": "^13.0.5", + "rollup": "^2.58.0", + "rollup-plugin-terser": "^7.0.2" }, "publishConfig": { "registry": "https://npm.pkg.github.com" diff --git a/abstractions/typescript/rollup.config.js b/abstractions/typescript/rollup.config.js new file mode 100644 index 0000000000..16862b8890 --- /dev/null +++ b/abstractions/typescript/rollup.config.js @@ -0,0 +1,28 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +import resolve from "@rollup/plugin-node-resolve"; +import commonjs from "@rollup/plugin-commonjs"; + +const config = [{ + input: ["dist/es/test/browser/index.js"], + output: { + file: "dist/es/test/index.js", + format: "esm", + name: "MicrosoftGraph", + }, + plugins: [ + commonjs({ include: ["node_modules/**"] }), + resolve({ + browser: true, + preferBuiltins: false, + + }) + ], +}]; + +export default config; \ No newline at end of file diff --git a/abstractions/typescript/src/authentication/baseBearerTokenAuthenticationProvider.ts b/abstractions/typescript/src/authentication/baseBearerTokenAuthenticationProvider.ts index 0dc9d9c4c4..01a7382e28 100644 --- a/abstractions/typescript/src/authentication/baseBearerTokenAuthenticationProvider.ts +++ b/abstractions/typescript/src/authentication/baseBearerTokenAuthenticationProvider.ts @@ -8,15 +8,15 @@ export abstract class BaseBearerTokenAuthenticationProvider implements Authentic if(!request) { throw new Error('request info cannot be null'); } - if(!request.headers?.has(BaseBearerTokenAuthenticationProvider.authorizationHeaderKey)) { + if(!request.headers[BaseBearerTokenAuthenticationProvider.authorizationHeaderKey]) { const token = await this.getAuthorizationToken(request); if(!token) { throw new Error('Could not get an authorization token'); } if(!request.headers) { - //request.headers = new Map(); + request.headers = {}; } - request.headers?.set(BaseBearerTokenAuthenticationProvider.authorizationHeaderKey, `Bearer ${token}`); + request.headers[BaseBearerTokenAuthenticationProvider.authorizationHeaderKey] = `Bearer ${token}`; } } /** diff --git a/abstractions/typescript/src/dom.shims.d.ts b/abstractions/typescript/src/dom.shims.d.ts new file mode 100644 index 0000000000..ee44ab48e7 --- /dev/null +++ b/abstractions/typescript/src/dom.shims.d.ts @@ -0,0 +1,7 @@ +interface Request { } +interface RequestInit { } +interface Response { } +interface Headers { } +interface ReadableStream { } + +interface ReadableStreamContent { } \ No newline at end of file diff --git a/abstractions/typescript/src/index.ts b/abstractions/typescript/src/index.ts index 4d0911a5c0..d677e085dd 100644 --- a/abstractions/typescript/src/index.ts +++ b/abstractions/typescript/src/index.ts @@ -9,4 +9,4 @@ export * from "./nativeResponseHandler"; export * from "./nativeResponseWrapper"; export * from "./requestAdapter"; export * from "./requestInformation"; -export * from "./responseHandler"; \ No newline at end of file +export * from "./responseHandler"; diff --git a/abstractions/typescript/src/requestInformation.ts b/abstractions/typescript/src/requestInformation.ts index eb5850dddb..c1569747de 100644 --- a/abstractions/typescript/src/requestInformation.ts +++ b/abstractions/typescript/src/requestInformation.ts @@ -4,7 +4,7 @@ import { RequestOption } from "./requestOption"; import { RequestAdapter } from "./requestAdapter"; /** This class represents an abstract HTTP request. */ -export class RequestInformation{ +export class RequestInformation { /** The URI of the request. */ public URI?: string; /** @@ -13,18 +13,18 @@ export class RequestInformation{ * @param pathSegment the segment to append to the current path. * @param isRawUrl whether the path segment is a raw url. When true, the segment is not happened and the current path is parsed for query parameters. */ - public setUri(currentPath: string, pathSegment: string, isRawUrl: boolean) : void { - if(isRawUrl) { + public setUri(currentPath: string, pathSegment: string, isRawUrl: boolean): void { + if (isRawUrl) { const questionMarkSplat = currentPath.split('?'); const schemeHostAndPath = questionMarkSplat[0]; this.URI = schemeHostAndPath; - if(questionMarkSplat.length > 1) { + if (questionMarkSplat.length > 1) { const queryString = questionMarkSplat[1]; - queryString?.split('&').forEach(queryPair => { + queryString ?.split('&').forEach(queryPair => { const keyValue = queryPair.split('='); - if(keyValue.length > 0) { + if (keyValue.length > 0) { const key = keyValue[0]; - if(key) { + if (key) { this.queryParameters.set(key, keyValue.length > 1 ? keyValue[1] : undefined); } } @@ -37,23 +37,32 @@ export class RequestInformation{ /** The HTTP method for the request */ public httpMethod?: HttpMethod; /** The Request Body. */ - public content?: ReadableStream; + public content?: ReadableStreamContent; /** The Query Parameters of the request. */ public queryParameters: Map = new Map(); //TODO: case insensitive /** The Request Headers. */ - public headers: Map = new Map(); //TODO: case insensitive - private _requestOptions = new Map(); //TODO: case insensitive + public headers: Record; //TODO: case insensitive + + /** + * /TODO: case insensitive + * TODO: Determine the scope of request options + * Request Options should also consider specific request configurations such as : + * Axios : https://axios-http.com/docs/req_config + * Fetch Request Options : https://developer.mozilla.org/en-US/docs/Web/API/Request#properties + * https://github.com/microsoftgraph/msgraph-sdk-javascript/pull/105 + */ + private _requestOptions = new Map(); /** Gets the request options for the request. */ public getRequestOptions() { return this._requestOptions.values(); } public addRequestOptions(...options: RequestOption[]) { - if(!options || options.length === 0) return; + if (!options || options.length === 0) return; options.forEach(option => { this._requestOptions.set(option.getKey(), option); }); } /** Removes the request options for the request. */ public removeRequestOptions(...options: RequestOption[]) { - if(!options || options.length === 0) return; + if (!options || options.length === 0) return; options.forEach(option => { this._requestOptions.delete(option.getKey()); }); @@ -68,13 +77,16 @@ export class RequestInformation{ * @typeParam T the model type. */ public setContentFromParsable = (requestAdapter?: RequestAdapter | undefined, contentType?: string | undefined, ...values: T[]): void => { - if(!requestAdapter) throw new Error("httpCore cannot be undefined"); - if(!contentType) throw new Error("contentType cannot be undefined"); - if(!values || values.length === 0) throw new Error("values cannot be undefined or empty"); + if (!requestAdapter) throw new Error("httpCore cannot be undefined"); + if (!contentType) throw new Error("contentType cannot be undefined"); + if (!values || values.length === 0) throw new Error("values cannot be undefined or empty"); const writer = requestAdapter.getSerializationWriterFactory().getSerializationWriter(contentType); - this.headers.set(RequestInformation.contentTypeHeader, contentType); - if(values.length === 1) + if(!this.headers){ + this.headers = {}; + } + this.headers[RequestInformation.contentTypeHeader] = contentType; + if (values.length === 1) writer.writeObjectValue(undefined, values[0]); else writer.writeCollectionOfObjectValues(undefined, values); @@ -84,17 +96,23 @@ export class RequestInformation{ * Sets the request body to be a binary stream. * @param value the binary stream */ - public setStreamContent = (value: ReadableStream): void => { - this.headers.set(RequestInformation.contentTypeHeader, RequestInformation.binaryContentType); + public setStreamContent = (value: ReadableStreamContent): void => { + if(!this.headers){ + this.headers = {}; + } + this.headers[RequestInformation.contentTypeHeader] = RequestInformation.binaryContentType; this.content = value; } /** * Sets the request headers from a raw object. * @param headers the headers. */ - public setHeadersFromRawObject = (h: object) : void => { + public setHeadersFromRawObject = (h: object): void => { + if(!this.headers){ + this.headers = {}; + } Object.entries(h).forEach(([k, v]) => { - this.headers.set(k, v as string); + this.headers[k] = v as string; }); } /** @@ -103,7 +121,7 @@ export class RequestInformation{ */ public setQueryStringParametersFromRawObject = (q: object): void => { Object.entries(q).forEach(([k, v]) => { - this.headers.set(k, v as string); + this.queryParameters.set(k, v as string); }); } } \ No newline at end of file diff --git a/abstractions/typescript/src/utils/shims.ts b/abstractions/typescript/src/utils/shims.ts deleted file mode 100644 index 8ffd3e43da..0000000000 --- a/abstractions/typescript/src/utils/shims.ts +++ /dev/null @@ -1,7 +0,0 @@ -interface Request {}; -interface RequestInit { - -}; -interface Response {}; -interface Headers {}; -interface ReadableStream{}; \ No newline at end of file diff --git a/abstractions/typescript/test/browser/index.ts b/abstractions/typescript/test/browser/index.ts new file mode 100644 index 0000000000..4636b9f4eb --- /dev/null +++ b/abstractions/typescript/test/browser/index.ts @@ -0,0 +1,2 @@ +export * from "./requestInformation"; +export * from "../common/requestInformation"; \ No newline at end of file diff --git a/abstractions/typescript/test/browser/requestInformation.ts b/abstractions/typescript/test/browser/requestInformation.ts new file mode 100644 index 0000000000..6478da1a11 --- /dev/null +++ b/abstractions/typescript/test/browser/requestInformation.ts @@ -0,0 +1,20 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +import { assert } from "chai"; + +import { RequestInformation } from "../../src/"; + +describe("RequestInformation", () => { + it("Should set request information uri", () => { + const requestInformation = new RequestInformation(); + const browserReadableStream = new ReadableStream(); + requestInformation.setStreamContent(browserReadableStream); + + assert.equal(requestInformation["content"], browserReadableStream) + }); +}); diff --git a/abstractions/typescript/test/common/requestInformation.ts b/abstractions/typescript/test/common/requestInformation.ts new file mode 100644 index 0000000000..aa8e06f9c7 --- /dev/null +++ b/abstractions/typescript/test/common/requestInformation.ts @@ -0,0 +1,22 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +import { assert } from "chai"; + +import { RequestInformation } from "../../src/"; + +describe("RequestInformation", () => { + it("Should set request information uri", () => { + const requestInformation = new RequestInformation(); + const currentPath = "CURRENT_PATH"; + const pathSegment = "PATH_SEGMENT" + requestInformation.setUri( currentPath, pathSegment, false); + assert.isNotNull(URL); + console.log(requestInformation.URI); + assert.equal(requestInformation.URI, currentPath+ "" +pathSegment); + }); +}); diff --git a/abstractions/typescript/test/node/requestInformation.ts b/abstractions/typescript/test/node/requestInformation.ts new file mode 100644 index 0000000000..61a8915596 --- /dev/null +++ b/abstractions/typescript/test/node/requestInformation.ts @@ -0,0 +1,21 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +import { assert } from "chai"; + +import { RequestInformation } from "../../src/"; +import { Readable } from "stream"; + +describe("RequestInformation", () => { + it("Should set request information uri", () => { + const requestInformation = new RequestInformation(); + const nodeReadableStream = new Readable(); + requestInformation.setStreamContent(nodeReadableStream); + + assert.equal(requestInformation["content"], nodeReadableStream) + }); +}); diff --git a/abstractions/typescript/tsconfig.cjs.json b/abstractions/typescript/tsconfig.cjs.json index ed747f5a33..256681ed74 100644 --- a/abstractions/typescript/tsconfig.cjs.json +++ b/abstractions/typescript/tsconfig.cjs.json @@ -6,5 +6,5 @@ "outDir": "./dist/cjs", }, "exclude": ["node_modules", "dist"], - "include": ["./src/**/*.ts",] + "include": ["./src/**/*.ts", "./test"] } \ No newline at end of file diff --git a/http/typescript/fetch/.npmignore b/http/typescript/fetch/.npmignore index bfe3b8d326..045f796b88 100644 --- a/http/typescript/fetch/.npmignore +++ b/http/typescript/fetch/.npmignore @@ -1 +1,3 @@ -tsconfig.json \ No newline at end of file +tsconfig.json +dist/cjs/test +dist/es/test \ No newline at end of file diff --git a/http/typescript/fetch/dom.shim.d.ts b/http/typescript/fetch/dom.shim.d.ts new file mode 100644 index 0000000000..e31b8219a0 --- /dev/null +++ b/http/typescript/fetch/dom.shim.d.ts @@ -0,0 +1,13 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +interface Request { } +interface RequestInit { } +interface Response { } +interface Headers { } +interface ReadableStream { } +interface fetch { } \ No newline at end of file diff --git a/http/typescript/fetch/karma.conf.js b/http/typescript/fetch/karma.conf.js index 956aae3abb..ed70e00538 100644 --- a/http/typescript/fetch/karma.conf.js +++ b/http/typescript/fetch/karma.conf.js @@ -1,8 +1,7 @@ module.exports = function(config) { config.set({ frameworks: ["mocha", "chai", "karma-typescript"], - //files: ["src/browser/index.ts", "test/common/**/*.ts", "test/browser/**/*.ts", "test/testUtils.ts"], - files: [{ pattern: "dist/es/test/rolledup.js", type: "module" }], + files: [{ pattern: "dist/es/test/index.js", type: "module" }], preprocessors: { "**/*.ts": ["karma-typescript"], }, diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index 8906d30adb..22b460133c 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -1,6 +1,6 @@ { - "name": "@microsoft/kiota-http-fetch", - "version": "1.0.8", + "name": "@microsoft/kiota-http-fetchlibrary", + "version": "1.0.10", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -8,6 +8,7 @@ "version": "7.15.8", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "dev": true, "requires": { "@babel/highlight": "^7.14.5" } @@ -200,7 +201,8 @@ "@babel/helper-validator-identifier": { "version": "7.15.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true }, "@babel/helper-validator-option": { "version": "7.14.5", @@ -223,6 +225,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", @@ -324,110 +327,3305 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "sprintf-js": "~1.0.2" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@microsoft/kiota-abstractions": { + "version": "file:../../../abstractions/typescript", + "requires": { + "uuid": "^8.3.2" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" + }, + "@babel/core": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", + "requires": { + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.8", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/generator": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", + "requires": { + "@babel/types": "^7.15.6", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + } + }, + "@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "requires": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", + "requires": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + }, + "@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "requires": { + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==" + }, + "@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + }, + "@rollup/plugin-commonjs": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.0.tgz", + "integrity": "sha512-XDQimjHl0kNotAV5lLo34XoygaI0teqiKGJ100B3iCU8+15YscJPeqk2KqkqD3NIe1H8ZTUo5lYjUFZyEgASTw==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.0.5.tgz", + "integrity": "sha512-mVaw6uxtvuGx/XCI4qBQXsDZJUfyx5vp39iE0J/7Hd6wDhEbjHr6aES7Nr9yWbuE0BY+oKp6N7Bq6jX5NCGNmQ==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + } + } + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@types/chai": { + "version": "4.2.22", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.22.tgz", + "integrity": "sha512-tFfcE+DSTzWAgifkjik9AySNqIyNoYwmR+uecPwwD/XRNfvOjmC/FjCxpiUGDkDVDphPfCUecSQVFw+lN3M3kQ==" + }, + "@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==" + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "@types/mocha": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", + "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==" + }, + "@types/node": { + "version": "16.10.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.9.tgz", + "integrity": "sha512-H9ReOt+yqIJPCutkTYjFjlyK6WEMQYT9hLZMlWtOjFQY2ItppsWZ6RJf8Aw+jz5qTYceuHvFgPIaKOHtLAEWBw==" + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "requires": { + "@types/node": "*" + } + }, + "@types/sinon": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.4.tgz", + "integrity": "sha512-fOYjrxQv8zJsqOY6V6ecP4eZhQBxtY80X0er1VVnUIAIZo74jHm8e1vguG5Yt4Iv8W2Wr7TgibB8MfRe32k9pA==", + "requires": { + "@sinonjs/fake-timers": "^7.1.0" + } + }, + "@types/uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==" + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==" + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "requires": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "async": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.1.tgz", + "integrity": "sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg==" + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "requires": { + "resolve": "^1.17.0" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz", + "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==", + "requires": { + "caniuse-lite": "^1.0.30001265", + "electron-to-chromium": "^1.3.867", + "escalade": "^3.1.1", + "node-releases": "^2.0.0", + "picocolors": "^1.0.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "caniuse-lite": { + "version": "1.0.30001267", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001267.tgz", + "integrity": "sha512-r1mjTzAuJ9W8cPBGbbus8E0SKcUP7gn03R14Wk8FlAlqhH9hroy9nLqmpuXlfKEw/oILW+FGz47ipXV2O7x8lg==" + }, + "chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=" + }, + "date-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "requires": { + "type-detect": "^4.0.0" + } + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "domain-browser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.869", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.869.tgz", + "integrity": "sha512-mcoyZ2jd691yAx0OHqqGw+aPCcRYVDw/bqPy660aBfcQkUcWcfAVsbL4M9WeevflKH4MfpKCtnOngVLM7HzSzA==" + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "engine.io": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.1.tgz", + "integrity": "sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w==", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.0", + "ws": "~7.4.2" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "engine.io-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.3.tgz", + "integrity": "sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA==", + "requires": { + "base64-arraybuffer": "0.1.4" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" + }, + "follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "requires": { + "source-map": "~0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + }, + "is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "requires": { + "@types/estree": "*" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==" + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", + "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0" + } + }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "istanbul-lib-coverage": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.2.tgz", + "integrity": "sha512-o5+eTUYzCJ11/+JhW5/FUCdfsdoYVdQ/8I/OveE2XsjehYn5DdeSnNQAbjYaO8gQ6hvGTN6GM6ddQqpTVG5j8g==" + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "istanbul-reports": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", + "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "karma": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.4.tgz", + "integrity": "sha512-hbhRogUYIulfkBTZT7xoPrCYhRBnBoqbbL4fszWD0ReFGUxU+LYBr3dwKdAluaDQ/ynT9/7C+Lf7pPNW4gSx4Q==", + "requires": { + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "colors": "^1.4.0", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.3.0", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^3.1.0", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.28", + "yargs": "^16.1.1" + } + }, + "karma-chai": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/karma-chai/-/karma-chai-0.1.0.tgz", + "integrity": "sha1-vuWtQEAFF4Ea40u5RfdikJEIt5o=" + }, + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "requires": { + "which": "^1.2.1" + } + }, + "karma-firefox-launcher": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.1.tgz", + "integrity": "sha512-VzDMgPseXak9DtfyE1O5bB2BwsMy1zzO1kUxVW1rP0yhC4tDNJ0p3JoFdzvrK4QqVzdqUMa9Rx9YzkdFp8hz3Q==", + "requires": { + "is-wsl": "^2.2.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "karma-mocha": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", + "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", + "requires": { + "minimist": "^1.2.3" + } + }, + "karma-typescript": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-5.5.2.tgz", + "integrity": "sha512-2rNhiCMrIF+VR8jMuovOLSRjNkjdoE/kQ4XYZU94lMkHNQtnqCaToAnztMj4fuOPRErL7VIkwvJEO7jBd47Q6A==", + "requires": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2", + "assert": "^2.0.0", + "async": "^3.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.4.3", + "combine-source-map": "^0.8.0", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "convert-source-map": "^1.7.0", + "crypto-browserify": "^3.12.0", + "diff": "^4.0.1", + "domain-browser": "^4.16.0", + "events": "^3.2.0", + "glob": "^7.1.6", + "https-browserify": "^1.0.0", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.19", + "log4js": "^6.3.0", + "minimatch": "^3.0.4", + "os-browserify": "^0.3.0", + "pad": "^3.2.0", + "path-browserify": "^1.0.0", + "process": "^0.11.10", + "punycode": "^2.1.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.1.1", + "source-map": "^0.7.3", + "stream-browserify": "^3.0.0", + "stream-http": "^3.1.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.11", + "tmp": "^0.2.1", + "tty-browserify": "^0.0.1", + "url": "^0.11.0", + "util": "^0.12.1", + "vm-browserify": "^1.1.2" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log4js": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "requires": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + }, + "mime-db": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", + "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==" + }, + "mime-types": { + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", + "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "requires": { + "mime-db": "1.50.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mocha": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "node-releases": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz", + "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "pad": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pad/-/pad-3.2.0.tgz", + "integrity": "sha512-2u0TrjcGbOjBTJpyewEl4hBO3OeX5wWue7eIFPzQTg6wFSvoaHcBTTUY5m+n0hd04gmTCPuY0kCpVIVuw5etwg==", + "requires": { + "wcwidth": "^1.0.1" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rollup": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.0.tgz", + "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==", + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "dependencies": { + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "socket.io": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz", + "integrity": "sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw==", + "requires": { + "@types/cookie": "^0.4.0", + "@types/cors": "^2.8.8", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.1", + "engine.io": "~4.1.0", + "socket.io-adapter": "~2.1.0", + "socket.io-parser": "~4.0.3" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "socket.io-adapter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz", + "integrity": "sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==" + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "requires": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } + } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, + "streamroller": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==" + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "requires": { - "p-locate": "^4.1.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "requires": { - "p-try": "^2.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "p-limit": "^2.2.0" + "safe-buffer": "~5.2.0" } - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@microsoft/kiota-abstractions": { - "version": "file:../../../abstractions/typescript", - "requires": { - "uuid": "^8.3.2" - }, - "dependencies": { - "@types/lodash": { - "version": "4.14.172", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.172.tgz", - "integrity": "sha512-/BHF5HAx3em7/KkzVKm3LrsD6HZAXuXO1AJZQ3cRRBZj4oHZDviWPYu0aEplAqDFNHZPW6d3G7KN+ONcCCC7pw==" }, - "@types/node": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.6.1.tgz", - "integrity": "sha512-Sr7BhXEAer9xyGuCN3Ek9eg9xPviCF2gfu9kTfuU2HkTVAMYSDeX40fvpmo72n5nansg3nsBjuQBrsS28r+NUw==" + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } }, - "@types/uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==" + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } }, "typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==" + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", + "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==" + }, + "ua-parser-js": { + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==" + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, - "web-streams-polyfill": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.1.tgz", - "integrity": "sha512-Czi3fG883e96T4DLEPRvufrF2ydhOOW1+1a6c3gNjH2aIh50DNFBdfwh2AKoOf1rXvpvavAoA11Qdq9+BKjE0Q==" + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", + "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.7" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } }, @@ -435,6 +3633,7 @@ "version": "21.0.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.0.tgz", "integrity": "sha512-XDQimjHl0kNotAV5lLo34XoygaI0teqiKGJ100B3iCU8+15YscJPeqk2KqkqD3NIe1H8ZTUo5lYjUFZyEgASTw==", + "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", "commondir": "^1.0.1", @@ -449,6 +3648,7 @@ "version": "13.0.5", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.0.5.tgz", "integrity": "sha512-mVaw6uxtvuGx/XCI4qBQXsDZJUfyx5vp39iE0J/7Hd6wDhEbjHr6aES7Nr9yWbuE0BY+oKp6N7Bq6jX5NCGNmQ==", + "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", "@types/resolve": "1.17.1", @@ -462,6 +3662,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, "requires": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", @@ -471,7 +3672,8 @@ "estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true } } }, @@ -479,6 +3681,7 @@ "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, "requires": { "type-detect": "4.0.8" } @@ -487,6 +3690,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" } @@ -495,6 +3699,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", + "dev": true, "requires": { "@sinonjs/commons": "^1.6.0", "lodash.get": "^4.4.2", @@ -504,7 +3709,8 @@ "@sinonjs/text-encoding": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true }, "@tsconfig/node10": { "version": "1.0.8", @@ -557,7 +3763,8 @@ "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true }, "@types/mocha": { "version": "9.0.0", @@ -568,12 +3775,14 @@ "@types/node": { "version": "16.10.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.3.tgz", - "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==" + "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==", + "dev": true }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, "requires": { "@types/node": "*" } @@ -736,7 +3945,8 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "base64-arraybuffer": { "version": "0.1.4", @@ -790,6 +4000,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -932,7 +4143,8 @@ "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true }, "buffer-xor": { "version": "1.0.3", @@ -943,7 +4155,8 @@ "builtin-modules": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==" + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "dev": true }, "builtin-status-codes": { "version": "3.0.0", @@ -1009,6 +4222,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1019,6 +4233,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -1027,6 +4242,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -1034,7 +4250,8 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true } } }, @@ -1143,12 +4360,14 @@ "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true }, "component-emitter": { "version": "1.3.0", @@ -1159,7 +4378,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "connect": { "version": "3.7.0", @@ -1355,7 +4575,8 @@ "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true }, "default-require-extensions": { "version": "3.0.0", @@ -1615,7 +4836,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "esm": { "version": "3.2.25", @@ -1632,7 +4854,8 @@ "estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true }, "eventemitter3": { "version": "4.0.7", @@ -1761,18 +4984,21 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "gensync": { "version": "1.0.0-beta.2", @@ -1823,6 +5049,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1863,6 +5090,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -1876,7 +5104,8 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "has-symbols": { "version": "1.0.2", @@ -2016,6 +5245,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -2024,7 +5254,8 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "inline-source-map": { "version": "0.6.2", @@ -2102,6 +5333,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", + "dev": true, "requires": { "has": "^1.0.3" } @@ -2154,7 +5386,8 @@ "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true }, "is-nan": { "version": "1.3.2", @@ -2197,6 +5430,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, "requires": { "@types/estree": "*" } @@ -2287,7 +5521,8 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true }, "isbinaryfile": { "version": "4.0.8", @@ -2413,6 +5648,7 @@ "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -2422,12 +5658,14 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -2437,7 +5675,8 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "js-yaml": { "version": "4.0.0", @@ -2481,7 +5720,8 @@ "just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true }, "karma": { "version": "6.3.4", @@ -2642,7 +5882,8 @@ "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true }, "lodash.memoize": { "version": "3.0.4", @@ -2720,6 +5961,7 @@ "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, "requires": { "sourcemap-codec": "^1.4.4" } @@ -2759,7 +6001,8 @@ "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "miller-rabin": { "version": "4.0.1", @@ -2816,6 +6059,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2987,6 +6231,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", + "dev": true, "requires": { "@sinonjs/commons": "^1.7.0", "@sinonjs/fake-timers": "^7.0.4", @@ -3221,6 +6466,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } @@ -3325,7 +6571,8 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-key": { "version": "3.1.1", @@ -3336,12 +6583,14 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "path-to-regexp": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, "requires": { "isarray": "0.0.1" } @@ -3374,7 +6623,8 @@ "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true }, "pkg-dir": { "version": "4.2.0", @@ -3495,6 +6745,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -3578,6 +6829,7 @@ "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -3618,6 +6870,7 @@ "version": "2.58.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.0.tgz", "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==", + "dev": true, "requires": { "fsevents": "~2.3.2" } @@ -3626,6 +6879,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dev": true, "requires": { "@babel/code-frame": "^7.10.4", "jest-worker": "^26.2.1", @@ -3637,6 +6891,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, "requires": { "randombytes": "^2.1.0" } @@ -3646,7 +6901,8 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -3733,6 +6989,7 @@ "version": "11.1.2", "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "dev": true, "requires": { "@sinonjs/commons": "^1.8.3", "@sinonjs/fake-timers": "^7.1.2", @@ -3745,17 +7002,20 @@ "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -3833,12 +7093,14 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true }, "source-map-support": { "version": "0.5.20", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -3847,7 +7109,8 @@ "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true }, "spawn-wrap": { "version": "2.0.0", @@ -4023,6 +7286,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -4031,6 +7295,7 @@ "version": "5.9.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "dev": true, "requires": { "commander": "^2.20.0", "source-map": "~0.7.2", @@ -4040,7 +7305,8 @@ "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true } } }, @@ -4135,7 +7401,8 @@ "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true }, "type-fest": { "version": "0.8.1", @@ -4395,7 +7662,8 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "write-file-atomic": { "version": "3.0.3", @@ -4473,4 +7741,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index 4622b1c505..bd308d6011 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -20,11 +20,10 @@ "build:cjs": "tsc -p tsconfig.cjs.json", "build:es": "tsc -p tsconfig.es.json", "test:cjs": "npm run build:cjs && mocha 'dist/cjs/test/common/**/*.js' && mocha 'dist/cjs/test/node/**/*.js'", - "test:es": " npm run build:es && mocha 'dist/es/test/common/**/*.js' --require esm && && mocha 'dist/es/test/node/**/*.js' --require esm", - "test": "npm run test:cjs && npm run test:es", + "test:es": " npm run build:es && mocha 'dist/es/test/common/**/*.js' --require esm && mocha 'dist/es/test/node/**/*.js' --require esm", + "test": "npm run test:cjs && npm run test:es && npm run karma", "clean": "rm -r ./dist", - "testn": "npm run build:cjs && mocha 'dist/cjs/test/node/**/*.js' --grep HTTPClient.ts", - "karma": "karma start --single-run --browsers ChromeHeadless karma.conf.js", + "karma": "npm run rollup && karma start --single-run --browsers ChromeHeadless karma.conf.js", "rollup": "rollup -c" }, "repository": { @@ -47,12 +46,7 @@ "registry": "https://npm.pkg.github.com" }, "dependencies": { - "@microsoft/kiota-abstractions": "file:../../../abstractions/typescript", - "@rollup/plugin-commonjs": "^21.0.0", - "@rollup/plugin-node-resolve": "^13.0.5", - "rollup": "^2.58.0", - "rollup-plugin-terser": "^7.0.2", - "sinon": "^11.1.2" + "@microsoft/kiota-abstractions": "file:../../../abstractions/typescript" }, "devDependencies": { "@types/chai": "^4.2.22", @@ -72,6 +66,11 @@ "nyc": "^15.1.0", "ts-node": "^10.2.1", "tslib": "^2.3.1", - "typescript": "^4.4.3" + "typescript": "^4.4.3", + "@rollup/plugin-commonjs": "^21.0.0", + "@rollup/plugin-node-resolve": "^13.0.5", + "rollup": "^2.58.0", + "rollup-plugin-terser": "^7.0.2", + "sinon": "^11.1.2" } -} \ No newline at end of file +} diff --git a/http/typescript/fetch/rollup.config.js b/http/typescript/fetch/rollup.config.js index 650bf408ed..16862b8890 100644 --- a/http/typescript/fetch/rollup.config.js +++ b/http/typescript/fetch/rollup.config.js @@ -5,21 +5,13 @@ * ------------------------------------------------------------------------------------------- */ -import { terser } from "rollup-plugin-terser"; import resolve from "@rollup/plugin-node-resolve"; import commonjs from "@rollup/plugin-commonjs"; -const copyRight = `/** -* ------------------------------------------------------------------------------------------- -* Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. -* See License in the project root for license information. -* ------------------------------------------------------------------------------------------- -*/`; - const config = [{ input: ["dist/es/test/browser/index.js"], output: { - file: "dist/es/test/rolledup.js", + file: "dist/es/test/index.js", format: "esm", name: "MicrosoftGraph", }, @@ -29,13 +21,7 @@ const config = [{ browser: true, preferBuiltins: false, - }), - // terser({ - // format: { - // comments: false, - // preamble: copyRight, - // }, - // }), + }) ], }]; diff --git a/http/typescript/fetch/src/browser/index.ts b/http/typescript/fetch/src/browser/index.ts index 0b8f0cfe06..e5fd28da7b 100644 --- a/http/typescript/fetch/src/browser/index.ts +++ b/http/typescript/fetch/src/browser/index.ts @@ -1,4 +1,4 @@ -export * from '../httpCore'; +export * from '../fetchRequestAdapter'; export * from '../httpClient'; export * from '../middlewares/middleware'; export * from '../middlewares/browser/defaultFetchHandler'; @@ -8,4 +8,4 @@ export * from '../middlewares/options/retryHandlerOptions'; export * from '../middlewares/middlewareContext'; export * from '../middlewares/browser/middlewareFactory'; export * from '../middlewares/middlewareControl'; -export * from '../middlewares/middlewareUtil'; +export * from '../utils/headersUtil'; diff --git a/http/typescript/fetch/src/demo.ts b/http/typescript/fetch/src/demo.ts deleted file mode 100644 index 9cf8237fa1..0000000000 --- a/http/typescript/fetch/src/demo.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { HttpClient } from "./httpClient" - - - -async function name(): Promise { - const httpClient = new HttpClient(undefined, null); - const context = { - request:"url", - options:{method:"GET"} - } - - const s = await httpClient.executeFetch(context); - - -} - -name().then().catch((err)=> err); - - - diff --git a/http/typescript/fetch/src/fetchRequestAdapter.ts b/http/typescript/fetch/src/fetchRequestAdapter.ts index 4ca828696f..fd11394679 100644 --- a/http/typescript/fetch/src/fetchRequestAdapter.ts +++ b/http/typescript/fetch/src/fetchRequestAdapter.ts @@ -1,16 +1,11 @@ -import { AuthenticationProvider, BackingStoreFactory, BackingStoreFactorySingleton, HttpCore as IHttpCore, Parsable, ParseNodeFactory, RequestInformation, ResponseHandler, ParseNodeFactoryRegistry, enableBackingStoreForParseNodeFactory, SerializationWriterFactoryRegistry, enableBackingStoreForSerializationWriterFactory, SerializationWriterFactory } from '@microsoft/kiota-abstractions'; -import { HttpClient } from './httpClient'; -import { FetchRequestInfo, FetchRequestInit , FetchResponse } from "./utils/fetchDefinitions"; -import {URLSearchParams} from "./utils/utils" - -import { MiddlewareContext } from './middlewares/middlewareContext'; - -export class HttpCore implements IHttpCore { import { AuthenticationProvider, BackingStoreFactory, BackingStoreFactorySingleton, RequestAdapter, Parsable, ParseNodeFactory, RequestInformation, ResponseHandler, ParseNodeFactoryRegistry, enableBackingStoreForParseNodeFactory, SerializationWriterFactoryRegistry, enableBackingStoreForSerializationWriterFactory, SerializationWriterFactory } from '@microsoft/kiota-abstractions'; -import { Headers as FetchHeadersCtor } from 'cross-fetch'; -import { ReadableStream } from 'web-streams-polyfill'; -import { URLSearchParams } from 'url'; +import { URLSearchParams } from "./utils/utils" import { HttpClient } from './httpClient'; +import { FetchRequestInit, FetchResponse } from "./utils/fetchDefinitions"; +import { MiddlewareContext } from "./middlewares/middlewareContext" +import { MiddlewareControl } from './middlewares/middlewareControl'; +import { Readable } from 'stream'; + export class FetchRequestAdapter implements RequestAdapter { public getSerializationWriterFactory(): SerializationWriterFactory { return this.serializationWriterFactory; @@ -36,45 +31,37 @@ export class FetchRequestAdapter implements RequestAdapter { throw new Error('http client cannot be null'); } } - private getResponseContentType = (response: FetchResponse): string | undefined => { + private getResponseContentType = (response: Response): string | undefined => { const header = response.headers.get("content-type")?.toLowerCase(); if (!header) return undefined; const segments = header.split(';'); if (segments.length === 0) return undefined; else return segments[0]; } - public sendCollectionAsync = async (requestInfo: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInfo) { - throw new Error('requestInfo cannot be null'); - } - await this.authenticationProvider.authenticateRequest(requestInfo); - - const response = await this.httpClient.executeFetch(this.createContext(requestInfo)); - if (responseHandler) { public sendCollectionOfPrimitiveAsync = async (requestInfo: RequestInformation, responseType: "string" | "number" | "boolean" | "Date", responseHandler: ResponseHandler | undefined): Promise => { - if(!requestInfo) { + if (!requestInfo) { throw new Error('requestInfo cannot be null'); } const response = await this.getHttpResponseMessage(requestInfo); - if(responseHandler) { + if (responseHandler) { return await responseHandler.handleResponseAsync(response); } else { - switch(responseType) { + switch (responseType) { case 'string': case 'number': case 'boolean': case 'Date': const payload = await response.arrayBuffer(); const responseContentType = this.getResponseContentType(response); - if(!responseContentType) + if (!responseContentType) throw new Error("no response content type found for deserialization"); - + const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); - if(responseType === 'string') { + if (responseType === 'string') { return rootNode.getCollectionOfPrimitiveValues() as unknown as ResponseType[]; } else if (responseType === 'number') { return rootNode.getCollectionOfPrimitiveValues() as unknown as ResponseType[]; - } else if(responseType === 'boolean') { + } else if (responseType === 'boolean') { return rootNode.getCollectionOfPrimitiveValues() as unknown as ResponseType[]; } else if (responseType === 'Date') { return rootNode.getCollectionOfPrimitiveValues() as unknown as ResponseType[]; @@ -84,15 +71,15 @@ export class FetchRequestAdapter implements RequestAdapter { } } } - public sendCollectionAsync = async (requestInfo: RequestInformation, type: new() => ModelType, responseHandler: ResponseHandler | undefined): Promise => { - if(!requestInfo) { + public sendCollectionAsync = async (requestInformation: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInformation) { throw new Error('requestInfo cannot be null'); } - const response = await this.getHttpResponseMessage(requestInfo); - if(responseHandler) { + const response = await this.getHttpResponseMessage(requestInformation); + if (responseHandler) { return await responseHandler.handleResponseAsync(response); } else { - const payload = await response.arrayBuffer() as ArrayBuffer; + const payload = await response.arrayBuffer(); const responseContentType = this.getResponseContentType(response); if (!responseContentType) throw new Error("no response content type found for deserialization"); @@ -102,19 +89,15 @@ export class FetchRequestAdapter implements RequestAdapter { return result as unknown as ModelType[]; } } - public sendAsync = async (requestInfo: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInfo) { + public sendAsync = async (requestInformation: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInformation) { throw new Error('requestInfo cannot be null'); } - await this.authenticationProvider.authenticateRequest(requestInfo); - - const response = await this.httpClient.executeFetch(this.createContext(requestInfo)); + const response = await this.getHttpResponseMessage(requestInformation); if (responseHandler) { - const response = await this.getHttpResponseMessage(requestInfo); - if(responseHandler) { return await responseHandler.handleResponseAsync(response); } else { - const payload = await response.arrayBuffer() as ArrayBuffer; + const payload = await response.arrayBuffer(); const responseContentType = this.getResponseContentType(response); if (!responseContentType) throw new Error("no response content type found for deserialization"); @@ -124,26 +107,22 @@ export class FetchRequestAdapter implements RequestAdapter { return result as unknown as ModelType; } } - public sendPrimitiveAsync = async (requestInfo: RequestInformation, responseType: "string" | "number" | "boolean" | "Date" | "ReadableStream", responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInfo) { + public sendPrimitiveAsync = async (requestInformation: RequestInformation, responseType: "string" | "number" | "boolean" | "Date" | "ReadableStream", responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInformation) { throw new Error('requestInfo cannot be null'); } - await this.authenticationProvider.authenticateRequest(requestInfo); - - const response = await this.httpClient.executeFetch(this.createContext(requestInfo)); + const response = await this.getHttpResponseMessage(requestInformation); if (responseHandler) { - const response = await this.getHttpResponseMessage(requestInfo); - if(responseHandler) { return await responseHandler.handleResponseAsync(response); } else { switch (responseType) { case "ReadableStream": - return response.body as unknown as ResponseType; + return response.body as unknown as ResponseType; case 'string': case 'number': case 'boolean': case 'Date': - const payload = await response.arrayBuffer() as ArrayBuffer; + const payload = await response.arrayBuffer(); const responseContentType = this.getResponseContentType(response); if (!responseContentType) throw new Error("no response content type found for deserialization"); @@ -167,11 +146,8 @@ export class FetchRequestAdapter implements RequestAdapter { if (!requestInfo) { throw new Error('requestInfo cannot be null'); } - await this.authenticationProvider.authenticateRequest(requestInfo); - const response = await this.httpClient.executeFetch(this.createContext(requestInfo)); - if (responseHandler) { const response = await this.getHttpResponseMessage(requestInfo); - if(responseHandler) { + if (responseHandler) { return await responseHandler.handleResponseAsync(response); } } @@ -184,39 +160,29 @@ export class FetchRequestAdapter implements RequestAdapter { BackingStoreFactorySingleton.instance = backingStoreFactory; } } - private getRequestFromRequestInformation = (requestInfo: RequestInformation): FetchRequestInit => { - const request: FetchRequestInit = { - private getHttpResponseMessage = async(requestInfo: RequestInformation): Promise => { - if(!requestInfo) { + private getHttpResponseMessage = async (requestInfo: RequestInformation): Promise => { + if (!requestInfo) { throw new Error('requestInfo cannot be null'); } await this.authenticationProvider.authenticateRequest(requestInfo); - + const request = this.getRequestFromRequestInformation(requestInfo); - return await this.httpClient.fetch(this.getRequestUrl(requestInfo), request); + return await this.httpClient.executeFetch(this.createContext(requestInfo)); } - private getRequestFromRequestInformation = (requestInfo: RequestInformation): RequestInit => { - const request = { + private getRequestFromRequestInformation = (requestInfo: RequestInformation): FetchRequestInit => { + const request: FetchRequestInit = { method: requestInfo.httpMethod?.toString(), - body: requestInfo.content, - } - - const headers: string[][] = []; - requestInfo.headers?.forEach((v, k) => (request.headers[k] = v)); - - requestInfo.options?.forEach((v, k) => { - if (k in request) { - request[k] = v; - } - } - ); + headers: requestInfo.headers, + body: requestInfo.content + }; return request; } - private getRequestUrl (requestInfo: RequestInformation): string { - let url = requestInfo.URI ?? ''; - if (requestInfo.queryParameters?.size ?? -1 > 0) { + + private getRequestUrl = (requestInformation: RequestInformation): string => { + let url = requestInformation.URI ?? ''; + if (requestInformation.queryParameters?.size ?? -1 > 0) { const queryParametersBuilder = new URLSearchParams(); - requestInfo.queryParameters?.forEach((v, k) => { + requestInformation.queryParameters?.forEach((v, k) => { queryParametersBuilder.append(k, `${v}`); }); url = url + '?' + queryParametersBuilder.toString(); @@ -225,14 +191,11 @@ export class FetchRequestAdapter implements RequestAdapter { } private createContext(requestInformation: RequestInformation): MiddlewareContext { - - const url = this.getRequestUrl(requestInformation); const context: MiddlewareContext = { - request: url, + request: this.getRequestUrl(requestInformation), options: this.getRequestFromRequestInformation(requestInformation), - //middlewareControl : getMiddlewareOptions//set from middleware options + middlewareControl : new MiddlewareControl(Array.from(requestInformation.getRequestOptions())) // Filter RequestOptions to find middleware options. RequestOptions can also contain other FetchRequestInit Options or custom options. } return context; - } -} +} \ No newline at end of file diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index 4ea4c699ed..0f712a2f95 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -4,10 +4,6 @@ import { customFetchHandler } from "./middlewares/customFetchHandler"; import { MiddlewareFactory } from "./middlewares/middlewareFactory"; import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "./utils/fetchDefinitions"; import { defaultFetchHandler } from "./middlewares/defaultFetchHandler"; -import { Middleware } from "./middleware"; -import { fetch } from 'cross-fetch'; -import { RequestOption } from "@microsoft/kiota-abstractions"; -import { getDefaultMiddlewares, getDefaultRequestSettings } from "./kiotaClientFactory"; /** Default fetch client with options and a middleware pipleline for requests execution. */ export class HttpClient { diff --git a/http/typescript/fetch/src/index.ts b/http/typescript/fetch/src/index.ts index 68392a499e..4ac1b4b622 100644 --- a/http/typescript/fetch/src/index.ts +++ b/http/typescript/fetch/src/index.ts @@ -10,8 +10,6 @@ export * from './middlewares/options/retryHandlerOptions'; export * from './middlewares/middlewareContext'; export * from './middlewares/middlewareFactory'; export * from './middlewares/middlewareControl'; -export * from './middlewares/middlewareUtil'; +export * from './utils/headersUtil'; export * from './utils/fetchDefinitions'; -export * from './utils/utils'; -export * from './kiotaClientFactory'; -export * from './middleware'; +export * from './utils/utils'; \ No newline at end of file diff --git a/http/typescript/fetch/src/kiotaClientFactory.ts b/http/typescript/fetch/src/kiotaClientFactory.ts deleted file mode 100644 index 7a99162019..0000000000 --- a/http/typescript/fetch/src/kiotaClientFactory.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Middleware } from "./middleware"; - -/** - * Gets the default middlewares in use for the client. - * @returns the default middlewares. - */ -export function getDefaultMiddlewares(): Middleware[] { - return []; //TODO add default middlewares -} -/** - * Gets the default request settings to be used for the client. - * @returns the default request settings. - */ -export function getDefaultRequestSettings(): RequestInit { - return {}; //TODO add default request settings -} \ No newline at end of file diff --git a/http/typescript/fetch/src/middlewares/MiddlewareControl.ts b/http/typescript/fetch/src/middlewares/MiddlewareControl.ts index 2cce4b8875..b2593f4fff 100644 --- a/http/typescript/fetch/src/middlewares/MiddlewareControl.ts +++ b/http/typescript/fetch/src/middlewares/MiddlewareControl.ts @@ -9,7 +9,7 @@ * @module MiddlewareControl */ -import { MiddlewareOption } from "./options/middlewareOption"; +import { RequestOption } from "@microsoft/kiota-abstractions"; /** * @class @@ -20,7 +20,7 @@ export class MiddlewareControl { * @private * A member holding map of MiddlewareOptions */ - private middlewareOptions: Map; + private middlewareOptions: Map; /** * @public @@ -29,8 +29,8 @@ export class MiddlewareControl { * @param {MiddlewareOptions[]} [middlewareOptions = []] - The array of middlewareOptions * @returns The instance of MiddlewareControl */ - public constructor(middlewareOptions: MiddlewareOption[] = []) { - this.middlewareOptions = new Map(); + public constructor(middlewareOptions: RequestOption[] = []) { + this.middlewareOptions = new Map(); for (const option of middlewareOptions) { const fn = option.constructor; this.middlewareOptions.set(fn, option); @@ -47,7 +47,7 @@ export class MiddlewareControl { * // call this function like this: * getMiddlewareOptions(MiddlewareControl) */ - public getMiddlewareOptions(fn: Function): MiddlewareOption { + public getMiddlewareOptions(fn: Function): RequestOption { return this.middlewareOptions.get(fn); } @@ -58,7 +58,7 @@ export class MiddlewareControl { * @param {MiddlewareOptions} option - The strongly typed middleware option * @returns nothing */ - public setMiddlewareOptions(fn: Function, option: MiddlewareOption): void { + public setMiddlewareOptions(fn: Function, option: RequestOption): void { this.middlewareOptions.set(fn, option); } } diff --git a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts index 34bedbe09c..b5dd9b82cf 100644 --- a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts @@ -30,7 +30,6 @@ export class MiddlewareFactory { * @returns an array of the middleware handlers of the default middleware chain */ public static getDefaultMiddlewareChain(customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit)=> Promise): Middleware[] { - console.log("getting the browser default middleware chain **************************"); const middlewareArray: Middleware[] = []; const retryHandler = new RetryHandler(new RetryHandlerOptions()); middlewareArray.push(retryHandler); diff --git a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts index 5197a95d77..482795ddaa 100644 --- a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts +++ b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts @@ -9,8 +9,9 @@ * @module RetryHandlerOptions */ -import { MiddlewareOption } from "./middlewareOption"; +import { RequestOption } from "@microsoft/kiota-abstractions"; import {FetchResponse, FetchRequestInit} from "../../utils/fetchDefinitions" + /** * @type * A type declaration for shouldRetry callback @@ -24,7 +25,7 @@ export type ShouldRetry = (delay: number, attempt: number, request: string, opti * Class for RetryHandlerOptions */ - export class RetryHandlerOptions implements MiddlewareOption { + export class RetryHandlerOptions implements RequestOption { /** * @private * @static @@ -125,4 +126,9 @@ export type ShouldRetry = (delay: number, attempt: number, request: string, opti public getMaxDelay(): number { return RetryHandlerOptions.MAX_DELAY; } + + public getKey():string { + // TODO + return ""; + } } diff --git a/http/typescript/fetch/src/middlewares/options/middlewareOption.ts b/http/typescript/fetch/src/middlewares/options/middlewareOption.ts deleted file mode 100644 index 903c9162de..0000000000 --- a/http/typescript/fetch/src/middlewares/options/middlewareOption.ts +++ /dev/null @@ -1,3 +0,0 @@ -/** Represents a middleware option. */ -export interface MiddlewareOption { -} \ No newline at end of file diff --git a/http/typescript/fetch/src/middlewares/options/redirectHandlerOption.ts b/http/typescript/fetch/src/middlewares/options/redirectHandlerOption.ts index 3dbeef584b..0571871e9b 100644 --- a/http/typescript/fetch/src/middlewares/options/redirectHandlerOption.ts +++ b/http/typescript/fetch/src/middlewares/options/redirectHandlerOption.ts @@ -9,7 +9,7 @@ * @module RedirectHandlerOptions */ -import { MiddlewareOption } from "./middlewareOption"; +import { RequestOption } from "@microsoft/kiota-abstractions"; /** * @type @@ -22,7 +22,7 @@ export type ShouldRedirect = (response: Response) => boolean; * @implements MiddlewareOptions * A class representing RedirectHandlerOptions */ -export class RedirectHandlerOptions implements MiddlewareOption { +export class RedirectHandlerOptions implements RequestOption { /** * @private * @static @@ -77,5 +77,10 @@ export class RedirectHandlerOptions implements MiddlewareOption { this.maxRedirects = maxRedirects; this.shouldRedirect = shouldRedirect; } + + public getKey():string { + // TODO + return ""; + } } diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts index 21457ce0e9..f912d483a8 100644 --- a/http/typescript/fetch/src/middlewares/retryHandler.ts +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -12,7 +12,7 @@ import { MiddlewareContext } from "./middlewareContext"; import { HttpMethod } from "@microsoft/kiota-abstractions"; import { Middleware } from "./middleware"; -import { getRequestHeader, setRequestHeader } from "./middlewareUtil"; +import { getRequestHeader, setRequestHeader } from "../utils/headersUtil"; import { RetryHandlerOptions } from "./options/retryHandlerOptions"; import { MiddlewareControl } from "./middlewareControl"; import {FetchResponse, FetchRequestInit, FetchRequestInfo} from "../utils/fetchDefinitions" @@ -93,7 +93,7 @@ export class RetryHandler implements Middleware { const method = options.method; const isPutPatchOrPost: boolean = method === HttpMethod.PUT || method === HttpMethod.PATCH || method === HttpMethod.POST; if (isPutPatchOrPost) { - const isStream = getRequestHeader(request, options, "Content-Type") === "application/octet-stream"; + const isStream = getRequestHeader(options, "Content-Type") === "application/octet-stream"; if (isStream) { return false; } @@ -175,7 +175,7 @@ export class RetryHandler implements Middleware { await this.next.execute(context); if (retryAttempts < options.maxRetries && this.isRetry(context.response) && this.isBuffered(context.request, context.options) && options.shouldRetry(options.delay, retryAttempts, context.request, context.options, context.response!)) { ++retryAttempts; - setRequestHeader(context.request, context.options, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); + setRequestHeader(context.options, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); const delay = this.getDelay(context.response!, retryAttempts, options.delay); await this.sleep(delay); return await this.executeWithRetry(context, retryAttempts, options); diff --git a/http/typescript/fetch/src/utils/fetch.shim.ts b/http/typescript/fetch/src/utils/fetch.shim.ts deleted file mode 100644 index 8228d47c29..0000000000 --- a/http/typescript/fetch/src/utils/fetch.shim.ts +++ /dev/null @@ -1,8 +0,0 @@ -interface Request {}; -interface RequestInit { -}; -interface Response{}; -interface Headers {}; -interface ReadableStream{}; - -interface fetch{}; \ No newline at end of file diff --git a/http/typescript/fetch/src/middlewares/middlewareUtil.ts b/http/typescript/fetch/src/utils/headersUtil.ts similarity index 65% rename from http/typescript/fetch/src/middlewares/middlewareUtil.ts rename to http/typescript/fetch/src/utils/headersUtil.ts index 5ca4a3f039..abe75ec9fb 100644 --- a/http/typescript/fetch/src/middlewares/middlewareUtil.ts +++ b/http/typescript/fetch/src/utils/headersUtil.ts @@ -5,7 +5,7 @@ * ------------------------------------------------------------------------------------------- */ -import { FetchRequest, FetchRequestInfo, FetchRequestInit } from "../utils/fetchDefinitions"; +import { FetchRequest, FetchRequestInfo, FetchRequestInit } from "./fetchDefinitions"; /** * @module MiddlewareUtil @@ -19,11 +19,9 @@ import { FetchRequest, FetchRequestInfo, FetchRequestInit } from "../utils/fetch * @param {string} key - The header key string * @returns A header value for the given key from the request */ -export const getRequestHeader = (request: FetchRequestInfo, options: FetchRequestInit | undefined, key: string): string | null => { +export const getRequestHeader = (options: FetchRequestInit | undefined, key: string): string | null => { let value: string = null; - if (typeof request !== 'string') { - value = (request as FetchRequest).headers.get(key); - } else if (typeof options !== "undefined" && options.headers !== undefined) { + if (typeof options !== "undefined" && options.headers !== undefined) { value = options.headers[key]; } return value; @@ -38,11 +36,9 @@ export const getRequestHeader = (request: FetchRequestInfo, options: FetchReques * @param {string } value - The header value string * @returns Nothing */ -export const setRequestHeader = (request: FetchRequestInfo, options: FetchRequestInit | undefined, key: string, value: string): void => { - if (typeof request !== 'string') { - (request as FetchRequest).headers.set(key, value); - } else if (typeof options !== "undefined") { - if(!options.headers){ +export const setRequestHeader = (options: FetchRequestInit | undefined, key: string, value: string): void => { + if (typeof options !== "undefined") { + if (!options.headers) { options.headers = {}; } options.headers[key] = value; @@ -58,11 +54,9 @@ export const setRequestHeader = (request: FetchRequestInfo, options: FetchReques * @param {string } value - The header value string * @returns Nothing */ -export const appendRequestHeader = (request: FetchRequestInfo, options: FetchRequestInit | undefined, key: string, value: string): void => { - if (typeof request !== "string") { - (request as FetchRequest).headers.append(key, value); - } else if (typeof options !== "undefined") { - if(!options.headers){ +export const appendRequestHeader = (options: FetchRequestInit | undefined, key: string, value: string): void => { + if (typeof options !== "undefined") { + if (!options.headers) { options.headers = {}; } if (options.headers[key] === undefined) { diff --git a/http/typescript/fetch/dom.d.ts b/http/typescript/fetch/src/utils/referDom.d.ts similarity index 100% rename from http/typescript/fetch/dom.d.ts rename to http/typescript/fetch/src/utils/referDom.d.ts diff --git a/http/typescript/fetch/test/common/middleware/MiddlewareUtil.ts b/http/typescript/fetch/test/common/middleware/MiddlewareUtil.ts index 9cb1741899..dfec9f68dd 100644 --- a/http/typescript/fetch/test/common/middleware/MiddlewareUtil.ts +++ b/http/typescript/fetch/test/common/middleware/MiddlewareUtil.ts @@ -4,13 +4,13 @@ * See License in the project root for license information. * ------------------------------------------------------------------------------------------- */ -/* tslint:disable */ + import { assert } from "chai"; import { FetchRequestInit } from "../../../src/utils/fetchDefinitions"; -import { appendRequestHeader, getRequestHeader, setRequestHeader } from "../../../src/middlewares/middlewareUtil"; +import { appendRequestHeader, getRequestHeader, setRequestHeader } from "../../../src/utils/headersUtil"; -describe("MiddlewareUtil.ts", async () => { +describe("HeaderUtil", async () => { describe("getRequestHeader", () => { const value = "application/json"; const url = "dummy_url"; @@ -23,8 +23,8 @@ describe("MiddlewareUtil.ts", async () => { "Content-Type": value, }, }; - const headerValue: string = getRequestHeader(url, options, "Content-Type"); - const headerVersion: string = getRequestHeader(url, options, "version"); + const headerValue: string = getRequestHeader(options, "Content-Type"); + const headerVersion: string = getRequestHeader(options, "version"); assert.equal(headerValue, value); assert.equal(headerVersion, "version"); }); @@ -37,8 +37,8 @@ describe("MiddlewareUtil.ts", async () => { "Content-Type": value, }, }; - const headerValue: string = getRequestHeader(url, options, "Content-Type"); - const headerVersion: string = getRequestHeader(url, options, "version"); + const headerValue: string = getRequestHeader(options, "Content-Type"); + const headerVersion: string = getRequestHeader(options, "version"); assert.equal(headerValue, value); assert.equal(headerVersion, "version"); }); @@ -53,7 +53,7 @@ describe("MiddlewareUtil.ts", async () => { const options: FetchRequestInit = { method: "test", }; - setRequestHeader(url, options, key, value); + setRequestHeader(options, key, value); assert.isDefined(options.headers); assert.equal(options.headers[key], value); }); @@ -63,7 +63,7 @@ describe("MiddlewareUtil.ts", async () => { method: "test", headers: {} }; - setRequestHeader(url, options, key, value); + setRequestHeader(options, key, value); assert.isDefined(options.headers); assert.equal(options.headers[key], value); }); @@ -75,7 +75,7 @@ describe("MiddlewareUtil.ts", async () => { version: "version", }, }; - setRequestHeader(url, options, key, value); + setRequestHeader(options, key, value); assert.equal(options.headers[key], value); }); @@ -87,7 +87,7 @@ describe("MiddlewareUtil.ts", async () => { [key]: value, }, }; - setRequestHeader(url, options, key, value); + setRequestHeader(options, key, value); assert.equal(options.headers[key], value); }); }); @@ -102,7 +102,7 @@ describe("MiddlewareUtil.ts", async () => { const options: FetchRequestInit = { method: "test", }; - appendRequestHeader(url, options, key, value); + appendRequestHeader(options, key, value); assert.isDefined(options.headers); assert.equal(options.headers[key], value); }); @@ -114,7 +114,7 @@ describe("MiddlewareUtil.ts", async () => { version: "version", }, }; - appendRequestHeader(url, options, key, value); + appendRequestHeader(options, key, value); assert.equal(options.headers[key], value); }); @@ -126,7 +126,7 @@ describe("MiddlewareUtil.ts", async () => { [key]: firstValue, }, }; - appendRequestHeader(url, options, key, value); + appendRequestHeader(options, key, value); assert.equal(options.headers[key], `${firstValue}, ${value}`); }); @@ -138,7 +138,7 @@ describe("MiddlewareUtil.ts", async () => { [key]: value, }, }; - appendRequestHeader(url, options, key, value); + appendRequestHeader(options, key, value); assert.equal(options.headers[key], `${value}, ${value}`); }); }); diff --git a/http/typescript/fetch/tsconfig.cjs.json b/http/typescript/fetch/tsconfig.cjs.json index b802b7093c..7dc9e9f9a9 100644 --- a/http/typescript/fetch/tsconfig.cjs.json +++ b/http/typescript/fetch/tsconfig.cjs.json @@ -3,8 +3,7 @@ "compilerOptions":{ "target": "es5", "module": "commonjs", - "outDir": "./dist/cjs", - "composite": true + "outDir": "./dist/cjs" }, "exclude": ["node_modules", "dist"], "include": ["./src/**/*.ts", "./test"] diff --git a/http/typescript/fetch/tsconfig.test.json b/http/typescript/fetch/tsconfig.test.json deleted file mode 100644 index 33f639d635..0000000000 --- a/http/typescript/fetch/tsconfig.test.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions":{ - "target": "es5", - "module": "commonjs", - "outDir": "./dist/cjs/test", - "lib":["dom"] - }, - "exclude": ["node_modules", "dist","src"], - "include": ["./test/**/*.ts"], - "references": [ - { - "path": "./tsconfig.cjs.json" - } - ] -} \ No newline at end of file From a43fbe855df2ee71a62b745632766f45fbb44e6b Mon Sep 17 00:00:00 2001 From: "nikithauc@gmail.com" Date: Fri, 15 Oct 2021 00:38:30 -0700 Subject: [PATCH 15/34] moving shims, import from node-fetch --- abstractions/typescript/src/index.ts | 2 + .../src/{dom.shims.d.ts => shims.d.ts} | 0 http/typescript/fetch/package-lock.json | 734 +----------------- http/typescript/fetch/package.json | 6 +- http/typescript/fetch/{ => src}/dom.shim.d.ts | 0 http/typescript/fetch/src/index.ts | 1 + .../src/middlewares/defaultFetchHandler.ts | 4 +- .../fetch/src/utils/fetchDefinitions.ts | 61 +- .../typescript/fetch/src/utils/headersUtil.ts | 2 +- http/typescript/fetch/src/utils/referDom.d.ts | 2 +- .../fetch/test/browser/httpClient.ts | 4 +- 11 files changed, 13 insertions(+), 803 deletions(-) rename abstractions/typescript/src/{dom.shims.d.ts => shims.d.ts} (100%) rename http/typescript/fetch/{ => src}/dom.shim.d.ts (100%) diff --git a/abstractions/typescript/src/index.ts b/abstractions/typescript/src/index.ts index d677e085dd..abaf78357e 100644 --- a/abstractions/typescript/src/index.ts +++ b/abstractions/typescript/src/index.ts @@ -1,3 +1,5 @@ +/// + export * from './apiClientBuilder'; export * from './requestOption'; export * from './serialization'; diff --git a/abstractions/typescript/src/dom.shims.d.ts b/abstractions/typescript/src/shims.d.ts similarity index 100% rename from abstractions/typescript/src/dom.shims.d.ts rename to abstractions/typescript/src/shims.d.ts diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index 22b460133c..d8e16f1d08 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -293,98 +293,6 @@ "to-fast-properties": "^2.0.0" } }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz", - "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==", - "dev": true, - "requires": { - "@cspotcode/source-map-consumer": "0.8.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, "@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -3712,30 +3620,6 @@ "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, - "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, "@types/chai": { "version": "4.2.22", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.22.tgz", @@ -3824,16 +3708,6 @@ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -3865,27 +3739,6 @@ "picomatch": "^2.0.4" } }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -4170,18 +4023,6 @@ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - } - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -4287,12 +4128,6 @@ "safe-buffer": "^5.0.1" } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -4489,34 +4324,6 @@ "sha.js": "^2.4.8" } }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -4578,15 +4385,6 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, "defaults": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", @@ -4809,12 +4607,6 @@ "is-symbol": "^1.0.2" } }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, "es6-object-assign": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", @@ -4845,12 +4637,6 @@ "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", "dev": true }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -4909,17 +4695,6 @@ "unpipe": "~1.0.0" } }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -4954,22 +4729,6 @@ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", "dev": true }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -5029,12 +4788,6 @@ "has-symbols": "^1.0.1" } }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -5151,16 +4904,6 @@ "minimalistic-assert": "^1.0.1" } }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - } - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -5229,18 +4972,6 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -5451,12 +5182,6 @@ "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", "dev": true }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, "is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -5488,12 +5213,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "is-weakref": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", @@ -5503,12 +5222,6 @@ "call-bind": "^1.0.0" } }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -5542,15 +5255,6 @@ "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, "istanbul-lib-instrument": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", @@ -5563,21 +5267,6 @@ "semver": "^6.3.0" } }, - "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" - } - }, "istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", @@ -5873,12 +5562,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -5975,12 +5658,6 @@ "semver": "^6.0.0" } }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -6244,20 +5921,10 @@ "version": "2.6.5", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", - "dev": true, "requires": { "whatwg-url": "^5.0.0" } }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, "node-releases": { "version": "1.1.77", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", @@ -6270,149 +5937,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -6495,33 +6019,6 @@ "p-limit": "^3.0.2" } }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, "pad": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/pad/-/pad-3.2.0.tgz", @@ -6574,12 +6071,6 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -6626,69 +6117,12 @@ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", "dev": true }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -6798,27 +6232,12 @@ "picomatch": "^2.2.1" } }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -6835,12 +6254,6 @@ "path-parse": "^1.0.6" } }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, "rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", @@ -6925,12 +6338,6 @@ "randombytes": "^2.1.0" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -6953,21 +6360,6 @@ "safe-buffer": "^5.0.1" } }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -6979,12 +6371,6 @@ "object-inspect": "^1.9.0" } }, - "signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", - "dev": true - }, "sinon": { "version": "11.1.2", "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", @@ -7112,37 +6498,6 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -7270,12 +6625,6 @@ "ansi-regex": "^5.0.1" } }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -7310,17 +6659,6 @@ } } }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, "timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", @@ -7363,28 +6701,7 @@ "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "ts-node": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", - "integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "0.6.1", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - } + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, "tslib": { "version": "2.3.1", @@ -7404,12 +6721,6 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -7420,15 +6731,6 @@ "mime-types": "~2.1.24" } }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, "typescript": { "version": "4.4.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", @@ -7509,12 +6811,6 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -7545,14 +6841,12 @@ "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -7580,12 +6874,6 @@ "is-symbol": "^1.0.3" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "which-typed-array": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", @@ -7665,18 +6953,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", @@ -7728,12 +7004,6 @@ "is-plain-obj": "^2.1.0" } }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index bd308d6011..bd086f1a8d 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -46,7 +46,8 @@ "registry": "https://npm.pkg.github.com" }, "dependencies": { - "@microsoft/kiota-abstractions": "file:../../../abstractions/typescript" + "@microsoft/kiota-abstractions": "file:../../../abstractions/typescript", + "node-fetch": "^2.6.5" }, "devDependencies": { "@types/chai": "^4.2.22", @@ -62,9 +63,6 @@ "karma-mocha": "^2.0.1", "karma-typescript": "^5.5.2", "mocha": "^8.4.0", - "node-fetch": "^2.6.5", - "nyc": "^15.1.0", - "ts-node": "^10.2.1", "tslib": "^2.3.1", "typescript": "^4.4.3", "@rollup/plugin-commonjs": "^21.0.0", diff --git a/http/typescript/fetch/dom.shim.d.ts b/http/typescript/fetch/src/dom.shim.d.ts similarity index 100% rename from http/typescript/fetch/dom.shim.d.ts rename to http/typescript/fetch/src/dom.shim.d.ts diff --git a/http/typescript/fetch/src/index.ts b/http/typescript/fetch/src/index.ts index 4ac1b4b622..93b7ec3917 100644 --- a/http/typescript/fetch/src/index.ts +++ b/http/typescript/fetch/src/index.ts @@ -1,3 +1,4 @@ +/// export * from './fetchRequestAdapter'; export * from './httpClient'; export * from './middlewares/middleware'; diff --git a/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts b/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts index b3b5df87b0..b9d7a307b4 100644 --- a/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts @@ -9,7 +9,7 @@ * @module FetchHandler */ -import {fetch as nodeFetch} from "node-fetch"; +import fetch from "node-fetch"; import { MiddlewareContext } from "./middlewareContext"; import { Middleware } from "./middleware"; import { FetchResponse } from "../utils/fetchDefinitions"; @@ -36,7 +36,7 @@ export class defaultFetchHandler implements Middleware { * @returns A promise that resolves to nothing */ public async execute(context: MiddlewareContext): Promise { - context.response = await nodeFetch(context.request, context.options) as FetchResponse; + context.response = await fetch(context.request, context.options) as FetchResponse; return; } } diff --git a/http/typescript/fetch/src/utils/fetchDefinitions.ts b/http/typescript/fetch/src/utils/fetchDefinitions.ts index abed5e9601..c96e304467 100644 --- a/http/typescript/fetch/src/utils/fetchDefinitions.ts +++ b/http/typescript/fetch/src/utils/fetchDefinitions.ts @@ -1,5 +1,3 @@ -import { type } from "os"; - export type FetchRequestInfo = string; // We only ever call fetch() on string urls. export type FetchHeadersInit = Record; @@ -52,65 +50,8 @@ export type FetchResponse = Response & FetchBody & { } -/** This Fetch API interface represents a resource request. */ -export type FetchRequest = Request | FetchBody & { - /** - * Returns the cache mode associated with request, which is a string indicating how the request will interact with the browser's cache when fetching. - */ - readonly cache?: unknown; - /** - * Returns the credentials mode associated with request, which is a string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. - */ - readonly credentials?: unknown; - /** - * Returns the kind of resource requested by request, e.g., "document" or "script". - */ - readonly destination?: unknown; - /** - * Returns a Headers object consisting of the headers associated with request. Note that headers added in the network layer by the user agent will not be accounted for in this object, e.g., the "Host" header. - */ - readonly headers?: FetchHeaders; - /** - * Returns request's subresource integrity metadata, which is a cryptographic hash of the resource being fetched. Its value consists of multiple hashes separated by whitespace. [SRI] - */ - readonly integrity?: string; - /** - * Returns a boolean indicating whether or not request can outlive the global in which it was created. - */ - readonly keepalive?: boolean; - /** - * Returns request's HTTP method, which is "GET" by default. - */ - readonly method?: string; - /** - * Returns the mode associated with request, which is a string indicating whether the request will use CORS, or will be restricted to same-origin URLs. - */ - readonly mode?: unknown; - /** - * Returns the redirect mode associated with request, which is a string indicating how redirects for the request will be handled during fetching. A request will follow redirects by default. - */ - readonly redirect?: unknown; - /** - * Returns the referrer of request. Its value can be a same-origin URL if explicitly set in init, the empty string to indicate no referrer, and "about:client" when defaulting to the global's default. This is used during fetching to determine the value of the `Referer` header of the request being made. - */ - readonly referrer?: string; - /** - * Returns the referrer policy associated with request. This is used during fetching to compute the value of the request's referrer. - */ - readonly referrerPolicy?: unknown; - /** - * Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler. - */ - readonly signal?: unknown; - /** - * Returns the URL of request as a string. - */ - readonly url?: string; - clone?(): FetchRequest; -} - -export type FetchRequestInit = Omit &{ +export type FetchRequestInit = Omit &{ /** * A BodyInit object or null to set request's body. */ diff --git a/http/typescript/fetch/src/utils/headersUtil.ts b/http/typescript/fetch/src/utils/headersUtil.ts index abe75ec9fb..3298d574ed 100644 --- a/http/typescript/fetch/src/utils/headersUtil.ts +++ b/http/typescript/fetch/src/utils/headersUtil.ts @@ -5,7 +5,7 @@ * ------------------------------------------------------------------------------------------- */ -import { FetchRequest, FetchRequestInfo, FetchRequestInit } from "./fetchDefinitions"; +import { FetchRequestInit } from "./fetchDefinitions"; /** * @module MiddlewareUtil diff --git a/http/typescript/fetch/src/utils/referDom.d.ts b/http/typescript/fetch/src/utils/referDom.d.ts index 77213b167b..8b21a29344 100644 --- a/http/typescript/fetch/src/utils/referDom.d.ts +++ b/http/typescript/fetch/src/utils/referDom.d.ts @@ -1 +1 @@ -/// \ No newline at end of file +////// \ No newline at end of file diff --git a/http/typescript/fetch/test/browser/httpClient.ts b/http/typescript/fetch/test/browser/httpClient.ts index bfe4016562..5de5e06755 100644 --- a/http/typescript/fetch/test/browser/httpClient.ts +++ b/http/typescript/fetch/test/browser/httpClient.ts @@ -51,9 +51,7 @@ describe("HTTPClient.ts", () => { assert.isNotNull(client[""]); const next = client["middleware"].next; - - console.log("browser test") - console.log(client["middleware"]); + assert.isTrue(client["middleware"] instanceof RetryHandler); assert.isTrue(next instanceof customFetchHandler); From 8c2f25e93e26c7065442f6265b47a2ab1dcd1701 Mon Sep 17 00:00:00 2001 From: "nikithauc@gmail.com" Date: Fri, 15 Oct 2021 12:22:16 -0700 Subject: [PATCH 16/34] adding eslint --- .../typescript/src/readableStreamContent.ts | 7 + .../typescript/src/requestInformation.ts | 1 + abstractions/typescript/src/shims.d.ts | 2 - http/typescript/fetch/.eslintignore | 6 + http/typescript/fetch/.eslintrc.json | 190 +++ http/typescript/fetch/.prettierrc | 13 + http/typescript/fetch/package-lock.json | 1151 ++++++++++++++++- http/typescript/fetch/package.json | 23 +- http/typescript/fetch/src/browser/index.ts | 22 +- .../fetch/src/fetchRequestAdapter.ts | 388 +++--- http/typescript/fetch/src/httpClient.ts | 165 ++- http/typescript/fetch/src/index.ts | 31 +- .../browser/defaultFetchHandler.ts | 39 +- .../middlewares/browser/middlewareFactory.ts | 9 +- .../src/middlewares/customFetchHandler.ts | 46 +- .../src/middlewares/defaultFetchHandler.ts | 36 +- .../fetch/src/middlewares/middleware.ts | 21 +- .../src/middlewares/middlewareContext.ts | 10 +- .../src/middlewares/middlewareFactory.ts | 4 +- .../options/RetryHandlerOptions.ts | 13 +- .../options/redirectHandlerOption.ts | 107 +- .../fetch/src/middlewares/redirectHandler.ts | 386 +++--- .../fetch/src/middlewares/retryHandler.ts | 18 +- .../fetch/src/utils/browser/utils.ts | 4 +- http/typescript/fetch/src/utils/demo.ts | 0 .../fetch/src/utils/fetchDefinitions.ts | 170 +-- .../typescript/fetch/src/utils/headersUtil.ts | 2 - http/typescript/fetch/src/utils/utils.ts | 2 +- .../fetch/test/browser/MiddlewareFactory.ts | 5 +- .../fetch/test/browser/httpClient.ts | 24 +- http/typescript/fetch/test/browser/index.ts | 4 +- .../test/common/middleware/MiddlewareUtil.ts | 3 +- .../test/common/middleware/RetryHandler.ts | 10 +- .../common/middleware/RetryHandlerOptions.ts | 2 +- .../common/middleware/dummyFetchHandler.ts | 2 +- .../fetch/test/node/MiddlewareFactory.ts | 7 +- .../fetch/test/node/RedirectHandler.ts | 8 +- http/typescript/fetch/test/node/httpClient.ts | 20 +- http/typescript/fetch/test/testUtils.ts | 8 +- 39 files changed, 2124 insertions(+), 835 deletions(-) create mode 100644 abstractions/typescript/src/readableStreamContent.ts create mode 100644 http/typescript/fetch/.eslintignore create mode 100644 http/typescript/fetch/.eslintrc.json create mode 100644 http/typescript/fetch/.prettierrc create mode 100644 http/typescript/fetch/src/utils/demo.ts diff --git a/abstractions/typescript/src/readableStreamContent.ts b/abstractions/typescript/src/readableStreamContent.ts new file mode 100644 index 0000000000..980e72b501 --- /dev/null +++ b/abstractions/typescript/src/readableStreamContent.ts @@ -0,0 +1,7 @@ + +/** + * Empty interface expecting the type of NodeJS.ReadableStream or dom ReadableStream + * Node example: import {Readable} from "stream"; const readableStream = new Readable(); + * Browser example: const readableStream = new ReadableStream(); + */ +export interface ReadableStreamContent { } \ No newline at end of file diff --git a/abstractions/typescript/src/requestInformation.ts b/abstractions/typescript/src/requestInformation.ts index c1569747de..11653dbd1e 100644 --- a/abstractions/typescript/src/requestInformation.ts +++ b/abstractions/typescript/src/requestInformation.ts @@ -2,6 +2,7 @@ import { HttpMethod } from "./httpMethod"; import { Parsable } from "./serialization"; import { RequestOption } from "./requestOption"; import { RequestAdapter } from "./requestAdapter"; +import {ReadableStreamContent} from "./readableStreamContent"; /** This class represents an abstract HTTP request. */ export class RequestInformation { diff --git a/abstractions/typescript/src/shims.d.ts b/abstractions/typescript/src/shims.d.ts index ee44ab48e7..cb6c10a33b 100644 --- a/abstractions/typescript/src/shims.d.ts +++ b/abstractions/typescript/src/shims.d.ts @@ -3,5 +3,3 @@ interface RequestInit { } interface Response { } interface Headers { } interface ReadableStream { } - -interface ReadableStreamContent { } \ No newline at end of file diff --git a/http/typescript/fetch/.eslintignore b/http/typescript/fetch/.eslintignore new file mode 100644 index 0000000000..9ec10207b9 --- /dev/null +++ b/http/typescript/fetch/.eslintignore @@ -0,0 +1,6 @@ +*.js +*.js.map +*.d.ts + +node_modules +dist \ No newline at end of file diff --git a/http/typescript/fetch/.eslintrc.json b/http/typescript/fetch/.eslintrc.json new file mode 100644 index 0000000000..0865631533 --- /dev/null +++ b/http/typescript/fetch/.eslintrc.json @@ -0,0 +1,190 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint", "prettier", "simple-import-sort"], + "extends": ["eslint:recommended", "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended", "prettier"], + "rules": { + "@typescript-eslint/no-empty-interface": "warn", + "@typescript-eslint/ban-types": "off", + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "prettier/prettier": "error", + "@typescript-eslint/no-var-requires": "error", + "@typescript-eslint/no-non-null-assertion": "error", + "@typescript-eslint/naming-convention": [ + "error", + { + "selector": "typeLike", + "format": ["PascalCase"], + "filter": { + "regex": "^(__String|[A-Za-z]+_[A-Za-z]+)$", + "match": false + } + }, + { + "selector": "interface", + "format": ["PascalCase"], + "custom": { + "regex": "^I[A-Z]", + "match": false + }, + "filter": { + "regex": "^I(Arguments|TextWriter|O([A-Z][a-z]+[A-Za-z]*)?)$", + "match": false + } + }, + { + "selector": "variable", + "format": ["camelCase", "PascalCase", "UPPER_CASE"], + "leadingUnderscore": "allow", + "filter": { + "regex": "^(_{1,2}filename|_{1,2}dirname|_+|[A-Za-z]+_[A-Za-z]+)$", + "match": false + } + }, + { + "selector": "function", + "format": ["camelCase", "PascalCase"], + "leadingUnderscore": "allow", + "filter": { + "regex": "^[A-Za-z]+_[A-Za-z]+$", + "match": false + } + }, + { + "selector": "parameter", + "format": ["camelCase"], + "leadingUnderscore": "allow", + "filter": { + "regex": "^(_+|[A-Za-z]+_[A-Z][a-z]+)$", + "match": false + } + }, + { + "selector": "method", + "format": ["camelCase", "PascalCase"], + "leadingUnderscore": "allow", + "filter": { + "regex": "^[A-Za-z]+_[A-Za-z]+$", + "match": false + } + }, + { + "selector": "memberLike", + "format": ["camelCase"], + "leadingUnderscore": "allow", + "filter": { + "regex": "^[A-Za-z]+_[A-Za-z]+$", + "match": false + } + }, + { + "selector": "enumMember", + "format": ["camelCase", "PascalCase"], + "leadingUnderscore": "allow", + "filter": { + "regex": "^[A-Za-z]+_[A-Za-z]+$", + "match": false + } + }, + { + "selector": "property", + "format": null + } + ], + "@typescript-eslint/semi": "error", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/prefer-for-of": "error", + "@typescript-eslint/prefer-function-type": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/quotes": [ + "error", + "double", + { + "avoidEscape": true, + "allowTemplateLiterals": true + } + ], + "@typescript-eslint/space-within-parens": ["off", "never"], + "@typescript-eslint/triple-slash-reference": "error", + "@typescript-eslint/type-annotation-spacing": "error", + "@typescript-eslint/unified-signatures": "error", + "@typescript-eslint/adjacent-overload-signatures": "error", + "@typescript-eslint/array-type": "error", + "@typescript-eslint/consistent-type-definitions": ["error", "interface"], + "@typescript-eslint/no-inferrable-types": "error", + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-this-alias": "error", + "no-unused-expressions": "off", + "@typescript-eslint/no-unused-expressions": [ + "error", + { + "allowTernary": true + } + ], + "@typescript-eslint/space-before-function-paren": "off", + "@typescript-eslint/consistent-type-assertions": "error", + "@typescript-eslint/explicit-member-accessibility": [ + "off", + { + "accessibility": "explicit" + } + ], + "@typescript-eslint/indent": "off", + "@typescript-eslint/interface-name-prefix": "off", + "@typescript-eslint/member-delimiter-style": [ + "off", + { + "multiline": { + "delimiter": "none", + "requireLast": true + }, + "singleline": { + "delimiter": "semi", + "requireLast": false + } + } + ], + "@typescript-eslint/member-ordering": "off", + "@typescript-eslint/no-empty-function": "error", + "@typescript-eslint/no-namespace": "off", + "@typescript-eslint/no-parameter-properties": "off", + "@typescript-eslint/no-array-constructor": "error", + "no-useless-catch": "error", + "prefer-rest-params": "off", + "no-constant-condition": "error", + "simple-import-sort/imports": "error", + "brace-style": "error", + "constructor-super": "error", + "curly": ["error", "multi-line"], + "dot-notation": "off", + "eqeqeq": "error", + "new-parens": "error", + "no-caller": "error", + "no-duplicate-case": "error", + "no-duplicate-imports": "error", + "no-empty": "error", + "no-eval": "error", + "no-extra-bind": "error", + "no-fallthrough": "error", + "no-new-func": "off", + "no-new-wrappers": "error", + "no-return-await": "off", + "no-sparse-arrays": "error", + "no-template-curly-in-string": "error", + "no-throw-literal": "error", + "no-trailing-spaces": "error", + "no-undef-init": "error", + "no-unsafe-finally": "error", + "no-unused-labels": "error", + "no-var": "error", + "object-shorthand": "error", + "prefer-const": "error", + "prefer-object-spread": "error", + "quote-props": "off", + "space-in-parens": "error", + "unicode-bom": ["error", "never"], + "use-isnan": "error" + } +} \ No newline at end of file diff --git a/http/typescript/fetch/.prettierrc b/http/typescript/fetch/.prettierrc new file mode 100644 index 0000000000..87a872077f --- /dev/null +++ b/http/typescript/fetch/.prettierrc @@ -0,0 +1,13 @@ +{ + "arrowParens": "always", + "bracketSpacing": true, + "jsxBracketSameLine": true, + "jsxSingleQuote": false, + "printWidth": 5000, + "proseWrap": "never", + "semi": true, + "singleQuote": false, + "tabWidth": 4, + "trailingComma": "all", + "useTabs": true +} diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index d8e16f1d08..e5607799c6 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -293,6 +293,102 @@ "to-fast-properties": "^2.0.0" } }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, "@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -3537,6 +3633,32 @@ } } }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@rollup/plugin-commonjs": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.0.tgz", @@ -3650,6 +3772,12 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, "@types/mocha": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", @@ -3680,6 +3808,183 @@ "@sinonjs/fake-timers": "^7.1.0" } }, + "@typescript-eslint/eslint-plugin": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.0.0.tgz", + "integrity": "sha512-T6V6fCD2U0YesOedvydTnrNtsC8E+c2QzpawIpDdlaObX0OX5dLo7tLU5c64FhTZvA1Xrdim+cXDI7NPsVx8Cg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.0.0", + "@typescript-eslint/scope-manager": "5.0.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.0.0.tgz", + "integrity": "sha512-Dnp4dFIsZcPawD6CT1p5NibNUQyGSEz80sULJZkyhyna8AEqArmfwMwJPbmKzWVo4PabqNVzHYlzmcdLQWk+pg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "5.0.0", + "@typescript-eslint/types": "5.0.0", + "@typescript-eslint/typescript-estree": "5.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.0.0.tgz", + "integrity": "sha512-B6D5rmmQ14I1fdzs71eL3DAuvnPHTY/t7rQABrL9BLnx/H51Un8ox1xqYAchs0/V2trcoyxB1lMJLlrwrJCDgw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.0.0", + "@typescript-eslint/types": "5.0.0", + "@typescript-eslint/typescript-estree": "5.0.0", + "debug": "^4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.0.0.tgz", + "integrity": "sha512-5RFjdA/ain/MDUHYXdF173btOKncIrLuBmA9s6FJhzDrRAyVSA+70BHg0/MW6TE+UiKVyRtX91XpVS0gVNwVDQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.0.0", + "@typescript-eslint/visitor-keys": "5.0.0" + } + }, + "@typescript-eslint/types": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.0.0.tgz", + "integrity": "sha512-dU/pKBUpehdEqYuvkojmlv0FtHuZnLXFBn16zsDmlFF3LXkOpkAQ2vrKc3BidIIve9EMH2zfTlxqw9XM0fFN5w==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.0.0.tgz", + "integrity": "sha512-V/6w+PPQMhinWKSn+fCiX5jwvd1vRBm7AX7SJQXEGQtwtBvjMPjaU3YTQ1ik2UF1u96X7tsB96HMnulG3eLi9Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.0.0", + "@typescript-eslint/visitor-keys": "5.0.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.0.0.tgz", + "integrity": "sha512-yRyd2++o/IrJdyHuYMxyFyBhU762MRHQ/bAGQeTnN3pGikfh+nEmM61XTqaDH1XDp53afZ+waXrk0ZvenoZ6xw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.0.0", + "eslint-visitor-keys": "^3.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", + "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", + "dev": true + } + } + }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -3702,12 +4007,30 @@ "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", "dev": true }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -3745,6 +4068,12 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -3783,6 +4112,12 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, "async": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/async/-/async-3.2.1.tgz", @@ -4033,6 +4368,12 @@ "get-intrinsic": "^1.0.2" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, "camelcase": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", @@ -4324,6 +4665,28 @@ "sha.js": "^2.4.8" } }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -4379,6 +4742,12 @@ "type-detect": "^4.0.0" } }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -4450,6 +4819,24 @@ } } }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -4562,6 +4949,15 @@ "base64-arraybuffer": "0.1.4" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", @@ -4631,31 +5027,304 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "dev": true - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "evp_bytestokey": { + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", + "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", + "dev": true + }, + "eslint-plugin-prettier": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-simple-import-sort": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz", + "integrity": "sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", @@ -4671,6 +5340,61 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4711,6 +5435,24 @@ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "dependencies": { + "flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + } + } + }, "flatted": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", @@ -4759,6 +5501,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -4827,6 +5575,28 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } + } + }, "graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", @@ -4972,6 +5742,28 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -5382,6 +6174,18 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -5547,6 +6351,16 @@ } } }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5562,6 +6376,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -5574,6 +6394,18 @@ "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", "dev": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, "log-symbols": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", @@ -5640,6 +6472,15 @@ } } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", @@ -5681,6 +6522,22 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -5898,6 +6755,12 @@ "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", "dev": true }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -5995,6 +6858,20 @@ "wrappy": "1" } }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -6034,6 +6911,15 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-asn1": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", @@ -6071,6 +6957,12 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -6086,6 +6978,12 @@ "isarray": "0.0.1" } }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -6117,12 +7015,39 @@ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -6175,6 +7100,12 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -6232,12 +7163,24 @@ "picomatch": "^2.2.1" } }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -6254,6 +7197,18 @@ "path-parse": "^1.0.6" } }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", @@ -6311,6 +7266,15 @@ } } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -6360,6 +7324,21 @@ "safe-buffer": "^5.0.1" } }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -6408,6 +7387,23 @@ } } }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, "socket.io": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz", @@ -6498,6 +7494,12 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -6640,6 +7642,40 @@ "has-flag": "^3.0.0" } }, + "table": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", + "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, "terser": { "version": "5.9.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", @@ -6659,6 +7695,12 @@ } } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", @@ -6709,18 +7751,50 @@ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, "tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "dev": true }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -6767,6 +7841,15 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -6811,6 +7894,12 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -6930,6 +8019,12 @@ } } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "workerpool": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", @@ -6971,6 +8066,12 @@ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index bd086f1a8d..77ebbfedf9 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -24,7 +24,9 @@ "test": "npm run test:cjs && npm run test:es && npm run karma", "clean": "rm -r ./dist", "karma": "npm run rollup && karma start --single-run --browsers ChromeHeadless karma.conf.js", - "rollup": "rollup -c" + "rollup": "rollup -c", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix" }, "repository": { "type": "git", @@ -50,11 +52,19 @@ "node-fetch": "^2.6.5" }, "devDependencies": { + "@rollup/plugin-commonjs": "^21.0.0", + "@rollup/plugin-node-resolve": "^13.0.5", "@types/chai": "^4.2.22", "@types/mocha": "^9.0.0", "@types/node": "^16.10.3", "@types/sinon": "^10.0.4", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", "chai": "^4.3.4", + "eslint": "^7.32.0", + "eslint-config-prettier": "^7.2.0", + "eslint-plugin-prettier": "^3.4.1", + "eslint-plugin-simple-import-sort": "^7.0.0", "esm": "^3.2.25", "karma": "^6.3.4", "karma-chai": "^0.1.0", @@ -62,13 +72,14 @@ "karma-firefox-launcher": "^2.1.1", "karma-mocha": "^2.0.1", "karma-typescript": "^5.5.2", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "mocha": "^8.4.0", - "tslib": "^2.3.1", - "typescript": "^4.4.3", - "@rollup/plugin-commonjs": "^21.0.0", - "@rollup/plugin-node-resolve": "^13.0.5", + "prettier": "^1.19.1", "rollup": "^2.58.0", "rollup-plugin-terser": "^7.0.2", - "sinon": "^11.1.2" + "sinon": "^11.1.2", + "tslib": "^2.3.1", + "typescript": "^4.4.3" } } diff --git a/http/typescript/fetch/src/browser/index.ts b/http/typescript/fetch/src/browser/index.ts index e5fd28da7b..d0be0b5602 100644 --- a/http/typescript/fetch/src/browser/index.ts +++ b/http/typescript/fetch/src/browser/index.ts @@ -1,11 +1,11 @@ -export * from '../fetchRequestAdapter'; -export * from '../httpClient'; -export * from '../middlewares/middleware'; -export * from '../middlewares/browser/defaultFetchHandler'; -export * from '../middlewares/customFetchHandler'; -export * from '../middlewares/retryHandler'; -export * from '../middlewares/options/retryHandlerOptions'; -export * from '../middlewares/middlewareContext'; -export * from '../middlewares/browser/middlewareFactory'; -export * from '../middlewares/middlewareControl'; -export * from '../utils/headersUtil'; +export * from "../fetchRequestAdapter"; +export * from "../httpClient"; +export * from "../middlewares/middleware"; +export * from "../middlewares/browser/defaultFetchHandler"; +export * from "../middlewares/customFetchHandler"; +export * from "../middlewares/retryHandler"; +export * from "../middlewares/options/retryHandlerOptions"; +export * from "../middlewares/middlewareContext"; +export * from "../middlewares/browser/middlewareFactory"; +export * from "../middlewares/middlewareControl"; +export * from "../utils/headersUtil"; diff --git a/http/typescript/fetch/src/fetchRequestAdapter.ts b/http/typescript/fetch/src/fetchRequestAdapter.ts index fd11394679..cd9dd40e11 100644 --- a/http/typescript/fetch/src/fetchRequestAdapter.ts +++ b/http/typescript/fetch/src/fetchRequestAdapter.ts @@ -1,201 +1,207 @@ -import { AuthenticationProvider, BackingStoreFactory, BackingStoreFactorySingleton, RequestAdapter, Parsable, ParseNodeFactory, RequestInformation, ResponseHandler, ParseNodeFactoryRegistry, enableBackingStoreForParseNodeFactory, SerializationWriterFactoryRegistry, enableBackingStoreForSerializationWriterFactory, SerializationWriterFactory } from '@microsoft/kiota-abstractions'; -import { URLSearchParams } from "./utils/utils" -import { HttpClient } from './httpClient'; +import { AuthenticationProvider, BackingStoreFactory, BackingStoreFactorySingleton, enableBackingStoreForParseNodeFactory, enableBackingStoreForSerializationWriterFactory, Parsable, ParseNodeFactory, ParseNodeFactoryRegistry, RequestAdapter, RequestInformation, ResponseHandler, SerializationWriterFactory, SerializationWriterFactoryRegistry } from "@microsoft/kiota-abstractions"; + +import { HttpClient } from "./httpClient"; +import { MiddlewareContext } from "./middlewares/middlewareContext"; +import { MiddlewareControl } from "./middlewares/middlewareControl"; import { FetchRequestInit, FetchResponse } from "./utils/fetchDefinitions"; -import { MiddlewareContext } from "./middlewares/middlewareContext" -import { MiddlewareControl } from './middlewares/middlewareControl'; -import { Readable } from 'stream'; +import { URLSearchParams } from "./utils/utils"; export class FetchRequestAdapter implements RequestAdapter { - public getSerializationWriterFactory(): SerializationWriterFactory { - return this.serializationWriterFactory; - } - /** - * Instantiates a new http core service - * @param authenticationProvider the authentication provider to use. - * @param parseNodeFactory the parse node factory to deserialize responses. - * @param serializationWriterFactory the serialization writer factory to use to serialize request bodies. - * @param httpClient the http client to use to execute requests. - */ - public constructor(public readonly authenticationProvider: AuthenticationProvider, private parseNodeFactory: ParseNodeFactory = ParseNodeFactoryRegistry.defaultInstance, private serializationWriterFactory: SerializationWriterFactory = SerializationWriterFactoryRegistry.defaultInstance, private readonly httpClient: HttpClient = new HttpClient()) { - if (!authenticationProvider) { - throw new Error('authentication provider cannot be null'); - } - if (!parseNodeFactory) { - throw new Error('parse node factory cannot be null'); - } - if (!serializationWriterFactory) { - throw new Error('serialization writer factory cannot be null'); - } - if (!httpClient) { - throw new Error('http client cannot be null'); - } - } - private getResponseContentType = (response: Response): string | undefined => { - const header = response.headers.get("content-type")?.toLowerCase(); - if (!header) return undefined; - const segments = header.split(';'); - if (segments.length === 0) return undefined; - else return segments[0]; - } - public sendCollectionOfPrimitiveAsync = async (requestInfo: RequestInformation, responseType: "string" | "number" | "boolean" | "Date", responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInfo) { - throw new Error('requestInfo cannot be null'); - } - const response = await this.getHttpResponseMessage(requestInfo); - if (responseHandler) { - return await responseHandler.handleResponseAsync(response); - } else { - switch (responseType) { - case 'string': - case 'number': - case 'boolean': - case 'Date': - const payload = await response.arrayBuffer(); - const responseContentType = this.getResponseContentType(response); - if (!responseContentType) - throw new Error("no response content type found for deserialization"); + public getSerializationWriterFactory(): SerializationWriterFactory { + return this.serializationWriterFactory; + } + /** + * Instantiates a new http core service + * @param authenticationProvider the authentication provider to use. + * @param parseNodeFactory the parse node factory to deserialize responses. + * @param serializationWriterFactory the serialization writer factory to use to serialize request bodies. + * @param httpClient the http client to use to execute requests. + */ + public constructor(public readonly authenticationProvider: AuthenticationProvider, private parseNodeFactory: ParseNodeFactory = ParseNodeFactoryRegistry.defaultInstance, private serializationWriterFactory: SerializationWriterFactory = SerializationWriterFactoryRegistry.defaultInstance, private readonly httpClient: HttpClient = new HttpClient()) { + if (!authenticationProvider) { + throw new Error("authentication provider cannot be null"); + } + if (!parseNodeFactory) { + throw new Error("parse node factory cannot be null"); + } + if (!serializationWriterFactory) { + throw new Error("serialization writer factory cannot be null"); + } + if (!httpClient) { + throw new Error("http client cannot be null"); + } + } + private getResponseContentType = (response: Response): string | undefined => { + const header = response.headers.get("content-type")?.toLowerCase(); + if (!header) return undefined; + const segments = header.split(";"); + if (segments.length === 0) return undefined; + else return segments[0]; + }; + public sendCollectionOfPrimitiveAsync = async (requestInfo: RequestInformation, responseType: "string" | "number" | "boolean" | "Date", responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInfo) { + throw new Error("requestInfo cannot be null"); + } + const response = await this.getHttpResponseMessage(requestInfo); + if (responseHandler) { + return await responseHandler.handleResponseAsync(response); + } else { + switch (responseType) { + case "string": + case "number": + case "boolean": + case "Date": { + const payload = await response.arrayBuffer(); + const responseContentType = this.getResponseContentType(response); + if (!responseContentType) { + throw new Error("no response content type found for deserialization"); + } - const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); - if (responseType === 'string') { - return rootNode.getCollectionOfPrimitiveValues() as unknown as ResponseType[]; - } else if (responseType === 'number') { - return rootNode.getCollectionOfPrimitiveValues() as unknown as ResponseType[]; - } else if (responseType === 'boolean') { - return rootNode.getCollectionOfPrimitiveValues() as unknown as ResponseType[]; - } else if (responseType === 'Date') { - return rootNode.getCollectionOfPrimitiveValues() as unknown as ResponseType[]; - } else { - throw new Error("unexpected type to deserialize"); - } - } - } - } - public sendCollectionAsync = async (requestInformation: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInformation) { - throw new Error('requestInfo cannot be null'); - } - const response = await this.getHttpResponseMessage(requestInformation); - if (responseHandler) { - return await responseHandler.handleResponseAsync(response); - } else { - const payload = await response.arrayBuffer(); - const responseContentType = this.getResponseContentType(response); - if (!responseContentType) - throw new Error("no response content type found for deserialization"); + const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); + if (responseType === "string") { + return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; + } else if (responseType === "number") { + return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; + } else if (responseType === "boolean") { + return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; + } else if (responseType === "Date") { + return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; + } else { + throw new Error("unexpected type to deserialize"); + } + } + } + } + }; + public sendCollectionAsync = async (requestInformation: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInformation) { + throw new Error("requestInfo cannot be null"); + } + const response = await this.getHttpResponseMessage(requestInformation); + if (responseHandler) { + return await responseHandler.handleResponseAsync(response); + } else { + const payload = await response.arrayBuffer(); + const responseContentType = this.getResponseContentType(response); + if (!responseContentType) { + throw new Error("no response content type found for deserialization"); + } - const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); - const result = rootNode.getCollectionOfObjectValues(type); - return result as unknown as ModelType[]; - } - } - public sendAsync = async (requestInformation: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInformation) { - throw new Error('requestInfo cannot be null'); - } - const response = await this.getHttpResponseMessage(requestInformation); - if (responseHandler) { - return await responseHandler.handleResponseAsync(response); - } else { - const payload = await response.arrayBuffer(); - const responseContentType = this.getResponseContentType(response); - if (!responseContentType) - throw new Error("no response content type found for deserialization"); + const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); + const result = rootNode.getCollectionOfObjectValues(type); + return (result as unknown) as ModelType[]; + } + }; + public sendAsync = async (requestInformation: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInformation) { + throw new Error("requestInfo cannot be null"); + } + const response = await this.getHttpResponseMessage(requestInformation); + if (responseHandler) { + return await responseHandler.handleResponseAsync(response); + } else { + const payload = await response.arrayBuffer(); + const responseContentType = this.getResponseContentType(response); + if (!responseContentType) { + throw new Error("no response content type found for deserialization"); + } - const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); - const result = rootNode.getObjectValue(type); - return result as unknown as ModelType; - } - } - public sendPrimitiveAsync = async (requestInformation: RequestInformation, responseType: "string" | "number" | "boolean" | "Date" | "ReadableStream", responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInformation) { - throw new Error('requestInfo cannot be null'); - } - const response = await this.getHttpResponseMessage(requestInformation); - if (responseHandler) { - return await responseHandler.handleResponseAsync(response); - } else { - switch (responseType) { - case "ReadableStream": - return response.body as unknown as ResponseType; - case 'string': - case 'number': - case 'boolean': - case 'Date': - const payload = await response.arrayBuffer(); - const responseContentType = this.getResponseContentType(response); - if (!responseContentType) - throw new Error("no response content type found for deserialization"); + const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); + const result = rootNode.getObjectValue(type); + return (result as unknown) as ModelType; + } + }; + public sendPrimitiveAsync = async (requestInformation: RequestInformation, responseType: "string" | "number" | "boolean" | "Date" | "ReadableStream", responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInformation) { + throw new Error("requestInfo cannot be null"); + } + const response = await this.getHttpResponseMessage(requestInformation); + if (responseHandler) { + return await responseHandler.handleResponseAsync(response); + } else { + switch (responseType) { + case "ReadableStream": + return (response.body as unknown) as ResponseType; + case "string": + case "number": + case "boolean": + case "Date": { + const payload = await response.arrayBuffer(); + const responseContentType = this.getResponseContentType(response); + if (!responseContentType) { + throw new Error("no response content type found for deserialization"); + } - const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); - if (responseType === 'string') { - return rootNode.getStringValue() as unknown as ResponseType; - } else if (responseType === 'number') { - return rootNode.getNumberValue() as unknown as ResponseType; - } else if (responseType === 'boolean') { - return rootNode.getBooleanValue() as unknown as ResponseType; - } else if (responseType === 'Date') { - return rootNode.getDateValue() as unknown as ResponseType; - } else { - throw new Error("unexpected type to deserialize"); - } - } - } - } - public sendNoResponseContentAsync = async (requestInfo: RequestInformation, responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInfo) { - throw new Error('requestInfo cannot be null'); - } - const response = await this.getHttpResponseMessage(requestInfo); - if (responseHandler) { - return await responseHandler.handleResponseAsync(response); - } - } - public enableBackingStore = (backingStoreFactory?: BackingStoreFactory | undefined): void => { - this.parseNodeFactory = enableBackingStoreForParseNodeFactory(this.parseNodeFactory); - this.serializationWriterFactory = enableBackingStoreForSerializationWriterFactory(this.serializationWriterFactory); - if (!this.serializationWriterFactory || !this.parseNodeFactory) - throw new Error("unable to enable backing store"); - if (backingStoreFactory) { - BackingStoreFactorySingleton.instance = backingStoreFactory; - } - } - private getHttpResponseMessage = async (requestInfo: RequestInformation): Promise => { - if (!requestInfo) { - throw new Error('requestInfo cannot be null'); - } - await this.authenticationProvider.authenticateRequest(requestInfo); + const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); + if (responseType === "string") { + return (rootNode.getStringValue() as unknown) as ResponseType; + } else if (responseType === "number") { + return (rootNode.getNumberValue() as unknown) as ResponseType; + } else if (responseType === "boolean") { + return (rootNode.getBooleanValue() as unknown) as ResponseType; + } else if (responseType === "Date") { + return (rootNode.getDateValue() as unknown) as ResponseType; + } else { + throw new Error("unexpected type to deserialize"); + } + } + } + } + }; + public sendNoResponseContentAsync = async (requestInfo: RequestInformation, responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInfo) { + throw new Error("requestInfo cannot be null"); + } + const response = await this.getHttpResponseMessage(requestInfo); + if (responseHandler) { + return await responseHandler.handleResponseAsync(response); + } + }; + public enableBackingStore = (backingStoreFactory?: BackingStoreFactory | undefined): void => { + this.parseNodeFactory = enableBackingStoreForParseNodeFactory(this.parseNodeFactory); + this.serializationWriterFactory = enableBackingStoreForSerializationWriterFactory(this.serializationWriterFactory); + if (!this.serializationWriterFactory || !this.parseNodeFactory) { + throw new Error("unable to enable backing store"); + } + if (backingStoreFactory) { + BackingStoreFactorySingleton.instance = backingStoreFactory; + } + }; + private getHttpResponseMessage = async (requestInfo: RequestInformation): Promise => { + if (!requestInfo) { + throw new Error("requestInfo cannot be null"); + } + await this.authenticationProvider.authenticateRequest(requestInfo); - const request = this.getRequestFromRequestInformation(requestInfo); - return await this.httpClient.executeFetch(this.createContext(requestInfo)); - } - private getRequestFromRequestInformation = (requestInfo: RequestInformation): FetchRequestInit => { - const request: FetchRequestInit = { - method: requestInfo.httpMethod?.toString(), - headers: requestInfo.headers, - body: requestInfo.content - }; - return request; - } + return await this.httpClient.executeFetch(this.createContext(requestInfo)); + }; + private getRequestFromRequestInformation = (requestInfo: RequestInformation): FetchRequestInit => { + const request: FetchRequestInit = { + method: requestInfo.httpMethod?.toString(), + headers: requestInfo.headers, + body: requestInfo.content, + }; + return request; + }; - private getRequestUrl = (requestInformation: RequestInformation): string => { - let url = requestInformation.URI ?? ''; - if (requestInformation.queryParameters?.size ?? -1 > 0) { - const queryParametersBuilder = new URLSearchParams(); - requestInformation.queryParameters?.forEach((v, k) => { - queryParametersBuilder.append(k, `${v}`); - }); - url = url + '?' + queryParametersBuilder.toString(); - } - return url; - } + private getRequestUrl = (requestInformation: RequestInformation): string => { + let url = requestInformation.URI ?? ""; + if (requestInformation.queryParameters?.size ?? -1 > 0) { + const queryParametersBuilder = new URLSearchParams(); + requestInformation.queryParameters?.forEach((v, k) => { + queryParametersBuilder.append(k, `${v}`); + }); + url = url + "?" + queryParametersBuilder.toString(); + } + return url; + }; - private createContext(requestInformation: RequestInformation): MiddlewareContext { - const context: MiddlewareContext = { - request: this.getRequestUrl(requestInformation), - options: this.getRequestFromRequestInformation(requestInformation), - middlewareControl : new MiddlewareControl(Array.from(requestInformation.getRequestOptions())) // Filter RequestOptions to find middleware options. RequestOptions can also contain other FetchRequestInit Options or custom options. - } - return context; - } -} \ No newline at end of file + private createContext(requestInformation: RequestInformation): MiddlewareContext { + const context: MiddlewareContext = { + request: this.getRequestUrl(requestInformation), + options: this.getRequestFromRequestInformation(requestInformation), + middlewareControl: new MiddlewareControl(Array.from(requestInformation.getRequestOptions())), // Filter RequestOptions to find middleware options. RequestOptions can also contain other FetchRequestInit Options or custom options. + }; + return context; + } +} diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index 0f712a2f95..2ef19617e3 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -1,97 +1,90 @@ +import { customFetchHandler } from "./middlewares/customFetchHandler"; +import { defaultFetchHandler } from "./middlewares/defaultFetchHandler"; import { Middleware } from "./middlewares/middleware"; import { MiddlewareContext } from "./middlewares/middlewareContext"; -import { customFetchHandler } from "./middlewares/customFetchHandler"; import { MiddlewareFactory } from "./middlewares/middlewareFactory"; import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "./utils/fetchDefinitions"; -import { defaultFetchHandler } from "./middlewares/defaultFetchHandler"; /** Default fetch client with options and a middleware pipleline for requests execution. */ export class HttpClient { - private middleware: Middleware; - /** - * Instantiates a new HttpClient. - * @param middlewares middlewares to be used for requests execution. - * @param custom fetch function - */ - public constructor(private customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise, ...middlewares: Middleware[]) { - - // Use default middleware chain if middlewares and custom fetch function are not defined - if (!middlewares.length) { - - if (this.customFetch) { - this.setMiddleware(...(MiddlewareFactory.getDefaultMiddlewareChain(customFetch))); - } - else { - this.setMiddleware(...(MiddlewareFactory.getDefaultMiddlewareChain())); - } - } - else { - if (middlewares[0] === null) { - if(!customFetch){ - this.setMiddleware((new defaultFetchHandler())); - } - return; - - } - else { - if (this.customFetch) { - this.setMiddleware(...middlewares, new customFetchHandler(customFetch)); - } - else { - this.setMiddleware(...middlewares); - } - } - } - } + private middleware: Middleware; + /** + * Instantiates a new HttpClient. + * @param middlewares middlewares to be used for requests execution. + * @param custom fetch function + */ + public constructor(private customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise, ...middlewares: Middleware[]) { + // Use default middleware chain if middlewares and custom fetch function are not defined + if (!middlewares.length) { + if (this.customFetch) { + this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain(customFetch)); + } else { + this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain()); + } + } else { + if (middlewares[0] === null) { + if (!customFetch) { + this.setMiddleware(new defaultFetchHandler()); + } + return; + } else { + if (this.customFetch) { + this.setMiddleware(...middlewares, new customFetchHandler(customFetch)); + } else { + this.setMiddleware(...middlewares); + } + } + } + } - /** - * @private - * Processes the middleware parameter passed to set this.middleware property - * The calling function should validate if middleware is not undefined or not empty. - * @param {...Middleware} middleware - The middleware passed - * @returns Nothing - */ - private setMiddleware(...middleware: Middleware[]): void { - if (middleware.length > 1) { - this.parseMiddleWareArray(middleware); - } else { - this.middleware = middleware[0]; - } - } + /** + * @private + * Processes the middleware parameter passed to set this.middleware property + * The calling function should validate if middleware is not undefined or not empty. + * @param {...Middleware} middleware - The middleware passed + * @returns Nothing + */ + private setMiddleware(...middleware: Middleware[]): void { + if (middleware.length > 1) { + this.parseMiddleWareArray(middleware); + } else { + this.middleware = middleware[0]; + } + } - /** - * @private - * Processes the middleware array to construct the chain - * and sets this.middleware property to the first middlware handler of the array - * The calling function should validate if middleware is not undefined or not empty - * @param {Middleware[]} middlewareArray - The array of middleware handlers - * @returns Nothing - */ - private parseMiddleWareArray(middlewareArray: Middleware[]) { - middlewareArray.forEach((element, index) => { - if (index < middlewareArray.length - 1) { - element.next = middlewareArray[index + 1]; - } - }); - this.middleware = middlewareArray[0]; - } + /** + * @private + * Processes the middleware array to construct the chain + * and sets this.middleware property to the first middlware handler of the array + * The calling function should validate if middleware is not undefined or not empty + * @param {Middleware[]} middlewareArray - The array of middleware handlers + * @returns Nothing + */ + private parseMiddleWareArray(middlewareArray: Middleware[]) { + middlewareArray.forEach((element, index) => { + if (index < middlewareArray.length - 1) { + element.next = middlewareArray[index + 1]; + } + }); + this.middleware = middlewareArray[0]; + } - /** - * Executes a request and returns a promise resolving the response. - * @param url the request url. - * @param options request options. - * @returns the promise resolving the response. - */ - public async executeFetch(context: MiddlewareContext): Promise { - if (this.customFetch && !this.middleware) { - return this.customFetch(context.request, context.options); - } + /** + * Executes a request and returns a promise resolving the response. + * @param url the request url. + * @param options request options. + * @returns the promise resolving the response. + */ + public async executeFetch(context: MiddlewareContext): Promise { + if (this.customFetch && !this.middleware) { + return this.customFetch(context.request, context.options); + } - if (this.middleware) { - await this.middleware.execute(context); - return context.response; - } - else - throw new Error("Please provide middlewares or a custom fetch function to execute the request"); - } -} \ No newline at end of file + if (this.middleware) { + await this.middleware.execute(context); + return context.response; + } else { + throw new Error("Please provide middlewares or a custom fetch function to execute the request"); + } + } +} diff --git a/http/typescript/fetch/src/index.ts b/http/typescript/fetch/src/index.ts index 93b7ec3917..0e7b989e9a 100644 --- a/http/typescript/fetch/src/index.ts +++ b/http/typescript/fetch/src/index.ts @@ -1,16 +1,17 @@ +/* eslint-disable @typescript-eslint/triple-slash-reference*/ /// -export * from './fetchRequestAdapter'; -export * from './httpClient'; -export * from './middlewares/middleware'; -export * from './middlewares/defaultFetchHandler'; -export * from './middlewares/customFetchHandler'; -export * from './middlewares/redirectHandler'; -export * from './middlewares/retryHandler'; -export * from './middlewares/options/redirectHandlerOption'; -export * from './middlewares/options/retryHandlerOptions'; -export * from './middlewares/middlewareContext'; -export * from './middlewares/middlewareFactory'; -export * from './middlewares/middlewareControl'; -export * from './utils/headersUtil'; -export * from './utils/fetchDefinitions'; -export * from './utils/utils'; \ No newline at end of file +export * from "./fetchRequestAdapter"; +export * from "./httpClient"; +export * from "./middlewares/middleware"; +export * from "./middlewares/defaultFetchHandler"; +export * from "./middlewares/customFetchHandler"; +export * from "./middlewares/redirectHandler"; +export * from "./middlewares/retryHandler"; +export * from "./middlewares/options/redirectHandlerOption"; +export * from "./middlewares/options/retryHandlerOptions"; +export * from "./middlewares/middlewareContext"; +export * from "./middlewares/middlewareFactory"; +export * from "./middlewares/middlewareControl"; +export * from "./utils/headersUtil"; +export * from "./utils/fetchDefinitions"; +export * from "./utils/utils"; diff --git a/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts b/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts index 1390054ac3..53c96ceae2 100644 --- a/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts @@ -9,9 +9,9 @@ * @module FetchHandler */ -import { MiddlewareContext } from "../middlewareContext"; -import { Middleware } from "../middleware"; import { FetchResponse } from "../../utils/fetchDefinitions"; +import { Middleware } from "../middleware"; +import { MiddlewareContext } from "../middlewareContext"; /** * @class @@ -19,23 +19,22 @@ import { FetchResponse } from "../../utils/fetchDefinitions"; * Class for FetchHandler */ -export class defaultFetchHandler implements Middleware { - - /** - * @private - * The next middleware in the middleware chain - */ - next: Middleware; +export class DefaultFetchHandler implements Middleware { + /** + * @private + * The next middleware in the middleware chain + */ + next: Middleware; - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The request context object - * @returns A promise that resolves to nothing - */ - public async execute(context: MiddlewareContext): Promise { - context.response = await fetch(context.request, context.options as RequestInit) as FetchResponse; - return; - } + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The request context object + * @returns A promise that resolves to nothing + */ + public async execute(context: MiddlewareContext): Promise { + context.response = (await fetch(context.request, context.options as RequestInit)) as FetchResponse; + return; + } } diff --git a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts index b5dd9b82cf..f6b17988dc 100644 --- a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts @@ -9,13 +9,12 @@ * @module MiddlewareFactory */ -import { defaultFetchHandler} from "./defaultFetchHandler"; +import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../../utils/fetchDefinitions"; +import { customFetchHandler } from "../customFetchHandler"; import { Middleware } from "../middleware"; import { RetryHandlerOptions } from "../options/retryHandlerOptions"; import { RetryHandler } from "../retryHandler"; -import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../../utils/fetchDefinitions"; -import { customFetchHandler } from "../customFetchHandler"; - +import { defaultFetchHandler } from "./defaultFetchHandler"; /** * @class @@ -29,7 +28,7 @@ export class MiddlewareFactory { * @param {AuthenticationProvider} authProvider - The authentication provider instance * @returns an array of the middleware handlers of the default middleware chain */ - public static getDefaultMiddlewareChain(customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit)=> Promise): Middleware[] { + public static getDefaultMiddlewareChain(customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise): Middleware[] { const middlewareArray: Middleware[] = []; const retryHandler = new RetryHandler(new RetryHandlerOptions()); middlewareArray.push(retryHandler); diff --git a/http/typescript/fetch/src/middlewares/customFetchHandler.ts b/http/typescript/fetch/src/middlewares/customFetchHandler.ts index aee364103f..0244dfa407 100644 --- a/http/typescript/fetch/src/middlewares/customFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/customFetchHandler.ts @@ -9,10 +9,9 @@ * @module FetchHandler */ - -import { MiddlewareContext } from "./middlewareContext"; +import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; import { Middleware } from "./middleware"; -import { FetchResponse, FetchRequestInfo, FetchRequestInit } from "../utils/fetchDefinitions"; +import { MiddlewareContext } from "./middlewareContext"; /** * @class @@ -20,25 +19,24 @@ import { FetchResponse, FetchRequestInfo, FetchRequestInit } from "../utils/fetc * Class for FetchHandler */ -export class customFetchHandler implements Middleware { - - /** - * @private - * The next middleware in the middleware chain - */ - next: Middleware; - - constructor(private customFetch?: (input: FetchRequestInfo, init: FetchRequestInit) => Promise) { }; - - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The request context object - * @returns A promise that resolves to nothing - */ - public async execute(context: MiddlewareContext): Promise { - context.response = await this.customFetch(context.request, context.options) as FetchResponse; - return; - } +export class CustomFetchHandler implements Middleware { + /** + * @private + * The next middleware in the middleware chain + */ + next: Middleware; + + constructor(private customFetch?: (input: FetchRequestInfo, init: FetchRequestInit) => Promise) {} + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The request context object + * @returns A promise that resolves to nothing + */ + public async execute(context: MiddlewareContext): Promise { + context.response = (await this.customFetch(context.request, context.options)) as FetchResponse; + return; + } } diff --git a/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts b/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts index b9d7a307b4..f86d576827 100644 --- a/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts @@ -10,9 +10,10 @@ */ import fetch from "node-fetch"; -import { MiddlewareContext } from "./middlewareContext"; -import { Middleware } from "./middleware"; + import { FetchResponse } from "../utils/fetchDefinitions"; +import { Middleware } from "./middleware"; +import { MiddlewareContext } from "./middlewareContext"; /** * @class @@ -20,23 +21,22 @@ import { FetchResponse } from "../utils/fetchDefinitions"; * Class for FetchHandler */ -export class defaultFetchHandler implements Middleware { - - /** +export class DefaultFetchHandler implements Middleware { + /** * @private * The next middleware in the middleware chain */ - next: Middleware; - - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The request context object - * @returns A promise that resolves to nothing - */ - public async execute(context: MiddlewareContext): Promise { - context.response = await fetch(context.request, context.options) as FetchResponse; - return; - } + next: Middleware; + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The request context object + * @returns A promise that resolves to nothing + */ + public async execute(context: MiddlewareContext): Promise { + context.response = (await fetch(context.request, context.options)) as FetchResponse; + return; + } } diff --git a/http/typescript/fetch/src/middlewares/middleware.ts b/http/typescript/fetch/src/middlewares/middleware.ts index e0640b995a..921dfff0db 100644 --- a/http/typescript/fetch/src/middlewares/middleware.ts +++ b/http/typescript/fetch/src/middlewares/middleware.ts @@ -1,16 +1,15 @@ import { MiddlewareContext } from "./middlewareContext"; -import { RequestOption } from "@microsoft/kiota-abstractions"; /** Defines the contract for a middleware in the request execution pipeline. */ export interface Middleware { - /** Next middleware to be executed. The current middleware must execute it in its implementation. */ - next: Middleware | undefined; + /** Next middleware to be executed. The current middleware must execute it in its implementation. */ + next: Middleware | undefined; - /** - * Main method of the middleware. - * @param req The request object. - * @param url The URL of the request. - * @return A promise that resolves to the response object. - */ - execute(middlewareContext: MiddlewareContext): Promise; -} \ No newline at end of file + /** + * Main method of the middleware. + * @param req The request object. + * @param url The URL of the request. + * @return A promise that resolves to the response object. + */ + execute(middlewareContext: MiddlewareContext): Promise; +} diff --git a/http/typescript/fetch/src/middlewares/middlewareContext.ts b/http/typescript/fetch/src/middlewares/middlewareContext.ts index 533047b926..1bd4df7e53 100644 --- a/http/typescript/fetch/src/middlewares/middlewareContext.ts +++ b/http/typescript/fetch/src/middlewares/middlewareContext.ts @@ -12,8 +12,8 @@ import { MiddlewareControl } from "./middlewareControl"; */ export interface MiddlewareContext { - request:FetchRequestInfo, - response?: FetchResponse, - options?:FetchRequestInit, - middlewareControl?: MiddlewareControl -} \ No newline at end of file + request: FetchRequestInfo; + response?: FetchResponse; + options?: FetchRequestInit; + middlewareControl?: MiddlewareControl; +} diff --git a/http/typescript/fetch/src/middlewares/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/middlewareFactory.ts index cea44c52bf..a0e1380254 100644 --- a/http/typescript/fetch/src/middlewares/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/middlewareFactory.ts @@ -9,6 +9,7 @@ * @module MiddlewareFactory */ +import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; import { customFetchHandler } from "./customFetchHandler"; import { defaultFetchHandler } from "./defaultFetchHandler"; import { Middleware } from "./middleware"; @@ -16,8 +17,6 @@ import { RedirectHandlerOptions } from "./options/redirectHandlerOption"; import { RetryHandlerOptions } from "./options/retryHandlerOptions"; import { RedirectHandler } from "./redirectHandler"; import { RetryHandler } from "./retryHandler"; -import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; - /** * @class @@ -43,7 +42,6 @@ export class MiddlewareFactory { middlewareArray.push(new defaultFetchHandler()); } - return middlewareArray; } } diff --git a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts index 482795ddaa..39532fa0f3 100644 --- a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts +++ b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts @@ -10,7 +10,8 @@ */ import { RequestOption } from "@microsoft/kiota-abstractions"; -import {FetchResponse, FetchRequestInit} from "../../utils/fetchDefinitions" + +import { FetchRequestInit, FetchResponse } from "../../utils/fetchDefinitions"; /** * @type @@ -25,7 +26,7 @@ export type ShouldRetry = (delay: number, attempt: number, request: string, opti * Class for RetryHandlerOptions */ - export class RetryHandlerOptions implements RequestOption { +export class RetryHandlerOptions implements RequestOption { /** * @private * @static @@ -127,8 +128,8 @@ export type ShouldRetry = (delay: number, attempt: number, request: string, opti return RetryHandlerOptions.MAX_DELAY; } - public getKey():string { - // TODO - return ""; - } + public getKey(): string { + // TODO + return ""; + } } diff --git a/http/typescript/fetch/src/middlewares/options/redirectHandlerOption.ts b/http/typescript/fetch/src/middlewares/options/redirectHandlerOption.ts index 0571871e9b..ca44e59c49 100644 --- a/http/typescript/fetch/src/middlewares/options/redirectHandlerOption.ts +++ b/http/typescript/fetch/src/middlewares/options/redirectHandlerOption.ts @@ -23,64 +23,63 @@ export type ShouldRedirect = (response: Response) => boolean; * A class representing RedirectHandlerOptions */ export class RedirectHandlerOptions implements RequestOption { - /** - * @private - * @static - * A member holding default max redirects value - */ - private static DEFAULT_MAX_REDIRECTS = 5; + /** + * @private + * @static + * A member holding default max redirects value + */ + private static DEFAULT_MAX_REDIRECTS = 5; - /** - * @private - * @static - * A member holding maximum max redirects value - */ - private static MAX_MAX_REDIRECTS = 20; + /** + * @private + * @static + * A member holding maximum max redirects value + */ + private static MAX_MAX_REDIRECTS = 20; - /** - * @public - * A member holding max redirects value - */ - public maxRedirects: number; + /** + * @public + * A member holding max redirects value + */ + public maxRedirects: number; - /** - * @public - * A member holding shouldRedirect callback - */ - public shouldRedirect: ShouldRedirect; + /** + * @public + * A member holding shouldRedirect callback + */ + public shouldRedirect: ShouldRedirect; - /** - * @private - * A member holding default shouldRedirect callback - */ - private static defaultShouldRetry: ShouldRedirect = () => true; + /** + * @private + * A member holding default shouldRedirect callback + */ + private static defaultShouldRetry: ShouldRedirect = () => true; - /** - * @public - * @constructor - * To create an instance of RedirectHandlerOptions - * @param {number} [maxRedirects = RedirectHandlerOptions.DEFAULT_MAX_REDIRECTS] - The max redirects value - * @param {ShouldRedirect} [shouldRedirect = RedirectHandlerOptions.DEFAULT_SHOULD_RETRY] - The should redirect callback - * @returns An instance of RedirectHandlerOptions - */ - public constructor(maxRedirects: number = RedirectHandlerOptions.DEFAULT_MAX_REDIRECTS, shouldRedirect: ShouldRedirect = RedirectHandlerOptions.defaultShouldRetry) { - if (maxRedirects > RedirectHandlerOptions.MAX_MAX_REDIRECTS) { - const error = new Error(`MaxRedirects should not be more than ${RedirectHandlerOptions.MAX_MAX_REDIRECTS}`); - error.name = "MaxLimitExceeded"; - throw error; - } - if (maxRedirects < 0) { - const error = new Error(`MaxRedirects should not be negative`); - error.name = "MinExpectationNotMet"; - throw error; - } - this.maxRedirects = maxRedirects; - this.shouldRedirect = shouldRedirect; - } + /** + * @public + * @constructor + * To create an instance of RedirectHandlerOptions + * @param {number} [maxRedirects = RedirectHandlerOptions.DEFAULT_MAX_REDIRECTS] - The max redirects value + * @param {ShouldRedirect} [shouldRedirect = RedirectHandlerOptions.DEFAULT_SHOULD_RETRY] - The should redirect callback + * @returns An instance of RedirectHandlerOptions + */ + public constructor(maxRedirects: number = RedirectHandlerOptions.DEFAULT_MAX_REDIRECTS, shouldRedirect: ShouldRedirect = RedirectHandlerOptions.defaultShouldRetry) { + if (maxRedirects > RedirectHandlerOptions.MAX_MAX_REDIRECTS) { + const error = new Error(`MaxRedirects should not be more than ${RedirectHandlerOptions.MAX_MAX_REDIRECTS}`); + error.name = "MaxLimitExceeded"; + throw error; + } + if (maxRedirects < 0) { + const error = new Error(`MaxRedirects should not be negative`); + error.name = "MinExpectationNotMet"; + throw error; + } + this.maxRedirects = maxRedirects; + this.shouldRedirect = shouldRedirect; + } - public getKey():string { - // TODO - return ""; - } + public getKey(): string { + // TODO + return ""; + } } - diff --git a/http/typescript/fetch/src/middlewares/redirectHandler.ts b/http/typescript/fetch/src/middlewares/redirectHandler.ts index afc208463f..5c489e2132 100644 --- a/http/typescript/fetch/src/middlewares/redirectHandler.ts +++ b/http/typescript/fetch/src/middlewares/redirectHandler.ts @@ -10,11 +10,11 @@ */ import { HttpMethod } from "@microsoft/kiota-abstractions"; -import { MiddlewareContext } from "./middlewareContext"; + +import { FetchResponse } from "../utils/fetchDefinitions"; import { Middleware } from "./middleware"; +import { MiddlewareContext } from "./middlewareContext"; import { RedirectHandlerOptions } from "./options/redirectHandlerOption"; -import {FetchResponse} from "../utils/fetchDefinitions" - /** * @class @@ -23,194 +23,194 @@ import {FetchResponse} from "../utils/fetchDefinitions" * Class representing RedirectHandler */ export class RedirectHandler implements Middleware { - /** - * @private - * @static - * A member holding the array of redirect status codes - */ - private static REDIRECT_STATUS_CODES: number[] = [ - 301, // Moved Permanently - 302, // Found - 303, // See Other - 307, // Temporary Permanently - 308, // Moved Permanently - ]; - - /** - * @private - * @static - * A member holding SeeOther status code - */ - private static STATUS_CODE_SEE_OTHER = 303; - - /** - * @private - * @static - * A member holding the name of the location header - */ - private static LOCATION_HEADER = "Location"; - - /** - * @private - * @static - * A member representing the authorization header name - */ - private static AUTHORIZATION_HEADER = "Authorization"; - - /** - * @private - * @static - * A member holding the manual redirect value - */ - private static MANUAL_REDIRECT = "manual"; - - /** Next middleware to be executed*/ - next: Middleware | undefined; - /** - * - * @public - * @constructor - * To create an instance of RedirectHandler - * @param {RedirectHandlerOptions} [options = new RedirectHandlerOptions()] - The redirect handler options instance - * @returns An instance of RedirectHandler - */ - - public constructor(private options: RedirectHandlerOptions = new RedirectHandlerOptions()) { - this.options = options; - } - - /** - * @private - * To check whether the response has the redirect status code or not - * @param {Response} response - The response object - * @returns A boolean representing whether the response contains the redirect status code or not - */ - private isRedirect(response: FetchResponse): boolean { - return RedirectHandler.REDIRECT_STATUS_CODES.indexOf(response.status) !== -1; - } - - /** - * @private - * To check whether the response has location header or not - * @param {Response} response - The response object - * @returns A boolean representing the whether the response has location header or not - */ - private hasLocationHeader(response: FetchResponse): boolean { - return response.headers.has(RedirectHandler.LOCATION_HEADER); - } - - /** - * @private - * To get the redirect url from location header in response object - * @param {Response} response - The response object - * @returns A redirect url from location header - */ - private getLocationHeader(response: FetchResponse): string { - return response.headers.get(RedirectHandler.LOCATION_HEADER); - } - - /** - * @private - * To check whether the given url is a relative url or not - * @param {string} url - The url string value - * @returns A boolean representing whether the given url is a relative url or not - */ - private isRelativeURL(url: string): boolean { - return url.indexOf("://") === -1; - } - - /** - * @private - * To check whether the authorization header in the request should be dropped for consequent redirected requests - * @param {string} requestUrl - The request url value - * @param {string} redirectUrl - The redirect url value - * @returns A boolean representing whether the authorization header in the request should be dropped for consequent redirected requests - */ - private shouldDropAuthorizationHeader(requestUrl: string, redirectUrl: string): boolean { - const schemeHostRegex = /^[A-Za-z].+?:\/\/.+?(?=\/|$)/; - const requestMatches: string[] = schemeHostRegex.exec(requestUrl); - let requestAuthority: string; - let redirectAuthority: string; - if (requestMatches !== null) { - requestAuthority = requestMatches[0]; - } - const redirectMatches: string[] = schemeHostRegex.exec(redirectUrl); - if (redirectMatches !== null) { - redirectAuthority = redirectMatches[0]; - } - return typeof requestAuthority !== "undefined" && typeof redirectAuthority !== "undefined" && requestAuthority !== redirectAuthority; - } - - /** - * @private - * @async - * To update a request url with the redirect url - * @param {string} redirectUrl - The redirect url value - * @param {Context} context - The context object value - * @returns Nothing - */ - private async updateRequestUrl(redirectUrl: string, context: MiddlewareContext): Promise { - context.request = redirectUrl; - } - - /** - * @private - * To get the options for execution of the middleware - * @param {Context} context - The context object - * @returns A options for middleware execution - */ - private getOptions(context: MiddlewareContext): RedirectHandlerOptions { - let options: RedirectHandlerOptions; - if (context.middlewareControl) { - options = context.middlewareControl.getMiddlewareOptions(RedirectHandlerOptions) as RedirectHandlerOptions; - } - if (typeof options === "undefined") { - options = Object.assign(new RedirectHandlerOptions(), this.options); - } - return options; - } - - /** - * @private - * @async - * To execute the next middleware and to handle in case of redirect response returned by the server - * @param {Context} context - The context object - * @param {number} redirectCount - The redirect count value - * @param {RedirectHandlerOptions} options - The redirect handler options instance - * @returns A promise that resolves to nothing - */ - private async executeWithRedirect(context: MiddlewareContext, redirectCount: number, options: RedirectHandlerOptions): Promise { - await this.next.execute(context); - const response = context.response; - if (redirectCount < options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && options.shouldRedirect(response)) { - ++redirectCount; - if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { - context.options["method"] = HttpMethod.GET; - delete context.options.body; - } else { - const redirectUrl: string = this.getLocationHeader(response); - if (!this.isRelativeURL(redirectUrl) && this.shouldDropAuthorizationHeader(response.url, redirectUrl)) { - delete context.options.headers[RedirectHandler.AUTHORIZATION_HEADER]; - } - await this.updateRequestUrl(redirectUrl, context); - } - await this.executeWithRedirect(context, redirectCount, options); - } else { - return; - } - } - - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The context object of the request - * @returns A Promise that resolves to nothing - */ - public async execute(context: MiddlewareContext): Promise { - const redirectCount = 0; - const options = this.getOptions(context); - context.options.redirect = RedirectHandler.MANUAL_REDIRECT; - return await this.executeWithRedirect(context, redirectCount, options); - } + /** + * @private + * @static + * A member holding the array of redirect status codes + */ + private static REDIRECT_STATUS_CODES: number[] = [ + 301, // Moved Permanently + 302, // Found + 303, // See Other + 307, // Temporary Permanently + 308, // Moved Permanently + ]; + + /** + * @private + * @static + * A member holding SeeOther status code + */ + private static STATUS_CODE_SEE_OTHER = 303; + + /** + * @private + * @static + * A member holding the name of the location header + */ + private static LOCATION_HEADER = "Location"; + + /** + * @private + * @static + * A member representing the authorization header name + */ + private static AUTHORIZATION_HEADER = "Authorization"; + + /** + * @private + * @static + * A member holding the manual redirect value + */ + private static MANUAL_REDIRECT = "manual"; + + /** Next middleware to be executed*/ + next: Middleware | undefined; + /** + * + * @public + * @constructor + * To create an instance of RedirectHandler + * @param {RedirectHandlerOptions} [options = new RedirectHandlerOptions()] - The redirect handler options instance + * @returns An instance of RedirectHandler + */ + + public constructor(private options: RedirectHandlerOptions = new RedirectHandlerOptions()) { + this.options = options; + } + + /** + * @private + * To check whether the response has the redirect status code or not + * @param {Response} response - The response object + * @returns A boolean representing whether the response contains the redirect status code or not + */ + private isRedirect(response: FetchResponse): boolean { + return RedirectHandler.REDIRECT_STATUS_CODES.indexOf(response.status) !== -1; + } + + /** + * @private + * To check whether the response has location header or not + * @param {Response} response - The response object + * @returns A boolean representing the whether the response has location header or not + */ + private hasLocationHeader(response: FetchResponse): boolean { + return response.headers.has(RedirectHandler.LOCATION_HEADER); + } + + /** + * @private + * To get the redirect url from location header in response object + * @param {Response} response - The response object + * @returns A redirect url from location header + */ + private getLocationHeader(response: FetchResponse): string { + return response.headers.get(RedirectHandler.LOCATION_HEADER); + } + + /** + * @private + * To check whether the given url is a relative url or not + * @param {string} url - The url string value + * @returns A boolean representing whether the given url is a relative url or not + */ + private isRelativeURL(url: string): boolean { + return url.indexOf("://") === -1; + } + + /** + * @private + * To check whether the authorization header in the request should be dropped for consequent redirected requests + * @param {string} requestUrl - The request url value + * @param {string} redirectUrl - The redirect url value + * @returns A boolean representing whether the authorization header in the request should be dropped for consequent redirected requests + */ + private shouldDropAuthorizationHeader(requestUrl: string, redirectUrl: string): boolean { + const schemeHostRegex = /^[A-Za-z].+?:\/\/.+?(?=\/|$)/; + const requestMatches: string[] = schemeHostRegex.exec(requestUrl); + let requestAuthority: string; + let redirectAuthority: string; + if (requestMatches !== null) { + requestAuthority = requestMatches[0]; + } + const redirectMatches: string[] = schemeHostRegex.exec(redirectUrl); + if (redirectMatches !== null) { + redirectAuthority = redirectMatches[0]; + } + return typeof requestAuthority !== "undefined" && typeof redirectAuthority !== "undefined" && requestAuthority !== redirectAuthority; + } + + /** + * @private + * @async + * To update a request url with the redirect url + * @param {string} redirectUrl - The redirect url value + * @param {Context} context - The context object value + * @returns Nothing + */ + private async updateRequestUrl(redirectUrl: string, context: MiddlewareContext): Promise { + context.request = redirectUrl; + } + + /** + * @private + * To get the options for execution of the middleware + * @param {Context} context - The context object + * @returns A options for middleware execution + */ + private getOptions(context: MiddlewareContext): RedirectHandlerOptions { + let options: RedirectHandlerOptions; + if (context.middlewareControl) { + options = context.middlewareControl.getMiddlewareOptions(RedirectHandlerOptions) as RedirectHandlerOptions; + } + if (typeof options === "undefined") { + options = Object.assign(new RedirectHandlerOptions(), this.options); + } + return options; + } + + /** + * @private + * @async + * To execute the next middleware and to handle in case of redirect response returned by the server + * @param {Context} context - The context object + * @param {number} redirectCount - The redirect count value + * @param {RedirectHandlerOptions} options - The redirect handler options instance + * @returns A promise that resolves to nothing + */ + private async executeWithRedirect(context: MiddlewareContext, redirectCount: number, options: RedirectHandlerOptions): Promise { + await this.next.execute(context); + const response = context.response; + if (redirectCount < options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && options.shouldRedirect(response)) { + ++redirectCount; + if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { + context.options["method"] = HttpMethod.GET; + delete context.options.body; + } else { + const redirectUrl: string = this.getLocationHeader(response); + if (!this.isRelativeURL(redirectUrl) && this.shouldDropAuthorizationHeader(response.url, redirectUrl)) { + delete context.options.headers[RedirectHandler.AUTHORIZATION_HEADER]; + } + await this.updateRequestUrl(redirectUrl, context); + } + await this.executeWithRedirect(context, redirectCount, options); + } else { + return; + } + } + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The context object of the request + * @returns A Promise that resolves to nothing + */ + public async execute(context: MiddlewareContext): Promise { + const redirectCount = 0; + const options = this.getOptions(context); + context.options.redirect = RedirectHandler.MANUAL_REDIRECT; + return await this.executeWithRedirect(context, redirectCount, options); + } } diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts index f912d483a8..5d8693c23d 100644 --- a/http/typescript/fetch/src/middlewares/retryHandler.ts +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -9,13 +9,14 @@ * @module RetryHandler */ -import { MiddlewareContext } from "./middlewareContext"; import { HttpMethod } from "@microsoft/kiota-abstractions"; -import { Middleware } from "./middleware"; + +import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; import { getRequestHeader, setRequestHeader } from "../utils/headersUtil"; -import { RetryHandlerOptions } from "./options/retryHandlerOptions"; +import { Middleware } from "./middleware"; +import { MiddlewareContext } from "./middlewareContext"; import { MiddlewareControl } from "./middlewareControl"; -import {FetchResponse, FetchRequestInit, FetchRequestInfo} from "../utils/fetchDefinitions" +import { RetryHandlerOptions } from "./options/retryHandlerOptions"; /** * @class @@ -114,12 +115,11 @@ export class RetryHandler implements Middleware { const retryAfter = response.headers !== undefined ? response.headers.get(RetryHandler.RETRY_AFTER_HEADER) : null; let newDelay: number; if (retryAfter !== null) { - - // Retry-After: + // Retry-After: if (Number.isNaN(Number(retryAfter))) { newDelay = Math.round((new Date(retryAfter).getTime() - Date.now()) / 1000); } else { - // Retry-After: + // Retry-After: newDelay = Number(retryAfter); } } else { @@ -173,10 +173,10 @@ export class RetryHandler implements Middleware { */ private async executeWithRetry(context: MiddlewareContext, retryAttempts: number, options: RetryHandlerOptions): Promise { await this.next.execute(context); - if (retryAttempts < options.maxRetries && this.isRetry(context.response) && this.isBuffered(context.request, context.options) && options.shouldRetry(options.delay, retryAttempts, context.request, context.options, context.response!)) { + if (retryAttempts < options.maxRetries && this.isRetry(context.response) && this.isBuffered(context.request, context.options) && options.shouldRetry(options.delay, retryAttempts, context.request, context.options, context.response)) { ++retryAttempts; setRequestHeader(context.options, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); - const delay = this.getDelay(context.response!, retryAttempts, options.delay); + const delay = this.getDelay(context.response, retryAttempts, options.delay); await this.sleep(delay); return await this.executeWithRetry(context, retryAttempts, options); } else { diff --git a/http/typescript/fetch/src/utils/browser/utils.ts b/http/typescript/fetch/src/utils/browser/utils.ts index ed6da80d1b..cbb074dd5d 100644 --- a/http/typescript/fetch/src/utils/browser/utils.ts +++ b/http/typescript/fetch/src/utils/browser/utils.ts @@ -1,5 +1,3 @@ - - const browserURLSearchParams = URLSearchParams; -export { browserURLSearchParams as URLSearchParams}; \ No newline at end of file +export { browserURLSearchParams as URLSearchParams }; diff --git a/http/typescript/fetch/src/utils/demo.ts b/http/typescript/fetch/src/utils/demo.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/http/typescript/fetch/src/utils/fetchDefinitions.ts b/http/typescript/fetch/src/utils/fetchDefinitions.ts index c96e304467..99f45e9af8 100644 --- a/http/typescript/fetch/src/utils/fetchDefinitions.ts +++ b/http/typescript/fetch/src/utils/fetchDefinitions.ts @@ -1,25 +1,25 @@ export type FetchRequestInfo = string; // We only ever call fetch() on string urls. -export type FetchHeadersInit = Record; +export type FetchHeadersInit = Record; interface FetchBody { - readonly body: ReadableStream | null; - readonly bodyUsed: boolean; - arrayBuffer(): Promise; - blob(): Promise; - formData(): Promise; - json(): Promise; - text(): Promise; + readonly body: ReadableStream | null; + readonly bodyUsed: boolean; + arrayBuffer(): Promise; + blob(): Promise; + formData(): Promise; + json(): Promise; + text(): Promise; } export type FetchHeaders = Headers & { - append?(name: string, value: string): void; - delete?(name: string): void; - get?(name: string): string | null; - has?(name: string): boolean; - set?(name: string, value: string): void; - forEach?(callbackfn: (value: string, key: string, parent: FetchHeaders) => void, thisArg?: any): void; - [Symbol.iterator]?(): IterableIterator<[string, string]>; + append?(name: string, value: string): void; + delete?(name: string): void; + get?(name: string): string | null; + has?(name: string): boolean; + set?(name: string, value: string): void; + forEach?(callbackfn: (value: string, key: string, parent: FetchHeaders) => void, thisArg?: any): void; + [Symbol.iterator]?(): IterableIterator<[string, string]>; /** * Returns an iterator allowing to go through all key/value pairs contained in this object. */ @@ -35,78 +35,78 @@ export type FetchHeaders = Headers & { /** Node-fetch extension */ raw?(): Record; -} - - -export type FetchResponse = Response & FetchBody & { - readonly headers: FetchHeaders; - readonly ok: boolean; - readonly redirected: boolean; - readonly status: number; - readonly statusText: string; - readonly type: unknown; - readonly url: string; - clone(): Response; -} +}; +export type FetchResponse = Response & + FetchBody & { + readonly headers: FetchHeaders; + readonly ok: boolean; + readonly redirected: boolean; + readonly status: number; + readonly statusText: string; + readonly type: unknown; + readonly url: string; + clone(): Response; + }; +export type FetchRequestInit = Omit & { + /** + * Request's body + * Expected type in case of dom - ReadableStream | XMLHttpRequestBodyInit|null + * Expected type in case of node-fetch - | Blob | Buffer | URLSearchParams | NodeJS.ReadableStream | string|null + */ + body?: unknown; + /** + * A string indicating how the request will interact with the browser's cache to set request's cache. + */ + cache?: unknown; + /** + * A string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. Sets request's credentials. + */ + credentials?: unknown; + /** + * A Headers object, an object literal, or an array of two-item arrays to set request's headers. + */ + headers?: FetchHeadersInit; + /** + * A cryptographic hash of the resource to be fetched by request. Sets request's integrity. + */ + integrity?: string; + /** + * A boolean to set request's keepalive. + */ + keepalive?: boolean; + /** + * A string to set request's method. + */ + method?: string; + /** + * A string to indicate whether the request will use CORS, or will be restricted to same-origin URLs. Sets request's mode. + */ + mode?: unknown; + /** + * A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect. + */ + redirect?: unknown; + /** + * A string whose value is a same-origin URL, "about:client", or the empty string, to set request's referrer. + */ + referrer?: string; + /** + * A referrer policy to set request's referrerPolicy. + */ + referrerPolicy?: unknown; + /** + * An AbortSignal to set request's signal. + */ + signal?: unknown; + /** + * Can only be null. Used to disassociate request from any Window. + */ + window?: any; -export type FetchRequestInit = Omit &{ - /** - * A BodyInit object or null to set request's body. - */ - body?: unknown; - /** - * A string indicating how the request will interact with the browser's cache to set request's cache. - */ - cache?: unknown; - /** - * A string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. Sets request's credentials. - */ - credentials?: unknown; - /** - * A Headers object, an object literal, or an array of two-item arrays to set request's headers. - */ - headers?: FetchHeadersInit; - /** - * A cryptographic hash of the resource to be fetched by request. Sets request's integrity. - */ - integrity?: string; - /** - * A boolean to set request's keepalive. - */ - keepalive?: boolean; - /** - * A string to set request's method. - */ - method?: string; - /** - * A string to indicate whether the request will use CORS, or will be restricted to same-origin URLs. Sets request's mode. - */ - mode?: unknown; - /** - * A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect. - */ - redirect?: unknown; - /** - * A string whose value is a same-origin URL, "about:client", or the empty string, to set request's referrer. - */ - referrer?: string; - /** - * A referrer policy to set request's referrerPolicy. - */ - referrerPolicy?: unknown; - /** - * An AbortSignal to set request's signal. - */ - signal?: unknown | null; - /** - * Can only be null. Used to disassociate request from any Window. - */ - window?: any; - - //Node-Fetch - agent?: unknown; + //Node-Fetch + agent?: unknown; compress?: boolean; counter?: number; follow?: number; @@ -116,4 +116,4 @@ export type FetchRequestInit = Omit &{ size?: number; highWaterMark?: number; insecureHTTPParser?: boolean; -} \ No newline at end of file +}; diff --git a/http/typescript/fetch/src/utils/headersUtil.ts b/http/typescript/fetch/src/utils/headersUtil.ts index 3298d574ed..e39895bf72 100644 --- a/http/typescript/fetch/src/utils/headersUtil.ts +++ b/http/typescript/fetch/src/utils/headersUtil.ts @@ -65,6 +65,4 @@ export const appendRequestHeader = (options: FetchRequestInit | undefined, key: options.headers[key] += `, ${value}`; } } - }; - diff --git a/http/typescript/fetch/src/utils/utils.ts b/http/typescript/fetch/src/utils/utils.ts index 2adcb5e77e..0f0eda3e5f 100644 --- a/http/typescript/fetch/src/utils/utils.ts +++ b/http/typescript/fetch/src/utils/utils.ts @@ -1 +1 @@ -export {URLSearchParams} from "url"; \ No newline at end of file +export { URLSearchParams } from "url"; diff --git a/http/typescript/fetch/test/browser/MiddlewareFactory.ts b/http/typescript/fetch/test/browser/MiddlewareFactory.ts index e65f941bc0..e1c7e354fc 100644 --- a/http/typescript/fetch/test/browser/MiddlewareFactory.ts +++ b/http/typescript/fetch/test/browser/MiddlewareFactory.ts @@ -7,14 +7,13 @@ import { assert } from "chai"; -import { RetryHandler, defaultFetchHandler, MiddlewareFactory } from "../../src/browser"; +import { defaultFetchHandler, MiddlewareFactory, RetryHandler } from "../../src/browser"; describe("MiddlewareFactory", () => { it("Should return the default pipeline", () => { - const defaultMiddleWareArray = MiddlewareFactory.getDefaultMiddlewareChain(); - assert.equal(defaultMiddleWareArray.length,2); + assert.equal(defaultMiddleWareArray.length, 2); assert.isTrue(defaultMiddleWareArray[0] instanceof RetryHandler); assert.isTrue(defaultMiddleWareArray[1] instanceof defaultFetchHandler); }); diff --git a/http/typescript/fetch/test/browser/httpClient.ts b/http/typescript/fetch/test/browser/httpClient.ts index 5de5e06755..0356bb486c 100644 --- a/http/typescript/fetch/test/browser/httpClient.ts +++ b/http/typescript/fetch/test/browser/httpClient.ts @@ -7,18 +7,16 @@ import { assert } from "chai"; -import { defaultFetchHandler, HttpClient, RetryHandler, RedirectHandler, customFetchHandler } from "../../src"; +import { CustomFetchHandler, defaultFetchHandler, HttpClient, RetryHandler } from "../../src"; import { DummyFetchHandler } from "../common/middleware/dummyFetchHandler"; describe("HTTPClient.ts", () => { - - describe("constructor", () => { const dummyFetchHandler: DummyFetchHandler = new DummyFetchHandler(); - const dummyCustomFetch = ():Promise =>{ + const dummyCustomFetch = (): Promise => { return null; - } + }; it("Should create an instance and populate middleware member", async () => { const httpClient: HttpClient = new HttpClient(undefined, dummyFetchHandler); assert.isDefined(httpClient["middleware"]); @@ -32,7 +30,6 @@ describe("HTTPClient.ts", () => { }); it("Should set default middleware array if middleware parameter is undefined && customFetch is undefined", () => { - const client = new HttpClient(); assert.isNotNull(client["middleware"]); @@ -40,40 +37,33 @@ describe("HTTPClient.ts", () => { assert.isTrue(client["middleware"] instanceof RetryHandler); assert.isTrue(next instanceof defaultFetchHandler); - }); it("Should set default middleware array with customFetchHandler if middleware parameter is undefined && customFetch is defined", () => { - const client = new HttpClient(dummyCustomFetch); assert.isNotNull(client["middleware"]); assert.isNotNull(client[""]); - + const next = client["middleware"].next; - - assert.isTrue(client["middleware"] instanceof RetryHandler); - assert.isTrue(next instanceof customFetchHandler); + assert.isTrue(client["middleware"] instanceof RetryHandler); + assert.isTrue(next instanceof CustomFetchHandler); }); it("Should set to default fetch handler middleware array if middleware parameter is null && customFetch is undefined", () => { - - const client = new HttpClient(undefined,null); + const client = new HttpClient(undefined, null); assert.isNotNull(client["middleware"]); assert.isTrue(client["middleware"] instanceof defaultFetchHandler); - }); it("Should only set custom fetch if middleware parameter is null && customFetch is defined", () => { - const client = new HttpClient(dummyCustomFetch, null); assert.isUndefined(client["middleware"]); assert.equal(client["customFetch"], dummyCustomFetch); - }); }); diff --git a/http/typescript/fetch/test/browser/index.ts b/http/typescript/fetch/test/browser/index.ts index 477ad5b15d..95d0822714 100644 --- a/http/typescript/fetch/test/browser/index.ts +++ b/http/typescript/fetch/test/browser/index.ts @@ -1,5 +1,5 @@ -export * from "./MiddlewareFactory" -export * from "../common/middleware/MiddlewareUtil" +export * from "./MiddlewareFactory"; +export * from "../common/middleware/MiddlewareUtil"; export * from "../common/middleware/RetryHandler"; export * from "../common/middleware/RetryHandlerOptions"; export * from "./httpClient"; diff --git a/http/typescript/fetch/test/common/middleware/MiddlewareUtil.ts b/http/typescript/fetch/test/common/middleware/MiddlewareUtil.ts index dfec9f68dd..e41abd6e02 100644 --- a/http/typescript/fetch/test/common/middleware/MiddlewareUtil.ts +++ b/http/typescript/fetch/test/common/middleware/MiddlewareUtil.ts @@ -4,6 +4,7 @@ * See License in the project root for license information. * ------------------------------------------------------------------------------------------- */ +/* eslint-disable @typescript-eslint/no-unused-vars*/ import { assert } from "chai"; @@ -61,7 +62,7 @@ describe("HeaderUtil", async () => { it("Should set header for empty headers", () => { const options: FetchRequestInit = { method: "test", - headers: {} + headers: {}, }; setRequestHeader(options, key, value); assert.isDefined(options.headers); diff --git a/http/typescript/fetch/test/common/middleware/RetryHandler.ts b/http/typescript/fetch/test/common/middleware/RetryHandler.ts index 70dae2053e..d669e95422 100644 --- a/http/typescript/fetch/test/common/middleware/RetryHandler.ts +++ b/http/typescript/fetch/test/common/middleware/RetryHandler.ts @@ -7,19 +7,19 @@ import { assert } from "chai"; import { MiddlewareContext } from "../../../src/middlewares/middlewareContext"; -import { FetchRequestInit } from "../../../src/utils/fetchDefinitions"; import { MiddlewareControl } from "../../../src/middlewares/middlewareControl"; import { RetryHandlerOptions, ShouldRetry } from "../../../src/middlewares/options/retryHandlerOptions"; import { RetryHandler } from "../../../src/middlewares/retryHandler"; +import { FetchRequestInit } from "../../../src/utils/fetchDefinitions"; +import { getResponse } from "../../testUtils"; import { DummyFetchHandler } from "./dummyFetchHandler"; -import { getResponse } from "../../testUtils" +// eslint-disable-next-line no-var var Response = Response; -if (typeof Response != "object") { +if (typeof Response !== "object") { Response = getResponse(); - } -describe("RetryHandler.ts", function () { +describe("RetryHandler.ts", function() { this.timeout(20 * 1000); const retryHandler = new RetryHandler(); const retryHandlerOptions = new RetryHandlerOptions(); diff --git a/http/typescript/fetch/test/common/middleware/RetryHandlerOptions.ts b/http/typescript/fetch/test/common/middleware/RetryHandlerOptions.ts index 103254701c..a1596531eb 100644 --- a/http/typescript/fetch/test/common/middleware/RetryHandlerOptions.ts +++ b/http/typescript/fetch/test/common/middleware/RetryHandlerOptions.ts @@ -4,7 +4,7 @@ * See License in the project root for license information. * ------------------------------------------------------------------------------------------- */ - +/* eslint-disable @typescript-eslint/no-unused-vars*/ import { assert } from "chai"; import { RetryHandlerOptions, ShouldRetry } from "../../../src/middlewares/options/retryHandlerOptions"; diff --git a/http/typescript/fetch/test/common/middleware/dummyFetchHandler.ts b/http/typescript/fetch/test/common/middleware/dummyFetchHandler.ts index 2ddd70b57f..5974f40c69 100644 --- a/http/typescript/fetch/test/common/middleware/dummyFetchHandler.ts +++ b/http/typescript/fetch/test/common/middleware/dummyFetchHandler.ts @@ -9,8 +9,8 @@ * @module DummyHTTPMessageHandler */ -import { MiddlewareContext } from "../../../src/middlewares/middlewareContext"; import { Middleware } from "../../../src/middlewares/middleware"; +import { MiddlewareContext } from "../../../src/middlewares/middlewareContext"; /** * @class diff --git a/http/typescript/fetch/test/node/MiddlewareFactory.ts b/http/typescript/fetch/test/node/MiddlewareFactory.ts index 504e977648..5ec023be2f 100644 --- a/http/typescript/fetch/test/node/MiddlewareFactory.ts +++ b/http/typescript/fetch/test/node/MiddlewareFactory.ts @@ -7,14 +7,13 @@ import { assert } from "chai"; -import { RetryHandler, defaultFetchHandler, MiddlewareFactory, RedirectHandler} from "../../src"; +import { defaultFetchHandler, MiddlewareFactory, RedirectHandler, RetryHandler } from "../../src"; describe("MiddlewareFactory", () => { it("Should return the default pipeline", () => { - const defaultMiddleWareArray = MiddlewareFactory.getDefaultMiddlewareChain(); - assert.equal(defaultMiddleWareArray.length,3); - + assert.equal(defaultMiddleWareArray.length, 3); + assert.isTrue(defaultMiddleWareArray[0] instanceof RetryHandler); assert.isTrue(defaultMiddleWareArray[1] instanceof RedirectHandler); assert.isTrue(defaultMiddleWareArray[2] instanceof defaultFetchHandler); diff --git a/http/typescript/fetch/test/node/RedirectHandler.ts b/http/typescript/fetch/test/node/RedirectHandler.ts index ec365d88aa..c3e6fd2b14 100644 --- a/http/typescript/fetch/test/node/RedirectHandler.ts +++ b/http/typescript/fetch/test/node/RedirectHandler.ts @@ -6,19 +6,13 @@ */ import { assert } from "chai"; +import { Response } from "node-fetch"; import { MiddlewareContext } from "../../src/middlewares/middlewareContext"; import { MiddlewareControl } from "../../src/middlewares/middlewareControl"; import { RedirectHandlerOptions } from "../../src/middlewares/options/redirectHandlerOption"; import { RedirectHandler } from "../../src/middlewares/redirectHandler"; import { DummyFetchHandler } from "../common/middleware/dummyFetchHandler"; -import { getResponse } from "../testUtils" - -var Response = Response; -if (typeof Response != "object") { - Response = getResponse(); - -} const redirectHandlerOptions = new RedirectHandlerOptions(); const redirectHandler = new RedirectHandler(); diff --git a/http/typescript/fetch/test/node/httpClient.ts b/http/typescript/fetch/test/node/httpClient.ts index 4cc52520af..26cb458d68 100644 --- a/http/typescript/fetch/test/node/httpClient.ts +++ b/http/typescript/fetch/test/node/httpClient.ts @@ -7,18 +7,16 @@ import { assert } from "chai"; -import { defaultFetchHandler, HttpClient, RetryHandler, RedirectHandler, customFetchHandler } from "../../src"; +import { customFetchHandler, defaultFetchHandler, HttpClient, RedirectHandler, RetryHandler } from "../../src"; import { DummyFetchHandler } from "../common/middleware/dummyFetchHandler"; describe("HTTPClient.ts", () => { - - describe("constructor", () => { const dummyFetchHandler: DummyFetchHandler = new DummyFetchHandler(); - const dummyCustomFetch = ():Promise =>{ + const dummyCustomFetch = (): Promise => { return null; - } + }; it("Should create an instance and populate middleware member", async () => { const httpClient: HttpClient = new HttpClient(undefined, dummyFetchHandler); assert.isDefined(httpClient["middleware"]); @@ -32,7 +30,6 @@ describe("HTTPClient.ts", () => { }); it("Should set default middleware array if middleware parameter is undefined && customFetch is undefined", () => { - const client = new HttpClient(); assert.isNotNull(client["middleware"]); @@ -41,41 +38,34 @@ describe("HTTPClient.ts", () => { assert.isTrue(client["middleware"] instanceof RetryHandler); assert.isTrue(next instanceof RedirectHandler); assert.isTrue(next.next instanceof defaultFetchHandler); - }); it("Should set default middleware array with customFetchHandler if middleware parameter is undefined && customFetch is defined", () => { - const client = new HttpClient(dummyCustomFetch); assert.isNotNull(client["middleware"]); assert.isNotNull(client[""]); - + const next = client["middleware"].next; assert.isTrue(client["middleware"] instanceof RetryHandler); assert.isTrue(next instanceof RedirectHandler); assert.isTrue(next.next instanceof customFetchHandler); - }); it("Should set to default fetch handler middleware array if middleware parameter is null && customFetch is undefined", () => { - - const client = new HttpClient(undefined,null); + const client = new HttpClient(undefined, null); assert.isNotNull(client["middleware"]); assert.isTrue(client["middleware"] instanceof defaultFetchHandler); - }); it("Should only set custom fetch if middleware parameter is null && customFetch is defined", () => { - const client = new HttpClient(dummyCustomFetch, null); assert.isUndefined(client["middleware"]); assert.equal(client["customFetch"], dummyCustomFetch); - }); }); diff --git a/http/typescript/fetch/test/testUtils.ts b/http/typescript/fetch/test/testUtils.ts index 51b17b8daa..ae8c7163f9 100644 --- a/http/typescript/fetch/test/testUtils.ts +++ b/http/typescript/fetch/test/testUtils.ts @@ -1,5 +1,5 @@ -import {Response} from "node-fetch" +import { Response } from "node-fetch"; -export function getResponse(){ - return Response; -} \ No newline at end of file +export function getResponse() { + return Response; +} From 21be1444d3c351a1a75962be47b29392e8d8e444 Mon Sep 17 00:00:00 2001 From: "nikithauc@gmail.com" Date: Fri, 15 Oct 2021 17:46:49 -0700 Subject: [PATCH 17/34] adding eslint to abstractions --- abstractions/typescript/.eslintignore | 6 + abstractions/typescript/.eslintrc.json | 190 ++++ abstractions/typescript/.npmignore | 5 +- abstractions/typescript/.prettierrc | 13 + .../typescript/docs/design/isomorphic.md | 148 +++ .../typescript/docs/design/testing.md | 25 + abstractions/typescript/package-lock.json | 993 ++++++++++++++++++ abstractions/typescript/package.json | 61 +- .../typescript/src/apiClientBuilder.ts | 74 +- .../anonymousAuthenticationProvider.ts | 8 +- .../authentication/authenticationProvider.ts | 14 +- .../baseBearerTokenAuthenticationProvider.ts | 46 +- .../typescript/src/authentication/index.ts | 6 +- abstractions/typescript/src/httpMethod.ts | 40 +- abstractions/typescript/src/index.ts | 19 +- .../typescript/src/nativeResponseHandler.ts | 14 +- .../typescript/src/nativeResponseWrapper.ts | 35 +- .../typescript/src/readableStreamContent.ts | 11 +- abstractions/typescript/src/requestAdapter.ts | 110 +- .../typescript/src/requestInformation.ts | 245 ++--- abstractions/typescript/src/requestOption.ts | 6 +- .../typescript/src/responseHandler.ts | 18 +- .../typescript/src/serialization/index.ts | 18 +- .../typescript/src/serialization/parsable.ts | 36 +- .../typescript/src/serialization/parseNode.ts | 134 +-- .../src/serialization/parseNodeFactory.ts | 26 +- .../serialization/parseNodeFactoryRegistry.ts | 45 +- .../serialization/parseNodeProxyFactory.ts | 60 +- .../src/serialization/serializationWriter.ts | 171 +-- .../serializationWriterFactory.ts | 26 +- .../serializationWriterFactoryRegistry.ts | 39 +- .../serializationWriterProxyFactory.ts | 73 +- abstractions/typescript/src/shims.d.ts | 5 - .../typescript/src/store/backedModel.ts | 10 +- .../typescript/src/store/backingStore.ts | 100 +- .../src/store/backingStoreFactory.ts | 12 +- .../src/store/backingStoreFactorySingleton.ts | 4 +- .../src/store/backingStoreParseNodeFactory.ts | 40 +- ...ingStoreSerializationWriterProxyFactory.ts | 60 +- .../src/store/inMemoryBackingStore.ts | 152 +-- .../src/store/inMemoryBackingStoreFactory.ts | 8 +- abstractions/typescript/src/store/index.ts | 16 +- abstractions/typescript/src/utils/index.ts | 2 +- .../typescript/src/utils/stringUtils.ts | 12 +- abstractions/typescript/test/browser/index.ts | 9 +- .../test/browser/requestInformation.ts | 10 +- .../test/common/requestInformation.ts | 16 +- .../test/node/requestInformation.ts | 12 +- http/typescript/fetch/.vscode/settings.json | 3 - .../fetch/docs/design/isomorphic.md | 148 +++ http/typescript/fetch/docs/design/testing.md | 25 + http/typescript/fetch/package.json | 62 +- http/typescript/fetch/src/browser/index.ts | 10 + http/typescript/fetch/src/dom.shim.d.ts | 3 +- http/typescript/fetch/src/httpClient.ts | 99 +- http/typescript/fetch/src/index.ts | 7 + .../fetch/src/kiotaClientFactory.ts | 17 + .../browser/defaultFetchHandler.ts | 5 +- .../middlewares/browser/middlewareFactory.ts | 8 +- .../src/middlewares/defaultFetchHandler.ts | 2 +- .../fetch/src/middlewares/middleware.ts | 6 + .../src/middlewares/middlewareContext.ts | 11 +- .../src/middlewares/middlewareFactory.ts | 8 +- http/typescript/fetch/src/utils/demo.ts | 0 .../fetch/src/utils/fetchDefinitions.ts | 17 +- http/typescript/fetch/src/utils/referDom.d.ts | 12 +- .../fetch/test/browser/MiddlewareFactory.ts | 4 +- .../fetch/test/browser/httpClient.ts | 52 +- .../fetch/test/node/MiddlewareFactory.ts | 4 +- http/typescript/fetch/test/node/httpClient.ts | 52 +- 70 files changed, 2653 insertions(+), 1085 deletions(-) create mode 100644 abstractions/typescript/.eslintignore create mode 100644 abstractions/typescript/.eslintrc.json create mode 100644 abstractions/typescript/.prettierrc create mode 100644 abstractions/typescript/docs/design/isomorphic.md create mode 100644 abstractions/typescript/docs/design/testing.md delete mode 100644 abstractions/typescript/src/shims.d.ts delete mode 100644 http/typescript/fetch/.vscode/settings.json create mode 100644 http/typescript/fetch/docs/design/isomorphic.md create mode 100644 http/typescript/fetch/docs/design/testing.md create mode 100644 http/typescript/fetch/src/kiotaClientFactory.ts delete mode 100644 http/typescript/fetch/src/utils/demo.ts diff --git a/abstractions/typescript/.eslintignore b/abstractions/typescript/.eslintignore new file mode 100644 index 0000000000..9ec10207b9 --- /dev/null +++ b/abstractions/typescript/.eslintignore @@ -0,0 +1,6 @@ +*.js +*.js.map +*.d.ts + +node_modules +dist \ No newline at end of file diff --git a/abstractions/typescript/.eslintrc.json b/abstractions/typescript/.eslintrc.json new file mode 100644 index 0000000000..ca92e01ddb --- /dev/null +++ b/abstractions/typescript/.eslintrc.json @@ -0,0 +1,190 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint", "prettier", "simple-import-sort"], + "extends": ["eslint:recommended", "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended", "prettier"], + "rules": { + "@typescript-eslint/no-empty-interface": "off", + "@typescript-eslint/ban-types": "off", + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "prettier/prettier": "error", + "@typescript-eslint/no-var-requires": "error", + "@typescript-eslint/no-non-null-assertion": "error", + "@typescript-eslint/naming-convention": [ + "error", + { + "selector": "typeLike", + "format": ["PascalCase"], + "filter": { + "regex": "^(__String|[A-Za-z]+_[A-Za-z]+)$", + "match": false + } + }, + { + "selector": "interface", + "format": ["PascalCase"], + "custom": { + "regex": "^I[A-Z]", + "match": false + }, + "filter": { + "regex": "^I(Arguments|TextWriter|O([A-Z][a-z]+[A-Za-z]*)?)$", + "match": false + } + }, + { + "selector": "variable", + "format": ["camelCase", "PascalCase", "UPPER_CASE"], + "leadingUnderscore": "allow", + "filter": { + "regex": "^(_{1,2}filename|_{1,2}dirname|_+|[A-Za-z]+_[A-Za-z]+)$", + "match": false + } + }, + { + "selector": "function", + "format": ["camelCase", "PascalCase"], + "leadingUnderscore": "allow", + "filter": { + "regex": "^[A-Za-z]+_[A-Za-z]+$", + "match": false + } + }, + { + "selector": "parameter", + "format": ["camelCase"], + "leadingUnderscore": "allow", + "filter": { + "regex": "^(_+|[A-Za-z]+_[A-Z][a-z]+)$", + "match": false + } + }, + { + "selector": "method", + "format": ["camelCase", "PascalCase"], + "leadingUnderscore": "allow", + "filter": { + "regex": "^[A-Za-z]+_[A-Za-z]+$", + "match": false + } + }, + { + "selector": "memberLike", + "format": ["camelCase"], + "leadingUnderscore": "allow", + "filter": { + "regex": "^[A-Za-z]+_[A-Za-z]+$", + "match": false + } + }, + { + "selector": "enumMember", + "format": ["camelCase", "PascalCase"], + "leadingUnderscore": "allow", + "filter": { + "regex": "^[A-Za-z]+_[A-Za-z]+$", + "match": false + } + }, + { + "selector": "property", + "format": null + } + ], + "@typescript-eslint/semi": "error", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/prefer-for-of": "error", + "@typescript-eslint/prefer-function-type": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/quotes": [ + "error", + "double", + { + "avoidEscape": true, + "allowTemplateLiterals": true + } + ], + "@typescript-eslint/space-within-parens": ["off", "never"], + "@typescript-eslint/triple-slash-reference": "error", + "@typescript-eslint/type-annotation-spacing": "error", + "@typescript-eslint/unified-signatures": "error", + "@typescript-eslint/adjacent-overload-signatures": "error", + "@typescript-eslint/array-type": "error", + "@typescript-eslint/consistent-type-definitions": ["error", "interface"], + "@typescript-eslint/no-inferrable-types": "error", + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-this-alias": "error", + "no-unused-expressions": "off", + "@typescript-eslint/no-unused-expressions": [ + "error", + { + "allowTernary": true + } + ], + "@typescript-eslint/space-before-function-paren": "off", + "@typescript-eslint/consistent-type-assertions": "error", + "@typescript-eslint/explicit-member-accessibility": [ + "off", + { + "accessibility": "explicit" + } + ], + "@typescript-eslint/indent": "off", + "@typescript-eslint/interface-name-prefix": "off", + "@typescript-eslint/member-delimiter-style": [ + "off", + { + "multiline": { + "delimiter": "none", + "requireLast": true + }, + "singleline": { + "delimiter": "semi", + "requireLast": false + } + } + ], + "@typescript-eslint/member-ordering": "off", + "@typescript-eslint/no-empty-function": "error", + "@typescript-eslint/no-namespace": "off", + "@typescript-eslint/no-parameter-properties": "off", + "@typescript-eslint/no-array-constructor": "error", + "no-useless-catch": "error", + "prefer-rest-params": "off", + "no-constant-condition": "error", + "simple-import-sort/imports": "error", + "brace-style": "error", + "constructor-super": "error", + "curly": ["error", "multi-line"], + "dot-notation": "off", + "eqeqeq": "error", + "new-parens": "error", + "no-caller": "error", + "no-duplicate-case": "error", + "no-duplicate-imports": "error", + "no-empty": "error", + "no-eval": "error", + "no-extra-bind": "error", + "no-fallthrough": "error", + "no-new-func": "off", + "no-new-wrappers": "error", + "no-return-await": "off", + "no-sparse-arrays": "error", + "no-template-curly-in-string": "error", + "no-throw-literal": "error", + "no-trailing-spaces": "error", + "no-undef-init": "error", + "no-unsafe-finally": "error", + "no-unused-labels": "error", + "no-var": "error", + "object-shorthand": "error", + "prefer-const": "error", + "prefer-object-spread": "error", + "quote-props": "off", + "space-in-parens": "error", + "unicode-bom": ["error", "never"], + "use-isnan": "error" + } +} \ No newline at end of file diff --git a/abstractions/typescript/.npmignore b/abstractions/typescript/.npmignore index bfe3b8d326..ea0db9d88c 100644 --- a/abstractions/typescript/.npmignore +++ b/abstractions/typescript/.npmignore @@ -1 +1,4 @@ -tsconfig.json \ No newline at end of file +tsconfig.json +doc/ +dist/cjs/test +dist/es/test \ No newline at end of file diff --git a/abstractions/typescript/.prettierrc b/abstractions/typescript/.prettierrc new file mode 100644 index 0000000000..87a872077f --- /dev/null +++ b/abstractions/typescript/.prettierrc @@ -0,0 +1,13 @@ +{ + "arrowParens": "always", + "bracketSpacing": true, + "jsxBracketSameLine": true, + "jsxSingleQuote": false, + "printWidth": 5000, + "proseWrap": "never", + "semi": true, + "singleQuote": false, + "tabWidth": 4, + "trailingComma": "all", + "useTabs": true +} diff --git a/abstractions/typescript/docs/design/isomorphic.md b/abstractions/typescript/docs/design/isomorphic.md new file mode 100644 index 0000000000..b2e351cb04 --- /dev/null +++ b/abstractions/typescript/docs/design/isomorphic.md @@ -0,0 +1,148 @@ +## Terms - + +- bundler - Module bundlers are tools frontend developers used to bundle JavaScript modules into a single JavaScript files that can be executed in the browser. + +- rollup - rollup.js is the module bundler that the JS SDK uses. + +- package.json fields - + + - main - The main field is a module ID that is the primary entry point to your program. Points to the CJS modules. + + - module - The module field is not an official npm feature but a common convention among bundlers to designate how to import an ESM version of a library. Points to the ES modules. + + - browser - If the module is meant to be used client-side, the browser field should be used instead of the main field. + +## Isomorphic library +The Kiota libraries are isomorphic, that is, this library runs in node and browser. + +To achieve the isomorphism, the library is set up in the following ways: + + TypeScript Source Code + / \ + Transpiles into JavaScript + 'dist' folder + / \ + CJS module ES modules +1. The library supports `CommonJS` modules and `ES` modules.`CommonJS` formats are popular in the node enviroment. + `main` - `dist/es/src/index.js` + `module` - `dist/es/src/index.js` + +2. Entry point for the browser - `dist/es/src/browser/index.js`. + +Often times the library will have code which is different for the browser and node environments. +Examples: +- Browsers use a global `fetch` defined in the `DOM` while node relies on an external library such as `node-fetch` or `undici`. +- `ReadableStream` are different interfaces in node and browser. + +To manage such differences, separate files are maintained when the code can be different for node or browser. + +For example: +- The `DefaultFetchHandler` uses `node-fetch` for node and the `dom` fetch for browser. +- Map this difference as follows: + +```json +"browser": { + "./dist/es/src/index.js": "./dist/es/src/browser/index.js", + "./dist/es/src/utils/utils.js": "./dist/es/src/utils/browser/utils.js", + "./dist/es/src/middlewares/defaultFetchHandler.js": "./dist/es/src/middlewares/browser/defaultFetchHandler.js", + "./dist/es/src/middlewares/middlewareFactory.js": "./dist/es/src/middlewares/browser/middlewareFactory.js", + "./dist/cjs/src/middlewares/middlewareFactory.js": "./dist/es/src/middlewares/browser/middlewareFactory.js" +} +``` + +The applications or library using `kiota-http-fetch library` will have bundlers that use this `package.json browser` mapping if the target environment is set to browser. + + +## Use of `lib:dom` and `@types/node` + +Typescript isomorphic libraries often rely on the DOM definitions and `@types/node` as compile-time dependencies. + +Example 1: +```json +// tsconfig.json in the isomorphic library + +{ + "compileroptions": { + "lib":"dom" + } +} +``` +Issues with example 1: + - This configuration makes DOM definitions globally available as a compile time dependency during development and it is not shipped with the library. However, when a node only application uses the isomorphic library, the DOM definitions will not be available and this causes Typescript compile time errors. + - [Issue example: Removed dom lib dependency](https://github.com/prisma-labs/graphql-request/issues/26) + - [PR example: azure core-http](https://github.com/Azure/azure-sdk-for-js/pull/7500) + + +Example 2: +``` +// example of use of @type/nodes +const readableStream : NodeJS.ReadableStream + +or + +global ambient declarations at the top of the file +/// +/// +``` + +Issues with example 2: + - When transpiling a direct reference to `@types/node`, such as `NodeJS.ReadableStream`, the transpiled code contains a global ambient declaration `/// `. The global ambient declarations leak the typings to the user code. + - Example of issues: + - [Removes reference to node typings and stubs dom interfaces](https://github.com/aws/aws-sdk-js/pull/1228) + - [Typings polutes global space with DOM types ](https://github.com/node-fetch/node-fetch/issues/1285) + + +Other issues: +Typescript is yet capture some of complete dynamic support that JavaScript provides. An example of this is [Node browser resolution strategy](https://github.com/microsoft/TypeScript/issues/7753) since today the compiler cannot type check based on the environment. + +### Solution to this: + +Approaches for this problem as observed in other isomorphic libraries: +- A good reference to a very optimal solution is here: [PR example: azure core-http](https://github.com/Azure/azure-sdk-for-js/pull/7500) +- A common approch that is taken is to create empty interfaces or shims. Then, if the user includes dom or the required definitions, the interfaces are merged. Reference [Removes reference to node typings and stubs dom interfaces](https://github.com/aws/aws-sdk-js/pull/1228) + +##### DOM shims and Fetch definitions +The `kiota-http-fetch library` relies on the DOM definitions such as `RequestInit`, `RequestInfo`. + +1. Maintain and export `dom.shim.d.ts` containing empty interfaces. This way the user can compile their code with the library without having a DOM library. + +```typescript +interface Request { } +interface RequestInit { } +interface Response { } +interface Headers { } +interface ReadableStream { } +interface fetch { } +``` + +2. The library code relies on interface definitions and interface properties such as `Request.body`, `Request.headers`. Introduced the `FetchDefinitions.ts` to achieve this. `FetchDefinitions.ts` contains the following intersection types: +- `FetchRequestInit` +- `FetchHeadersInit` +- `FetchResponse` + +These types are redefined so that definitions are available and can be set isomorphically. + +For example: + +``` typescript +export type FetchRequestInit = Omit & { + /** + * Request's body + * Expected type in case of dom - ReadableStream | XMLHttpRequestBodyInit|null + * Expected type in case of node-fetch - | Blob | Buffer | URLSearchParams | NodeJS.ReadableStream | string|null + */ + body?: unknown; +} +```` + +##### ReadableStreamContent + +- `ReadableStream` are different interfaces in node and browser. +- Introducing `ReadableStreamContent`, empty interface expecting the type of NodeJS.ReadableStream or dom ReadableStream + * Node example: import {Readable} from "stream"; const readableStream = new Readable(); + * Browser example: const readableStream = new ReadableStream(); + +Alternatives considered to manage this difference: +- `content - NodeJS.ReadableStream | ReadableStream`. This transpiles to use the global ambient declaration of `type = nodes` which causes the global leaking issues discussed above. +- `content - ReadableStream` and maintaining an empty interface with the same name, that is, ReadableStream causes a mismatch error if content is set to NodeJS.Readable and DOM definitions are present at the same time. +- Due to the lack of `node browser resolution strategy` in the typings, we cannot maintain separate node and browser typings files for `ReadableStream` interface. diff --git a/abstractions/typescript/docs/design/testing.md b/abstractions/typescript/docs/design/testing.md new file mode 100644 index 0000000000..819b20d7e3 --- /dev/null +++ b/abstractions/typescript/docs/design/testing.md @@ -0,0 +1,25 @@ +## Testing for node and browser + +### Testing for node + +- Tests targeting the node environment are in `/test/node` and `/test/common` folder and use `mocha` and `chai` JS libraries. +- Test formats: + - script to test `CommonJS` modules: `npm run test:cjs` + - script to test `ES` modules: `npm run test:es` +- Examples of node environment specific tests: Test `DefaultFetchHandler` using `node-fetch` library. + + +### Testing for browser + + +- Tests targeting the node environment are in `/test/browser` and `/test/common` folder and use `mocha` and `chai` JS libraries. +- To test for browsers, the tests and the source code are bundled using `rollup` and the bundled file is tested using `karma`. +- Test formats: + - script to test: `npm run karma`. +- Examples of node environment specific tests: Test `DefaultFetchHandler` using dom - `fetch`. + +--- +**NOTE** + +The bundled file considers the `package.json browser spec` during the rollup process. The entry point of the source code for the tests will be `src/browser/index.js` and the `package.json browser spec` file mapping should work. +--- diff --git a/abstractions/typescript/package-lock.json b/abstractions/typescript/package-lock.json index a1978ebd11..7595076479 100644 --- a/abstractions/typescript/package-lock.json +++ b/abstractions/typescript/package-lock.json @@ -293,12 +293,140 @@ "to-fast-properties": "^2.0.0" } }, + "@eslint/eslintrc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.3.tgz", + "integrity": "sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.0.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", + "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, "@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@rollup/plugin-commonjs": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.0.tgz", @@ -395,6 +523,12 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, "@types/mocha": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", @@ -431,6 +565,158 @@ "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==", "dev": true }, + "@typescript-eslint/eslint-plugin": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.0.0.tgz", + "integrity": "sha512-T6V6fCD2U0YesOedvydTnrNtsC8E+c2QzpawIpDdlaObX0OX5dLo7tLU5c64FhTZvA1Xrdim+cXDI7NPsVx8Cg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.0.0", + "@typescript-eslint/scope-manager": "5.0.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.0.0.tgz", + "integrity": "sha512-Dnp4dFIsZcPawD6CT1p5NibNUQyGSEz80sULJZkyhyna8AEqArmfwMwJPbmKzWVo4PabqNVzHYlzmcdLQWk+pg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "5.0.0", + "@typescript-eslint/types": "5.0.0", + "@typescript-eslint/typescript-estree": "5.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.0.0.tgz", + "integrity": "sha512-B6D5rmmQ14I1fdzs71eL3DAuvnPHTY/t7rQABrL9BLnx/H51Un8ox1xqYAchs0/V2trcoyxB1lMJLlrwrJCDgw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.0.0", + "@typescript-eslint/types": "5.0.0", + "@typescript-eslint/typescript-estree": "5.0.0", + "debug": "^4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.0.0.tgz", + "integrity": "sha512-5RFjdA/ain/MDUHYXdF173btOKncIrLuBmA9s6FJhzDrRAyVSA+70BHg0/MW6TE+UiKVyRtX91XpVS0gVNwVDQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.0.0", + "@typescript-eslint/visitor-keys": "5.0.0" + } + }, + "@typescript-eslint/types": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.0.0.tgz", + "integrity": "sha512-dU/pKBUpehdEqYuvkojmlv0FtHuZnLXFBn16zsDmlFF3LXkOpkAQ2vrKc3BidIIve9EMH2zfTlxqw9XM0fFN5w==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.0.0.tgz", + "integrity": "sha512-V/6w+PPQMhinWKSn+fCiX5jwvd1vRBm7AX7SJQXEGQtwtBvjMPjaU3YTQ1ik2UF1u96X7tsB96HMnulG3eLi9Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.0.0", + "@typescript-eslint/visitor-keys": "5.0.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.0.0.tgz", + "integrity": "sha512-yRyd2++o/IrJdyHuYMxyFyBhU762MRHQ/bAGQeTnN3pGikfh+nEmM61XTqaDH1XDp53afZ+waXrk0ZvenoZ6xw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.0.0", + "eslint-visitor-keys": "^3.0.0" + } + }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -453,12 +739,30 @@ "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", "dev": true }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -496,6 +800,12 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -784,6 +1094,12 @@ "get-intrinsic": "^1.0.2" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, "camelcase": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", @@ -1075,6 +1391,28 @@ "sha.js": "^2.4.8" } }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -1130,6 +1468,12 @@ "type-detect": "^4.0.0" } }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -1201,6 +1545,24 @@ } } }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -1313,6 +1675,15 @@ "base64-arraybuffer": "0.1.4" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", @@ -1382,18 +1753,284 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "eslint": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.1.tgz", + "integrity": "sha512-LsgcwZgQ72vZ+SMp4K6pAnk2yFDWL7Ti4pJaRvsZ0Hsw2h8ZjUIW38a9AFn2cZXdBMlScMFYYgsSp4ttFI/0bA==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.0.3", + "@humanwhocodes/config-array": "^0.6.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^6.0.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", + "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==" + }, + "eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-simple-import-sort": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz", + "integrity": "sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==" + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", + "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", + "dev": true + }, "esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", "dev": true }, + "espree": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", + "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", + "dev": true, + "requires": { + "acorn": "^8.5.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.0.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, "estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -1422,6 +2059,60 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1462,6 +2153,24 @@ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "dependencies": { + "flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + } + } + }, "flatted": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", @@ -1510,6 +2219,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -1578,6 +2293,20 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, "graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", @@ -1723,6 +2452,28 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2127,6 +2878,18 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -2286,6 +3049,16 @@ } } }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2307,6 +3080,12 @@ "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", "dev": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "log-symbols": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", @@ -2373,6 +3152,15 @@ } } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", @@ -2414,6 +3202,22 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -2631,6 +3435,12 @@ "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", "dev": true }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -2707,6 +3517,20 @@ "wrappy": "1" } }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -2746,6 +3570,15 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-asn1": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", @@ -2783,12 +3616,24 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -2820,12 +3665,37 @@ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==" + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "requires": { + "fast-diff": "^1.1.2" + } + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -2878,6 +3748,12 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -2935,6 +3811,12 @@ "picomatch": "^2.2.1" } }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2957,6 +3839,18 @@ "path-parse": "^1.0.6" } }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", @@ -3014,6 +3908,15 @@ } } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3063,6 +3966,21 @@ "safe-buffer": "^5.0.1" } }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -3074,6 +3992,12 @@ "object-inspect": "^1.9.0" } }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "socket.io": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz", @@ -3164,6 +4088,12 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -3325,6 +4255,12 @@ } } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", @@ -3364,18 +4300,48 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "dev": true }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -3422,6 +4388,15 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -3471,6 +4446,12 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -3576,6 +4557,12 @@ } } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "workerpool": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", @@ -3617,6 +4604,12 @@ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/abstractions/typescript/package.json b/abstractions/typescript/package.json index b16e1c0c1c..2dfe8f57de 100644 --- a/abstractions/typescript/package.json +++ b/abstractions/typescript/package.json @@ -2,38 +2,53 @@ "name": "@microsoft/kiota-abstractions", "version": "1.0.21", "description": "Core abstractions for kiota generated libraries in TypeScript and JavaScript", + "keywords": [ + "kiota", + "openAPI", + "Microsoft", + "Graph" + ], + "homepage": "https://github.com/microsoft/kiota#readme", + "bugs": { + "url": "https://github.com/microsoft/kiota/issues" + }, + "repository": "git://github.com/microsoft/kiota.git", + "license": "MIT", + "author": "Microsoft", "main": "dist/cjs/src/index.js", - "types": "dist/cjs/src/index.d.ts", "module": "dist/es/src/index.js", + "types": "dist/cjs/src/index.d.ts", "scripts": { "build": "npm run build:cjs && npm run build:es", "build:cjs": "tsc -p tsconfig.cjs.json", "build:es": "tsc -p tsconfig.es.json", - "test:cjs": "npm run build:cjs && mocha 'dist/cjs/test/common/**/*.js' && mocha 'dist/cjs/test/node/**/*.js'", - "test:es": " npm run build:es && mocha 'dist/es/test/common/**/*.js' --require esm && mocha 'dist/es/test/node/**/*.js' --require esm", - "test": "npm run test:cjs && npm run test:es", "clean": "rm -r ./dist", "karma": "npm run rollup && karma start --single-run --browsers ChromeHeadless karma.conf.js", - "rollup": "rollup -c" + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", + "rollup": "rollup -c", + "test": "npm run test:cjs && npm run test:es", + "test:cjs": "npm run build:cjs && mocha 'dist/cjs/test/common/**/*.js' && mocha 'dist/cjs/test/node/**/*.js'", + "test:es": " npm run build:es && mocha 'dist/es/test/common/**/*.js' --require esm && mocha 'dist/es/test/node/**/*.js' --require esm" }, - "repository": "git://github.com/microsoft/kiota.git", - "keywords": [ - "kiota", - "openAPI", - "Microsoft", - "Graph" - ], - "author": "Microsoft", - "license": "MIT", - "bugs": { - "url": "https://github.com/microsoft/kiota/issues" + "dependencies": { + "uuid": "^8.3.2" }, - "homepage": "https://github.com/microsoft/kiota#readme", "devDependencies": { + "@rollup/plugin-commonjs": "^21.0.0", + "@rollup/plugin-node-resolve": "^13.0.5", "@types/chai": "^4.2.22", "@types/mocha": "^9.0.0", + "@types/node": "^16.10.5", "@types/sinon": "^10.0.4", + "@types/uuid": "^8.3.1", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", "chai": "^4.3.4", + "eslint": "^8.0.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-simple-import-sort": "^7.0.0", "esm": "^3.2.25", "karma": "^6.3.4", "karma-chai": "^0.1.0", @@ -42,18 +57,12 @@ "karma-mocha": "^2.0.1", "karma-typescript": "^5.5.2", "mocha": "^8.4.0", - "@types/node": "^16.10.5", - "@types/uuid": "^8.3.1", - "typescript": "^4.4.3", - "@rollup/plugin-commonjs": "^21.0.0", - "@rollup/plugin-node-resolve": "^13.0.5", + "prettier": "^2.4.1", "rollup": "^2.58.0", - "rollup-plugin-terser": "^7.0.2" + "rollup-plugin-terser": "^7.0.2", + "typescript": "^4.4.3" }, "publishConfig": { "registry": "https://npm.pkg.github.com" - }, - "dependencies": { - "uuid": "^8.3.2" } } \ No newline at end of file diff --git a/abstractions/typescript/src/apiClientBuilder.ts b/abstractions/typescript/src/apiClientBuilder.ts index 32174eec16..1a65454abd 100644 --- a/abstractions/typescript/src/apiClientBuilder.ts +++ b/abstractions/typescript/src/apiClientBuilder.ts @@ -1,23 +1,23 @@ -import { BackingStoreParseNodeFactory, BackingStoreSerializationWriterProxyFactory } from "./store"; import { ParseNodeFactory, ParseNodeFactoryRegistry, SerializationWriterFactory, SerializationWriterFactoryRegistry } from "./serialization"; +import { BackingStoreParseNodeFactory, BackingStoreSerializationWriterProxyFactory } from "./store"; /** * Registers the default serializer to the registry. * @param type the class of the factory to be registered. */ -export function registerDefaultSerializer(type: new() => SerializationWriterFactory): void { - if(!type) throw new Error("Type is required"); - const serializer = new type(); - SerializationWriterFactoryRegistry.defaultInstance.contentTypeAssociatedFactories.set(serializer.getValidContentType(), serializer); +export function registerDefaultSerializer(type: new () => SerializationWriterFactory): void { + if (!type) throw new Error("Type is required"); + const serializer = new type(); + SerializationWriterFactoryRegistry.defaultInstance.contentTypeAssociatedFactories.set(serializer.getValidContentType(), serializer); } /** * Registers the default deserializer to the registry. * @param type the class of the factory to be registered. */ -export function registerDefaultDeserializer(type: new() => ParseNodeFactory): void { - if(!type) throw new Error("Type is required"); - const deserializer = new type(); - ParseNodeFactoryRegistry.defaultInstance.contentTypeAssociatedFactories.set(deserializer.getValidContentType(), deserializer); +export function registerDefaultDeserializer(type: new () => ParseNodeFactory): void { + if (!type) throw new Error("Type is required"); + const deserializer = new type(); + ParseNodeFactoryRegistry.defaultInstance.contentTypeAssociatedFactories.set(deserializer.getValidContentType(), deserializer); } /** * Enables the backing store on default serialization writers and the given serialization writer. @@ -25,15 +25,16 @@ export function registerDefaultDeserializer(type: new() => ParseNodeFactory): vo * @return A new serialization writer with the backing store enabled. */ export function enableBackingStoreForSerializationWriterFactory(original: SerializationWriterFactory): SerializationWriterFactory { - if(!original) throw new Error("Original must be specified"); - let result = original; - if(original instanceof SerializationWriterFactoryRegistry) - enableBackingStoreForSerializationRegistry(original as SerializationWriterFactoryRegistry); - else - result = new BackingStoreSerializationWriterProxyFactory(original); - enableBackingStoreForSerializationRegistry(SerializationWriterFactoryRegistry.defaultInstance); - enableBackingStoreForParseNodeRegistry(ParseNodeFactoryRegistry.defaultInstance); - return result; + if (!original) throw new Error("Original must be specified"); + let result = original; + if (original instanceof SerializationWriterFactoryRegistry) { + enableBackingStoreForSerializationRegistry(original as SerializationWriterFactoryRegistry); + } else { + result = new BackingStoreSerializationWriterProxyFactory(original); + } + enableBackingStoreForSerializationRegistry(SerializationWriterFactoryRegistry.defaultInstance); + enableBackingStoreForParseNodeRegistry(ParseNodeFactoryRegistry.defaultInstance); + return result; } /** * Enables the backing store on default parse node factories and the given parse node factory. @@ -41,24 +42,27 @@ export function enableBackingStoreForSerializationWriterFactory(original: Serial * @return A new parse node factory with the backing store enabled. */ export function enableBackingStoreForParseNodeFactory(original: ParseNodeFactory): ParseNodeFactory { - if(!original) throw new Error("Original must be specified"); - let result = original; - if(original instanceof ParseNodeFactoryRegistry) - enableBackingStoreForParseNodeRegistry(original as ParseNodeFactoryRegistry); - else - result = new BackingStoreParseNodeFactory(original); - enableBackingStoreForParseNodeRegistry(ParseNodeFactoryRegistry.defaultInstance); - return result; + if (!original) throw new Error("Original must be specified"); + let result = original; + if (original instanceof ParseNodeFactoryRegistry) { + enableBackingStoreForParseNodeRegistry(original as ParseNodeFactoryRegistry); + } else { + result = new BackingStoreParseNodeFactory(original); + } + enableBackingStoreForParseNodeRegistry(ParseNodeFactoryRegistry.defaultInstance); + return result; } function enableBackingStoreForParseNodeRegistry(registry: ParseNodeFactoryRegistry): void { - for (const [k, v] of registry.contentTypeAssociatedFactories) { - if(!(v instanceof BackingStoreParseNodeFactory || v instanceof ParseNodeFactoryRegistry)) - registry.contentTypeAssociatedFactories.set(k, new BackingStoreParseNodeFactory(v)); - } + for (const [k, v] of registry.contentTypeAssociatedFactories) { + if (!(v instanceof BackingStoreParseNodeFactory || v instanceof ParseNodeFactoryRegistry)) { + registry.contentTypeAssociatedFactories.set(k, new BackingStoreParseNodeFactory(v)); + } + } } function enableBackingStoreForSerializationRegistry(registry: SerializationWriterFactoryRegistry): void { - for (const [k, v] of registry.contentTypeAssociatedFactories) { - if(!(v instanceof BackingStoreSerializationWriterProxyFactory || v instanceof SerializationWriterFactoryRegistry)) - registry.contentTypeAssociatedFactories.set(k, new BackingStoreSerializationWriterProxyFactory(v)); - } -} \ No newline at end of file + for (const [k, v] of registry.contentTypeAssociatedFactories) { + if (!(v instanceof BackingStoreSerializationWriterProxyFactory || v instanceof SerializationWriterFactoryRegistry)) { + registry.contentTypeAssociatedFactories.set(k, new BackingStoreSerializationWriterProxyFactory(v)); + } + } +} diff --git a/abstractions/typescript/src/authentication/anonymousAuthenticationProvider.ts b/abstractions/typescript/src/authentication/anonymousAuthenticationProvider.ts index 199c0ae1e7..9710a52b56 100644 --- a/abstractions/typescript/src/authentication/anonymousAuthenticationProvider.ts +++ b/abstractions/typescript/src/authentication/anonymousAuthenticationProvider.ts @@ -3,7 +3,7 @@ import { AuthenticationProvider } from "./authenticationProvider"; /** This authentication provider does not perform any authentication. */ export class AnonymousAuthenticationProvider implements AuthenticationProvider { - public authenticateRequest = (_: RequestInformation) : Promise => { - return Promise.resolve(); - }; -} \ No newline at end of file + public authenticateRequest = (_: RequestInformation): Promise => { + return Promise.resolve(); + }; +} diff --git a/abstractions/typescript/src/authentication/authenticationProvider.ts b/abstractions/typescript/src/authentication/authenticationProvider.ts index b3ff09a97f..91eb60c3b4 100644 --- a/abstractions/typescript/src/authentication/authenticationProvider.ts +++ b/abstractions/typescript/src/authentication/authenticationProvider.ts @@ -2,10 +2,10 @@ import { RequestInformation } from "../requestInformation"; /** Authenticates the application request. */ export interface AuthenticationProvider { - /** - * Authenticates the application and returns a token base on the provided Uri. - * @param request the request to authenticate. - * @return a Promise to await for the authentication to be completed. - */ - authenticateRequest: (request: RequestInformation) => Promise; -} \ No newline at end of file + /** + * Authenticates the application and returns a token base on the provided Uri. + * @param request the request to authenticate. + * @return a Promise to await for the authentication to be completed. + */ + authenticateRequest: (request: RequestInformation) => Promise; +} diff --git a/abstractions/typescript/src/authentication/baseBearerTokenAuthenticationProvider.ts b/abstractions/typescript/src/authentication/baseBearerTokenAuthenticationProvider.ts index 01a7382e28..7f3ddcb5b5 100644 --- a/abstractions/typescript/src/authentication/baseBearerTokenAuthenticationProvider.ts +++ b/abstractions/typescript/src/authentication/baseBearerTokenAuthenticationProvider.ts @@ -3,26 +3,26 @@ import { AuthenticationProvider } from "./authenticationProvider"; /** Provides a base class for implementing AuthenticationProvider for Bearer token scheme. */ export abstract class BaseBearerTokenAuthenticationProvider implements AuthenticationProvider { - private static readonly authorizationHeaderKey = "Authorization"; - public authenticateRequest = async (request: RequestInformation) : Promise => { - if(!request) { - throw new Error('request info cannot be null'); - } - if(!request.headers[BaseBearerTokenAuthenticationProvider.authorizationHeaderKey]) { - const token = await this.getAuthorizationToken(request); - if(!token) { - throw new Error('Could not get an authorization token'); - } - if(!request.headers) { - request.headers = {}; - } - request.headers[BaseBearerTokenAuthenticationProvider.authorizationHeaderKey] = `Bearer ${token}`; - } - } - /** - * This method is called by the BaseBearerTokenAuthenticationProvider class to authenticate the request via the returned access token. - * @param requestUrl the request to authenticate. - * @return a Promise that holds the access token to use for the request. - */ - public abstract getAuthorizationToken: (request: RequestInformation) => Promise; -} \ No newline at end of file + private static readonly authorizationHeaderKey = "Authorization"; + public authenticateRequest = async (request: RequestInformation): Promise => { + if (!request) { + throw new Error("request info cannot be null"); + } + if (!request.headers[BaseBearerTokenAuthenticationProvider.authorizationHeaderKey]) { + const token = await this.getAuthorizationToken(request); + if (!token) { + throw new Error("Could not get an authorization token"); + } + if (!request.headers) { + request.headers = {}; + } + request.headers[BaseBearerTokenAuthenticationProvider.authorizationHeaderKey] = `Bearer ${token}`; + } + }; + /** + * This method is called by the BaseBearerTokenAuthenticationProvider class to authenticate the request via the returned access token. + * @param requestUrl the request to authenticate. + * @return a Promise that holds the access token to use for the request. + */ + public abstract getAuthorizationToken: (request: RequestInformation) => Promise; +} diff --git a/abstractions/typescript/src/authentication/index.ts b/abstractions/typescript/src/authentication/index.ts index 50112d8de3..34c6fbfa02 100644 --- a/abstractions/typescript/src/authentication/index.ts +++ b/abstractions/typescript/src/authentication/index.ts @@ -1,3 +1,3 @@ -export * from './authenticationProvider'; -export * from './anonymousAuthenticationProvider'; -export * from './baseBearerTokenAuthenticationProvider'; \ No newline at end of file +export * from "./authenticationProvider"; +export * from "./anonymousAuthenticationProvider"; +export * from "./baseBearerTokenAuthenticationProvider"; diff --git a/abstractions/typescript/src/httpMethod.ts b/abstractions/typescript/src/httpMethod.ts index 9c71de293a..85cf376f58 100644 --- a/abstractions/typescript/src/httpMethod.ts +++ b/abstractions/typescript/src/httpMethod.ts @@ -1,23 +1,23 @@ -/** +/** * Represents the HTTP method used by a request. */ export enum HttpMethod { - /** The HTTP GET method */ - GET = "GET", - /** The HTTP POST method */ - POST = "POST", - /** The HTTP PATCH method */ - PATCH = "PATCH", - /** The HTTP DELETE method */ - DELETE = "DELETE", - /** The HTTP OPTIONS method */ - OPTIONS = "OPTIONS", - /** The HTTP CONNECT method */ - CONNECT = "CONNECT", - /** The HTTP TRACE method */ - TRACE = "TRACE", - /** The HTTP HEAD method */ - HEAD = "HEAD", - /** The HTTP PUT method */ - PUT = "PUT" -} \ No newline at end of file + /** The HTTP GET method */ + GET = "GET", + /** The HTTP POST method */ + POST = "POST", + /** The HTTP PATCH method */ + PATCH = "PATCH", + /** The HTTP DELETE method */ + DELETE = "DELETE", + /** The HTTP OPTIONS method */ + OPTIONS = "OPTIONS", + /** The HTTP CONNECT method */ + CONNECT = "CONNECT", + /** The HTTP TRACE method */ + TRACE = "TRACE", + /** The HTTP HEAD method */ + HEAD = "HEAD", + /** The HTTP PUT method */ + PUT = "PUT", +} diff --git a/abstractions/typescript/src/index.ts b/abstractions/typescript/src/index.ts index abaf78357e..519657a614 100644 --- a/abstractions/typescript/src/index.ts +++ b/abstractions/typescript/src/index.ts @@ -1,10 +1,17 @@ -/// +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ -export * from './apiClientBuilder'; -export * from './requestOption'; -export * from './serialization'; -export * from './store'; -export * from './utils'; +/* eslint-disable @typescript-eslint/triple-slash-reference*/ + +export * from "./apiClientBuilder"; +export * from "./requestOption"; +export * from "./serialization"; +export * from "./store"; +export * from "./utils"; export * from "./authentication"; export * from "./httpMethod"; export * from "./nativeResponseHandler"; diff --git a/abstractions/typescript/src/nativeResponseHandler.ts b/abstractions/typescript/src/nativeResponseHandler.ts index 292ecf0fcd..629066ea3c 100644 --- a/abstractions/typescript/src/nativeResponseHandler.ts +++ b/abstractions/typescript/src/nativeResponseHandler.ts @@ -2,10 +2,10 @@ import { ResponseHandler } from "./responseHandler"; /** Default response handler to access the native response object. */ export class NativeResponseHandler implements ResponseHandler { - /** Native response object as returned by the core service */ - public value?: any; - public handleResponseAsync(response: NativeResponseType): Promise { - this.value = response; - return Promise.resolve(undefined as any); - } -} \ No newline at end of file + /** Native response object as returned by the core service */ + public value?: any; + public handleResponseAsync(response: NativeResponseType): Promise { + this.value = response; + return Promise.resolve(undefined as any); + } +} diff --git a/abstractions/typescript/src/nativeResponseWrapper.ts b/abstractions/typescript/src/nativeResponseWrapper.ts index 5d2420f954..58abc48681 100644 --- a/abstractions/typescript/src/nativeResponseWrapper.ts +++ b/abstractions/typescript/src/nativeResponseWrapper.ts @@ -1,5 +1,5 @@ -import { RequestOption } from "./requestOption"; import { NativeResponseHandler } from "./nativeResponseHandler"; +import { RequestOption } from "./requestOption"; import { ResponseHandler } from "./responseHandler"; type originalCallType = (q?: queryParametersType, h?: headersType, o?: RequestOption[] | undefined, responseHandler?: ResponseHandler) => Promise; @@ -7,25 +7,14 @@ type originalCallWithBodyType( - originalCall: originalCallType, - q?: queryParametersType, - h?: headersType, - o?: RequestOption[] | undefined - ) : Promise => { - const responseHandler = new NativeResponseHandler(); - await originalCall(q, h, o, responseHandler); - return responseHandler.value as nativeResponseType; - } - public static CallAndGetNativeWithBody = async ( - originalCall: originalCallWithBodyType, - requestBody: requestBodyType, - q?: queryParametersType, - h?: headersType, - o?: RequestOption[] | undefined - ) : Promise => { - const responseHandler = new NativeResponseHandler(); - await originalCall(requestBody, q, h, o, responseHandler); - return responseHandler.value as nativeResponseType; - } -} \ No newline at end of file + public static CallAndGetNative = async (originalCall: originalCallType, q?: queryParametersType, h?: headersType, o?: RequestOption[] | undefined): Promise => { + const responseHandler = new NativeResponseHandler(); + await originalCall(q, h, o, responseHandler); + return responseHandler.value as nativeResponseType; + }; + public static CallAndGetNativeWithBody = async (originalCall: originalCallWithBodyType, requestBody: requestBodyType, q?: queryParametersType, h?: headersType, o?: RequestOption[] | undefined): Promise => { + const responseHandler = new NativeResponseHandler(); + await originalCall(requestBody, q, h, o, responseHandler); + return responseHandler.value as nativeResponseType; + }; +} diff --git a/abstractions/typescript/src/readableStreamContent.ts b/abstractions/typescript/src/readableStreamContent.ts index 980e72b501..7b72dea109 100644 --- a/abstractions/typescript/src/readableStreamContent.ts +++ b/abstractions/typescript/src/readableStreamContent.ts @@ -1,7 +1,16 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + + /* eslint-disable @typescript-eslint/no-empty-interface*/ + /** * Empty interface expecting the type of NodeJS.ReadableStream or dom ReadableStream * Node example: import {Readable} from "stream"; const readableStream = new Readable(); * Browser example: const readableStream = new ReadableStream(); */ -export interface ReadableStreamContent { } \ No newline at end of file +export interface ReadableStreamContent {} diff --git a/abstractions/typescript/src/requestAdapter.ts b/abstractions/typescript/src/requestAdapter.ts index 80fb1208fc..9fc68dda22 100644 --- a/abstractions/typescript/src/requestAdapter.ts +++ b/abstractions/typescript/src/requestAdapter.ts @@ -5,58 +5,58 @@ import { BackingStoreFactory } from "./store"; /** Service responsible for translating abstract Request Info into concrete native HTTP requests. */ export interface RequestAdapter { - /** - * Gets the serialization writer factory currently in use for the HTTP core service. - * @return the serialization writer factory currently in use for the HTTP core service. - */ - getSerializationWriterFactory(): SerializationWriterFactory; - /** - * Excutes the HTTP request specified by the given RequestInformation and returns the deserialized response model. - * @param requestInfo the request info to execute. - * @param responseHandler The response handler to use for the HTTP request instead of the default handler. - * @param type the class of the response model to deserialize the response into. - * @typeParam ModelType the type of the response model to deserialize the response into. - * @return a {@link Promise} with the deserialized response model. - */ - sendAsync(requestInfo: RequestInformation, type: new() => ModelType, responseHandler: ResponseHandler | undefined): Promise; - /** - * Excutes the HTTP request specified by the given RequestInformation and returns the deserialized response model collection. - * @param requestInfo the request info to execute. - * @param responseHandler The response handler to use for the HTTP request instead of the default handler. - * @param type the class of the response model to deserialize the response into. - * @typeParam ModelType the type of the response model to deserialize the response into. - * @return a {@link Promise} with the deserialized response model collection. - */ - sendCollectionAsync(requestInfo: RequestInformation, type: new() => ModelType, responseHandler: ResponseHandler | undefined): Promise; - /** - * Excutes the HTTP request specified by the given RequestInformation and returns the deserialized response model collection. - * @param requestInfo the request info to execute. - * @param responseType the class of the response model to deserialize the response into. - * @param responseHandler The response handler to use for the HTTP request instead of the default handler. - * @param type the class of the response model to deserialize the response into. - * @typeParam ResponseType the type of the response model to deserialize the response into. - * @return a {@link Promise} with the deserialized response model collection. - */ - sendCollectionOfPrimitiveAsync(requestInfo: RequestInformation, responseType: "string" | "number" | "boolean" | "Date", responseHandler: ResponseHandler | undefined): Promise; - /** - * Excutes the HTTP request specified by the given RequestInformation and returns the deserialized primitive response model. - * @param requestInfo the request info to execute. - * @param responseHandler The response handler to use for the HTTP request instead of the default handler. - * @param responseType the class of the response model to deserialize the response into. - * @typeParam ResponseType the type of the response model to deserialize the response into. - * @return a {@link Promise} with the deserialized primitive response model. - */ - sendPrimitiveAsync(requestInfo: RequestInformation, responseType: "string" | "number" | "boolean" | "Date" | "ReadableStream", responseHandler: ResponseHandler | undefined): Promise; - /** - * Excutes the HTTP request specified by the given RequestInformation and returns the deserialized primitive response model. - * @param requestInfo the request info to execute. - * @param responseHandler The response handler to use for the HTTP request instead of the default handler. - * @return a {@link Promise} of void. - */ - sendNoResponseContentAsync(requestInfo: RequestInformation, responseHandler: ResponseHandler | undefined): Promise; - /** - * Enables the backing store proxies for the SerializationWriters and ParseNodes in use. - * @param backingStoreFactory the backing store factory to use. - */ - enableBackingStore(backingStoreFactory?: BackingStoreFactory | undefined): void; -} \ No newline at end of file + /** + * Gets the serialization writer factory currently in use for the HTTP core service. + * @return the serialization writer factory currently in use for the HTTP core service. + */ + getSerializationWriterFactory(): SerializationWriterFactory; + /** + * Excutes the HTTP request specified by the given RequestInformation and returns the deserialized response model. + * @param requestInfo the request info to execute. + * @param responseHandler The response handler to use for the HTTP request instead of the default handler. + * @param type the class of the response model to deserialize the response into. + * @typeParam ModelType the type of the response model to deserialize the response into. + * @return a {@link Promise} with the deserialized response model. + */ + sendAsync(requestInfo: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise; + /** + * Excutes the HTTP request specified by the given RequestInformation and returns the deserialized response model collection. + * @param requestInfo the request info to execute. + * @param responseHandler The response handler to use for the HTTP request instead of the default handler. + * @param type the class of the response model to deserialize the response into. + * @typeParam ModelType the type of the response model to deserialize the response into. + * @return a {@link Promise} with the deserialized response model collection. + */ + sendCollectionAsync(requestInfo: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise; + /** + * Excutes the HTTP request specified by the given RequestInformation and returns the deserialized response model collection. + * @param requestInfo the request info to execute. + * @param responseType the class of the response model to deserialize the response into. + * @param responseHandler The response handler to use for the HTTP request instead of the default handler. + * @param type the class of the response model to deserialize the response into. + * @typeParam ResponseType the type of the response model to deserialize the response into. + * @return a {@link Promise} with the deserialized response model collection. + */ + sendCollectionOfPrimitiveAsync(requestInfo: RequestInformation, responseType: "string" | "number" | "boolean" | "Date", responseHandler: ResponseHandler | undefined): Promise; + /** + * Excutes the HTTP request specified by the given RequestInformation and returns the deserialized primitive response model. + * @param requestInfo the request info to execute. + * @param responseHandler The response handler to use for the HTTP request instead of the default handler. + * @param responseType the class of the response model to deserialize the response into. + * @typeParam ResponseType the type of the response model to deserialize the response into. + * @return a {@link Promise} with the deserialized primitive response model. + */ + sendPrimitiveAsync(requestInfo: RequestInformation, responseType: "string" | "number" | "boolean" | "Date" | "ReadableStream", responseHandler: ResponseHandler | undefined): Promise; + /** + * Excutes the HTTP request specified by the given RequestInformation and returns the deserialized primitive response model. + * @param requestInfo the request info to execute. + * @param responseHandler The response handler to use for the HTTP request instead of the default handler. + * @return a {@link Promise} of void. + */ + sendNoResponseContentAsync(requestInfo: RequestInformation, responseHandler: ResponseHandler | undefined): Promise; + /** + * Enables the backing store proxies for the SerializationWriters and ParseNodes in use. + * @param backingStoreFactory the backing store factory to use. + */ + enableBackingStore(backingStoreFactory?: BackingStoreFactory | undefined): void; +} diff --git a/abstractions/typescript/src/requestInformation.ts b/abstractions/typescript/src/requestInformation.ts index 11653dbd1e..031b5cef99 100644 --- a/abstractions/typescript/src/requestInformation.ts +++ b/abstractions/typescript/src/requestInformation.ts @@ -1,128 +1,131 @@ import { HttpMethod } from "./httpMethod"; -import { Parsable } from "./serialization"; -import { RequestOption } from "./requestOption"; +import { ReadableStreamContent } from "./readableStreamContent"; import { RequestAdapter } from "./requestAdapter"; -import {ReadableStreamContent} from "./readableStreamContent"; +import { RequestOption } from "./requestOption"; +import { Parsable } from "./serialization"; /** This class represents an abstract HTTP request. */ export class RequestInformation { - /** The URI of the request. */ - public URI?: string; - /** - * Sets the URI of the request. - * @param currentPath the current path (scheme, host, port, path, query parameters) of the request. - * @param pathSegment the segment to append to the current path. - * @param isRawUrl whether the path segment is a raw url. When true, the segment is not happened and the current path is parsed for query parameters. - */ - public setUri(currentPath: string, pathSegment: string, isRawUrl: boolean): void { - if (isRawUrl) { - const questionMarkSplat = currentPath.split('?'); - const schemeHostAndPath = questionMarkSplat[0]; - this.URI = schemeHostAndPath; - if (questionMarkSplat.length > 1) { - const queryString = questionMarkSplat[1]; - queryString ?.split('&').forEach(queryPair => { - const keyValue = queryPair.split('='); - if (keyValue.length > 0) { - const key = keyValue[0]; - if (key) { - this.queryParameters.set(key, keyValue.length > 1 ? keyValue[1] : undefined); - } - } - }); - } - } else { - this.URI = currentPath + pathSegment; - } - } - /** The HTTP method for the request */ - public httpMethod?: HttpMethod; - /** The Request Body. */ - public content?: ReadableStreamContent; - /** The Query Parameters of the request. */ - public queryParameters: Map = new Map(); //TODO: case insensitive - /** The Request Headers. */ - public headers: Record; //TODO: case insensitive + /** The URI of the request. */ + public URI?: string; + /** + * Sets the URI of the request. + * @param currentPath the current path (scheme, host, port, path, query parameters) of the request. + * @param pathSegment the segment to append to the current path. + * @param isRawUrl whether the path segment is a raw url. When true, the segment is not happened and the current path is parsed for query parameters. + */ + public setUri(currentPath: string, pathSegment: string, isRawUrl: boolean): void { + if (isRawUrl) { + const questionMarkSplat = currentPath.split("?"); + const schemeHostAndPath = questionMarkSplat[0]; + this.URI = schemeHostAndPath; + if (questionMarkSplat.length > 1) { + const queryString = questionMarkSplat[1]; + queryString?.split("&").forEach((queryPair) => { + const keyValue = queryPair.split("="); + if (keyValue.length > 0) { + const key = keyValue[0]; + if (key) { + this.queryParameters.set(key, keyValue.length > 1 ? keyValue[1] : undefined); + } + } + }); + } + } else { + this.URI = currentPath + pathSegment; + } + } + /** The HTTP method for the request */ + public httpMethod?: HttpMethod; + /** The Request Body. */ + public content?: ReadableStreamContent; + /** The Query Parameters of the request. */ + public queryParameters: Map = new Map(); //TODO: case insensitive + /** The Request Headers. */ + public headers: Record; //TODO: case insensitive - /** - * /TODO: case insensitive - * TODO: Determine the scope of request options - * Request Options should also consider specific request configurations such as : - * Axios : https://axios-http.com/docs/req_config - * Fetch Request Options : https://developer.mozilla.org/en-US/docs/Web/API/Request#properties - * https://github.com/microsoftgraph/msgraph-sdk-javascript/pull/105 - */ - private _requestOptions = new Map(); - /** Gets the request options for the request. */ - public getRequestOptions() { return this._requestOptions.values(); } - public addRequestOptions(...options: RequestOption[]) { - if (!options || options.length === 0) return; - options.forEach(option => { - this._requestOptions.set(option.getKey(), option); - }); - } - /** Removes the request options for the request. */ - public removeRequestOptions(...options: RequestOption[]) { - if (!options || options.length === 0) return; - options.forEach(option => { - this._requestOptions.delete(option.getKey()); - }); - } - private static binaryContentType = "application/octet-stream"; - private static contentTypeHeader = "Content-Type"; - /** - * Sets the request body from a model with the specified content type. - * @param values the models. - * @param contentType the content type. - * @param requestAdapter The adapter service to get the serialization writer from. - * @typeParam T the model type. - */ - public setContentFromParsable = (requestAdapter?: RequestAdapter | undefined, contentType?: string | undefined, ...values: T[]): void => { - if (!requestAdapter) throw new Error("httpCore cannot be undefined"); - if (!contentType) throw new Error("contentType cannot be undefined"); - if (!values || values.length === 0) throw new Error("values cannot be undefined or empty"); + /** + * /TODO: case insensitive + * TODO: Determine the scope of request options + * Request Options should also consider specific request configurations such as : + * Axios : https://axios-http.com/docs/req_config + * Fetch Request Options : https://developer.mozilla.org/en-US/docs/Web/API/Request#properties + * https://github.com/microsoftgraph/msgraph-sdk-javascript/pull/105 + */ + private _requestOptions = new Map(); + /** Gets the request options for the request. */ + public getRequestOptions() { + return this._requestOptions.values(); + } + public addRequestOptions(...options: RequestOption[]) { + if (!options || options.length === 0) return; + options.forEach((option) => { + this._requestOptions.set(option.getKey(), option); + }); + } + /** Removes the request options for the request. */ + public removeRequestOptions(...options: RequestOption[]) { + if (!options || options.length === 0) return; + options.forEach((option) => { + this._requestOptions.delete(option.getKey()); + }); + } + private static binaryContentType = "application/octet-stream"; + private static contentTypeHeader = "Content-Type"; + /** + * Sets the request body from a model with the specified content type. + * @param values the models. + * @param contentType the content type. + * @param requestAdapter The adapter service to get the serialization writer from. + * @typeParam T the model type. + */ + public setContentFromParsable = (requestAdapter?: RequestAdapter | undefined, contentType?: string | undefined, ...values: T[]): void => { + if (!requestAdapter) throw new Error("httpCore cannot be undefined"); + if (!contentType) throw new Error("contentType cannot be undefined"); + if (!values || values.length === 0) throw new Error("values cannot be undefined or empty"); - const writer = requestAdapter.getSerializationWriterFactory().getSerializationWriter(contentType); - if(!this.headers){ - this.headers = {}; - } - this.headers[RequestInformation.contentTypeHeader] = contentType; - if (values.length === 1) - writer.writeObjectValue(undefined, values[0]); - else - writer.writeCollectionOfObjectValues(undefined, values); - this.content = writer.getSerializedContent(); - } - /** - * Sets the request body to be a binary stream. - * @param value the binary stream - */ - public setStreamContent = (value: ReadableStreamContent): void => { - if(!this.headers){ - this.headers = {}; - } - this.headers[RequestInformation.contentTypeHeader] = RequestInformation.binaryContentType; - this.content = value; - } - /** - * Sets the request headers from a raw object. - * @param headers the headers. - */ - public setHeadersFromRawObject = (h: object): void => { - if(!this.headers){ - this.headers = {}; - } - Object.entries(h).forEach(([k, v]) => { - this.headers[k] = v as string; - }); - } - /** - * Sets the query string parameters from a raw object. - * @param parameters the parameters. - */ - public setQueryStringParametersFromRawObject = (q: object): void => { - Object.entries(q).forEach(([k, v]) => { - this.queryParameters.set(k, v as string); - }); - } -} \ No newline at end of file + const writer = requestAdapter.getSerializationWriterFactory().getSerializationWriter(contentType); + if (!this.headers) { + this.headers = {}; + } + this.headers[RequestInformation.contentTypeHeader] = contentType; + if (values.length === 1) { + writer.writeObjectValue(undefined, values[0]); + } else { + writer.writeCollectionOfObjectValues(undefined, values); + } + this.content = writer.getSerializedContent(); + }; + /** + * Sets the request body to be a binary stream. + * @param value the binary stream + */ + public setStreamContent = (value: ReadableStreamContent): void => { + if (!this.headers) { + this.headers = {}; + } + this.headers[RequestInformation.contentTypeHeader] = RequestInformation.binaryContentType; + this.content = value; + }; + /** + * Sets the request headers from a raw object. + * @param headers the headers. + */ + public setHeadersFromRawObject = (h: object): void => { + if (!this.headers) { + this.headers = {}; + } + Object.entries(h).forEach(([k, v]) => { + this.headers[k] = v as string; + }); + }; + /** + * Sets the query string parameters from a raw object. + * @param parameters the parameters. + */ + public setQueryStringParametersFromRawObject = (q: object): void => { + Object.entries(q).forEach(([k, v]) => { + this.queryParameters.set(k, v as string); + }); + }; +} diff --git a/abstractions/typescript/src/requestOption.ts b/abstractions/typescript/src/requestOption.ts index 8c847aae13..7fa88bf825 100644 --- a/abstractions/typescript/src/requestOption.ts +++ b/abstractions/typescript/src/requestOption.ts @@ -1,5 +1,5 @@ /** Represents a request option. */ export interface RequestOption { - /** Gets the option key for when adding it to a request. Must be unique. */ - getKey(): string; -} \ No newline at end of file + /** Gets the option key for when adding it to a request. Must be unique. */ + getKey(): string; +} diff --git a/abstractions/typescript/src/responseHandler.ts b/abstractions/typescript/src/responseHandler.ts index 50fbd0a50f..5211b68c49 100644 --- a/abstractions/typescript/src/responseHandler.ts +++ b/abstractions/typescript/src/responseHandler.ts @@ -1,11 +1,11 @@ /** Defines the contract for a response handler. */ export interface ResponseHandler { - /** - * Callback method that is invoked when a response is received. - * @param response The native response object. - * @typeParam NativeResponseType The type of the native response object. - * @typeParam ModelType The type of the response model object. - * @return A {@link Promise} that represents the asynchronous operation and contains the deserialized response. - */ - handleResponseAsync(response: NativeResponseType): Promise; -} \ No newline at end of file + /** + * Callback method that is invoked when a response is received. + * @param response The native response object. + * @typeParam NativeResponseType The type of the native response object. + * @typeParam ModelType The type of the response model object. + * @return A {@link Promise} that represents the asynchronous operation and contains the deserialized response. + */ + handleResponseAsync(response: NativeResponseType): Promise; +} diff --git a/abstractions/typescript/src/serialization/index.ts b/abstractions/typescript/src/serialization/index.ts index 04bcc5c7ea..54c0282e82 100644 --- a/abstractions/typescript/src/serialization/index.ts +++ b/abstractions/typescript/src/serialization/index.ts @@ -1,9 +1,9 @@ -export * from './parsable'; -export * from './parseNode'; -export * from './parseNodeFactory'; -export * from './parseNodeFactoryRegistry'; -export * from './parseNodeProxyFactory'; -export * from './serializationWriter'; -export * from './serializationWriterFactory'; -export * from './serializationWriterFactoryRegistry'; -export * from './serializationWriterProxyFactory'; \ No newline at end of file +export * from "./parsable"; +export * from "./parseNode"; +export * from "./parseNodeFactory"; +export * from "./parseNodeFactoryRegistry"; +export * from "./parseNodeProxyFactory"; +export * from "./serializationWriter"; +export * from "./serializationWriterFactory"; +export * from "./serializationWriterFactoryRegistry"; +export * from "./serializationWriterProxyFactory"; diff --git a/abstractions/typescript/src/serialization/parsable.ts b/abstractions/typescript/src/serialization/parsable.ts index 0fddd35bed..06fd388c1b 100644 --- a/abstractions/typescript/src/serialization/parsable.ts +++ b/abstractions/typescript/src/serialization/parsable.ts @@ -1,23 +1,23 @@ -import { ParseNode } from './parseNode'; -import { SerializationWriter } from './serializationWriter'; +import { ParseNode } from "./parseNode"; +import { SerializationWriter } from "./serializationWriter"; /** * Defines a serializable model object. */ export interface Parsable { - /** - * Gets the deserialization information for this object. - * @return The deserialization information for this object where each entry is a property key with its deserialization callback. - */ - getFieldDeserializers(): Map void>; - /** - * Writes the objects properties to the current writer. - * @param writer The writer to write to. - */ - serialize(writer: SerializationWriter): void; - /** - * Gets the additional data for this object that did not belong to the properties. - * @return The additional data for this object. - */ - additionalData: Map; -} \ No newline at end of file + /** + * Gets the deserialization information for this object. + * @return The deserialization information for this object where each entry is a property key with its deserialization callback. + */ + getFieldDeserializers(): Map void>; + /** + * Writes the objects properties to the current writer. + * @param writer The writer to write to. + */ + serialize(writer: SerializationWriter): void; + /** + * Gets the additional data for this object that did not belong to the properties. + * @return The additional data for this object. + */ + additionalData: Map; +} diff --git a/abstractions/typescript/src/serialization/parseNode.ts b/abstractions/typescript/src/serialization/parseNode.ts index cdb52a0818..02f8c4c5d4 100644 --- a/abstractions/typescript/src/serialization/parseNode.ts +++ b/abstractions/typescript/src/serialization/parseNode.ts @@ -4,70 +4,70 @@ import { Parsable } from "./parsable"; * Interface for a deserialization node in a parse tree. This interace provides an abstraction layer over serialiation formats, libararies and implementations. */ export interface ParseNode { - /** - * Gets the string value of the node. - * @return the string value of the node. - */ - getStringValue(): string; - /** - * Gets a new parse node for the given identifier. - * @param identitier the identifier of the current node property. - * @return a new parse node for the given identifier. - */ - getChildNode(identifier: string): ParseNode; - /** - * Gets the boolean value of the node. - * @return the boolean value of the node. - */ - getBooleanValue(): boolean; - /** - * Gets the Number value of the node. - * @return the Number value of the node. - */ - getNumberValue(): number; - /** - * Gets the Guid value of the node. - * @return the Guid value of the node. - */ - getGuidValue(): string; //TODO https://www.npmjs.com/package/guid-typescript - /** - * Gets the Date value of the node. - * @return the Date value of the node. - */ - getDateValue(): Date; - /** - * Gets the collection of primitive values of the node. - * @return the collection of primitive values of the node. - */ - getCollectionOfPrimitiveValues(): T[] | undefined; - /** - * Gets the collection of object values of the node. - * @return the collection of object values of the node. - */ - getCollectionOfObjectValues(type: new() => T): T[] | undefined; - /** - * Gets the model object value of the node. - * @return the model object value of the node. - */ - getObjectValue(type: new() => T): T; - /** - * Gets the Enum values of the node. - * @return the Enum values of the node. - */ - getEnumValues(type: any): T[]; - /** - * Gets the Enum value of the node. - * @return the Enum value of the node. - */ - getEnumValue(type: any): T | undefined; - /** - * Gets the callback called before the node is deserialized. - * @return the callback called before the node is deserialized. - */ - onBeforeAssignFieldValues: ((value: Parsable) => void) | undefined; - /** - * Gets the callback called after the node is deseserialized. - * @return the callback called after the node is deserialized. - */ - onAfterAssignFieldValues: ((value: Parsable) => void) | undefined; -} \ No newline at end of file + /** + * Gets the string value of the node. + * @return the string value of the node. + */ + getStringValue(): string; + /** + * Gets a new parse node for the given identifier. + * @param identitier the identifier of the current node property. + * @return a new parse node for the given identifier. + */ + getChildNode(identifier: string): ParseNode; + /** + * Gets the boolean value of the node. + * @return the boolean value of the node. + */ + getBooleanValue(): boolean; + /** + * Gets the Number value of the node. + * @return the Number value of the node. + */ + getNumberValue(): number; + /** + * Gets the Guid value of the node. + * @return the Guid value of the node. + */ + getGuidValue(): string; //TODO https://www.npmjs.com/package/guid-typescript + /** + * Gets the Date value of the node. + * @return the Date value of the node. + */ + getDateValue(): Date; + /** + * Gets the collection of primitive values of the node. + * @return the collection of primitive values of the node. + */ + getCollectionOfPrimitiveValues(): T[] | undefined; + /** + * Gets the collection of object values of the node. + * @return the collection of object values of the node. + */ + getCollectionOfObjectValues(type: new () => T): T[] | undefined; + /** + * Gets the model object value of the node. + * @return the model object value of the node. + */ + getObjectValue(type: new () => T): T; + /** + * Gets the Enum values of the node. + * @return the Enum values of the node. + */ + getEnumValues(type: any): T[]; + /** + * Gets the Enum value of the node. + * @return the Enum value of the node. + */ + getEnumValue(type: any): T | undefined; + /** + * Gets the callback called before the node is deserialized. + * @return the callback called before the node is deserialized. + */ + onBeforeAssignFieldValues: ((value: Parsable) => void) | undefined; + /** + * Gets the callback called after the node is deseserialized. + * @return the callback called after the node is deserialized. + */ + onAfterAssignFieldValues: ((value: Parsable) => void) | undefined; +} diff --git a/abstractions/typescript/src/serialization/parseNodeFactory.ts b/abstractions/typescript/src/serialization/parseNodeFactory.ts index 25bfde63aa..3f09054cc4 100644 --- a/abstractions/typescript/src/serialization/parseNodeFactory.ts +++ b/abstractions/typescript/src/serialization/parseNodeFactory.ts @@ -1,18 +1,18 @@ -import { ParseNode } from './parseNode'; +import { ParseNode } from "./parseNode"; /** * Defines the contract for a factory that is used to create {@link ParseNode}s. */ export interface ParseNodeFactory { - /** - * Returns the content type this factory's parse nodes can deserialize. - */ - getValidContentType(): string; - /** - * Creates a {@link ParseNode} from the given {@link ArrayBuffer} and content type. - * @param content the {@link ArrayBuffer} to read from. - * @param contentType the content type of the {@link ArrayBuffer}. - * @return a {@link ParseNode} that can deserialize the given {@link ArrayBuffer}. - */ - getRootParseNode(contentType: string, content: ArrayBuffer): ParseNode; -} \ No newline at end of file + /** + * Returns the content type this factory's parse nodes can deserialize. + */ + getValidContentType(): string; + /** + * Creates a {@link ParseNode} from the given {@link ArrayBuffer} and content type. + * @param content the {@link ArrayBuffer} to read from. + * @param contentType the content type of the {@link ArrayBuffer}. + * @return a {@link ParseNode} that can deserialize the given {@link ArrayBuffer}. + */ + getRootParseNode(contentType: string, content: ArrayBuffer): ParseNode; +} diff --git a/abstractions/typescript/src/serialization/parseNodeFactoryRegistry.ts b/abstractions/typescript/src/serialization/parseNodeFactoryRegistry.ts index 4a6a4cef19..bdff9793bd 100644 --- a/abstractions/typescript/src/serialization/parseNodeFactoryRegistry.ts +++ b/abstractions/typescript/src/serialization/parseNodeFactoryRegistry.ts @@ -5,26 +5,25 @@ import { ParseNodeFactory } from "./parseNodeFactory"; * This factory holds a list of all the registered factories for the various types of nodes. */ export class ParseNodeFactoryRegistry implements ParseNodeFactory { - /** Default singleton instance of the registry to be used when registring new factories that should be available by default. */ - public static readonly defaultInstance = new ParseNodeFactoryRegistry(); - public getValidContentType(): string { - throw new Error("The registry supports multiple content types. Get the registered factory instead."); - } - /** List of factories that are registered by content type. */ - public contentTypeAssociatedFactories = new Map(); - public getRootParseNode(contentType: string, content: ArrayBuffer): ParseNode { - if(!contentType) { - throw new Error("content type cannot be undefined or empty"); - } - if(!content) { - throw new Error("content cannot be undefined or empty"); - } - const factory = this.contentTypeAssociatedFactories.get(contentType); - if(factory) { - return factory.getRootParseNode(contentType, content); - } else { - throw new Error(`Content type ${contentType} does not have a factory registered to be parsed`); - } - } - -} \ No newline at end of file + /** Default singleton instance of the registry to be used when registring new factories that should be available by default. */ + public static readonly defaultInstance = new ParseNodeFactoryRegistry(); + public getValidContentType(): string { + throw new Error("The registry supports multiple content types. Get the registered factory instead."); + } + /** List of factories that are registered by content type. */ + public contentTypeAssociatedFactories = new Map(); + public getRootParseNode(contentType: string, content: ArrayBuffer): ParseNode { + if (!contentType) { + throw new Error("content type cannot be undefined or empty"); + } + if (!content) { + throw new Error("content cannot be undefined or empty"); + } + const factory = this.contentTypeAssociatedFactories.get(contentType); + if (factory) { + return factory.getRootParseNode(contentType, content); + } else { + throw new Error(`Content type ${contentType} does not have a factory registered to be parsed`); + } + } +} diff --git a/abstractions/typescript/src/serialization/parseNodeProxyFactory.ts b/abstractions/typescript/src/serialization/parseNodeProxyFactory.ts index 7387df2f44..836e9bd124 100644 --- a/abstractions/typescript/src/serialization/parseNodeProxyFactory.ts +++ b/abstractions/typescript/src/serialization/parseNodeProxyFactory.ts @@ -4,34 +4,32 @@ import { ParseNodeFactory } from "./parseNodeFactory"; /** Proxy factory that allows the composition of before and after callbacks on existing factories. */ export abstract class ParseNodeProxyFactory implements ParseNodeFactory { - public getValidContentType(): string { - return this._concrete.getValidContentType(); - } - /** - * Creates a new proxy factory that wraps the specified concrete factory while composing the before and after callbacks. - * @param _concrete the concrete factory to wrap - * @param _onBefore the callback to invoke before the deserialization of any model object. - * @param _onAfter the callback to invoke after the deserialization of any model object. - */ - constructor(private readonly _concrete: ParseNodeFactory, - private readonly _onBefore: (value: Parsable) => void, - private readonly _onAfter: (value: Parsable) => void) { - if(!_concrete) - throw new Error("_concrete cannot be undefined"); - } - public getRootParseNode(contentType: string, content: ArrayBuffer): ParseNode { - const node = this._concrete.getRootParseNode(contentType, content); - var originalBefore = node.onBeforeAssignFieldValues; - var originalAfter = node.onAfterAssignFieldValues; - node.onBeforeAssignFieldValues = (value) => { - this._onBefore && this._onBefore(value); - originalBefore && originalBefore(value); - }; - node.onAfterAssignFieldValues = (value) => { - this._onAfter && this._onAfter(value); - originalAfter && originalAfter(value); - }; - return node; - } - -} \ No newline at end of file + public getValidContentType(): string { + return this._concrete.getValidContentType(); + } + /** + * Creates a new proxy factory that wraps the specified concrete factory while composing the before and after callbacks. + * @param _concrete the concrete factory to wrap + * @param _onBefore the callback to invoke before the deserialization of any model object. + * @param _onAfter the callback to invoke after the deserialization of any model object. + */ + constructor(private readonly _concrete: ParseNodeFactory, private readonly _onBefore: (value: Parsable) => void, private readonly _onAfter: (value: Parsable) => void) { + if (!_concrete) { + throw new Error("_concrete cannot be undefined"); + } + } + public getRootParseNode(contentType: string, content: ArrayBuffer): ParseNode { + const node = this._concrete.getRootParseNode(contentType, content); + const originalBefore = node.onBeforeAssignFieldValues; + const originalAfter = node.onAfterAssignFieldValues; + node.onBeforeAssignFieldValues = (value) => { + this._onBefore && this._onBefore(value); + originalBefore && originalBefore(value); + }; + node.onAfterAssignFieldValues = (value) => { + this._onAfter && this._onAfter(value); + originalAfter && originalAfter(value); + }; + return node; + } +} diff --git a/abstractions/typescript/src/serialization/serializationWriter.ts b/abstractions/typescript/src/serialization/serializationWriter.ts index 1ac7eba86a..e3b6a1d030 100644 --- a/abstractions/typescript/src/serialization/serializationWriter.ts +++ b/abstractions/typescript/src/serialization/serializationWriter.ts @@ -1,90 +1,91 @@ +import { ReadableStreamContent } from "../readableStreamContent"; import { Parsable } from "./parsable"; /** Defines an interface for serialization of objects to a stream. */ export interface SerializationWriter { - /** - * Writes the specified string value to the stream with an optional given key. - * @param key the key to write the value with. - * @param value the value to write to the stream. - */ - writeStringValue(key?: string | undefined, value?: string | undefined): void; - /** - * Writes the specified boolean value to the stream with an optional given key. - * @param key the key to write the value with. - * @param value the value to write to the stream. - */ - writeBooleanValue(key?: string | undefined, value?: boolean | undefined): void; - /** - * Writes the specified number value to the stream with an optional given key. - * @param key the key to write the value with. - * @param value the value to write to the stream. - */ - writeNumberValue(key?: string | undefined, value?: number | undefined): void; - /** - * Writes the specified Guid value to the stream with an optional given key. - * @param key the key to write the value with. - * @param value the value to write to the stream. - */ - writeGuidValue(key?: string | undefined, value?: string | undefined): void; - /** - * Writes the specified Date value to the stream with an optional given key. - * @param key the key to write the value with. - * @param value the value to write to the stream. - */ - writeDateValue(key?: string | undefined, value?: Date | undefined): void; - /** - * Writes the specified collection of primitive values to the stream with an optional given key. - * @param key the key to write the value with. - * @param value the value to write to the stream. - */ - writeCollectionOfPrimitiveValues(key?: string | undefined, values?: T[] | undefined): void; - /** - * Writes the specified collection of object values to the stream with an optional given key. - * @param key the key to write the value with. - * @param value the value to write to the stream. - */ - writeCollectionOfObjectValues(key?: string | undefined, values?: T[]): void; - /** - * Writes the specified model object value to the stream with an optional given key. - * @param key the key to write the value with. - * @param value the value to write to the stream. - */ - writeObjectValue(key?: string | undefined, value?: T | undefined): void; - /** - * Writes the specified enum value to the stream with an optional given key. - * @param key the key to write the value with. - * @param values the value to write to the stream. - */ - writeEnumValue(key?: string | undefined, ...values: (T | undefined)[]): void; - /** - * Writes a null value for the specified key. - * @param key the key to write the value with. - */ - writeNullValue(key?: string | undefined) : void; - /** - * Gets the value of the serialized content. - * @return the value of the serialized content. - */ - getSerializedContent(): ReadableStream; + /** + * Writes the specified string value to the stream with an optional given key. + * @param key the key to write the value with. + * @param value the value to write to the stream. + */ + writeStringValue(key?: string | undefined, value?: string | undefined): void; + /** + * Writes the specified boolean value to the stream with an optional given key. + * @param key the key to write the value with. + * @param value the value to write to the stream. + */ + writeBooleanValue(key?: string | undefined, value?: boolean | undefined): void; + /** + * Writes the specified number value to the stream with an optional given key. + * @param key the key to write the value with. + * @param value the value to write to the stream. + */ + writeNumberValue(key?: string | undefined, value?: number | undefined): void; + /** + * Writes the specified Guid value to the stream with an optional given key. + * @param key the key to write the value with. + * @param value the value to write to the stream. + */ + writeGuidValue(key?: string | undefined, value?: string | undefined): void; + /** + * Writes the specified Date value to the stream with an optional given key. + * @param key the key to write the value with. + * @param value the value to write to the stream. + */ + writeDateValue(key?: string | undefined, value?: Date | undefined): void; + /** + * Writes the specified collection of primitive values to the stream with an optional given key. + * @param key the key to write the value with. + * @param value the value to write to the stream. + */ + writeCollectionOfPrimitiveValues(key?: string | undefined, values?: T[] | undefined): void; + /** + * Writes the specified collection of object values to the stream with an optional given key. + * @param key the key to write the value with. + * @param value the value to write to the stream. + */ + writeCollectionOfObjectValues(key?: string | undefined, values?: T[]): void; + /** + * Writes the specified model object value to the stream with an optional given key. + * @param key the key to write the value with. + * @param value the value to write to the stream. + */ + writeObjectValue(key?: string | undefined, value?: T | undefined): void; + /** + * Writes the specified enum value to the stream with an optional given key. + * @param key the key to write the value with. + * @param values the value to write to the stream. + */ + writeEnumValue(key?: string | undefined, ...values: (T | undefined)[]): void; + /** + * Writes a null value for the specified key. + * @param key the key to write the value with. + */ + writeNullValue(key?: string | undefined): void; + /** + * Gets the value of the serialized content. + * @return the value of the serialized content. + */ + getSerializedContent(): ReadableStreamContent; - /** - * Writes the specified additional data values to the stream with an optional given key. - * @param value the values to write to the stream. - */ - writeAdditionalData(value: Map): void; - /** - * Gets the callback called before the object gets serialized. - * @return the callback called before the object gets serialized. - */ - onBeforeObjectSerialization: ((value: Parsable) => void) | undefined; - /** - * Gets the callback called after the object gets serialized. - * @return the callback called after the object gets serialized. - */ - onAfterObjectSerialization: ((value: Parsable) => void) | undefined; - /** - * Gets the callback called right after the serialization process starts. - * @return the callback called right after the serialization process starts. - */ - onStartObjectSerialization: ((value: Parsable, writer: SerializationWriter) => void) | undefined; -} \ No newline at end of file + /** + * Writes the specified additional data values to the stream with an optional given key. + * @param value the values to write to the stream. + */ + writeAdditionalData(value: Map): void; + /** + * Gets the callback called before the object gets serialized. + * @return the callback called before the object gets serialized. + */ + onBeforeObjectSerialization: ((value: Parsable) => void) | undefined; + /** + * Gets the callback called after the object gets serialized. + * @return the callback called after the object gets serialized. + */ + onAfterObjectSerialization: ((value: Parsable) => void) | undefined; + /** + * Gets the callback called right after the serialization process starts. + * @return the callback called right after the serialization process starts. + */ + onStartObjectSerialization: ((value: Parsable, writer: SerializationWriter) => void) | undefined; +} diff --git a/abstractions/typescript/src/serialization/serializationWriterFactory.ts b/abstractions/typescript/src/serialization/serializationWriterFactory.ts index 60980de43a..a3a51d7c03 100644 --- a/abstractions/typescript/src/serialization/serializationWriterFactory.ts +++ b/abstractions/typescript/src/serialization/serializationWriterFactory.ts @@ -1,16 +1,16 @@ -import { SerializationWriter } from './serializationWriter'; +import { SerializationWriter } from "./serializationWriter"; /** Defines the contract for a factory that creates SerializationWriter instances. */ export interface SerializationWriterFactory { - /** - * Gets the content type this factory creates serialization writers for. - * @return the content type this factory creates serialization writers for. - */ - getValidContentType(): string; - /** - * Creates a new SerializationWriter instance for the given content type. - * @param contentType the content type to create a serialization writer for. - * @return a new SerializationWriter instance for the given content type. - */ - getSerializationWriter(contentType: string): SerializationWriter; -} \ No newline at end of file + /** + * Gets the content type this factory creates serialization writers for. + * @return the content type this factory creates serialization writers for. + */ + getValidContentType(): string; + /** + * Creates a new SerializationWriter instance for the given content type. + * @param contentType the content type to create a serialization writer for. + * @return a new SerializationWriter instance for the given content type. + */ + getSerializationWriter(contentType: string): SerializationWriter; +} diff --git a/abstractions/typescript/src/serialization/serializationWriterFactoryRegistry.ts b/abstractions/typescript/src/serialization/serializationWriterFactoryRegistry.ts index 13e564fa65..758f759eec 100644 --- a/abstractions/typescript/src/serialization/serializationWriterFactoryRegistry.ts +++ b/abstractions/typescript/src/serialization/serializationWriterFactoryRegistry.ts @@ -3,23 +3,22 @@ import { SerializationWriterFactory } from "./serializationWriterFactory"; /** This factory holds a list of all the registered factories for the various types of nodes. */ export class SerializationWriterFactoryRegistry implements SerializationWriterFactory { - /** Default singleton instance of the registry to be used when registring new factories that should be available by default. */ - public static readonly defaultInstance = new SerializationWriterFactoryRegistry(); - public getValidContentType(): string { - throw new Error("The registry supports multiple content types. Get the registered factory instead."); - } - /** List of factories that are registered by content type. */ - public contentTypeAssociatedFactories = new Map(); - public getSerializationWriter(contentType: string): SerializationWriter { - if(!contentType) { - throw new Error("content type cannot be undefined or empty"); - } - const factory = this.contentTypeAssociatedFactories.get(contentType); - if(factory) { - return factory.getSerializationWriter(contentType); - } else { - throw new Error(`Content type ${contentType} does not have a factory registered to be serialized`); - } - } - -} \ No newline at end of file + /** Default singleton instance of the registry to be used when registring new factories that should be available by default. */ + public static readonly defaultInstance = new SerializationWriterFactoryRegistry(); + public getValidContentType(): string { + throw new Error("The registry supports multiple content types. Get the registered factory instead."); + } + /** List of factories that are registered by content type. */ + public contentTypeAssociatedFactories = new Map(); + public getSerializationWriter(contentType: string): SerializationWriter { + if (!contentType) { + throw new Error("content type cannot be undefined or empty"); + } + const factory = this.contentTypeAssociatedFactories.get(contentType); + if (factory) { + return factory.getSerializationWriter(contentType); + } else { + throw new Error(`Content type ${contentType} does not have a factory registered to be serialized`); + } + } +} diff --git a/abstractions/typescript/src/serialization/serializationWriterProxyFactory.ts b/abstractions/typescript/src/serialization/serializationWriterProxyFactory.ts index 5b39613b8f..b2925594aa 100644 --- a/abstractions/typescript/src/serialization/serializationWriterProxyFactory.ts +++ b/abstractions/typescript/src/serialization/serializationWriterProxyFactory.ts @@ -4,41 +4,38 @@ import { SerializationWriterFactory } from "./serializationWriterFactory"; /** Proxy factory that allows the composition of before and after callbacks on existing factories. */ export abstract class SerializationWriterProxyFactory implements SerializationWriterFactory { - public getValidContentType(): string { - return this._concrete.getValidContentType(); - } - /** - * Creates a new proxy factory that wraps the specified concrete factory while composing the before and after callbacks. - * @param _concrete the concrete factory to wrap - * @param _onBefore the callback to invoke before the serialization of any model object. - * @param _onAfter the callback to invoke after the serialization of any model object. - * @param _onStart the callback to invoke when the serialization of a model object starts - */ - constructor(private readonly _concrete: SerializationWriterFactory, - private readonly _onBefore?: ((value: Parsable) => void) | undefined, - private readonly _onAfter?: ((value: Parsable) => void) | undefined, - private readonly _onStart?: ((value: Parsable, writer: SerializationWriter) => void) | undefined) { - if(!_concrete) - throw new Error("_concrete cannot be undefined"); - } - public getSerializationWriter(contentType: string): SerializationWriter { - const writer = this._concrete.getSerializationWriter(contentType); - const originalBefore = writer.onBeforeObjectSerialization; - const originalAfter = writer.onAfterObjectSerialization; - const originalStart = writer.onStartObjectSerialization; - writer.onBeforeObjectSerialization = (value) => { - this._onBefore && this._onBefore(value); - originalBefore && originalBefore(value); - } - writer.onAfterObjectSerialization = (value) => { - this._onAfter && this._onAfter(value); - originalAfter && originalAfter(value); - } - writer.onStartObjectSerialization = (value, writer) => { - this._onStart && this._onStart(value, writer); - originalStart && originalStart(value, writer); - } - return writer; - } - -} \ No newline at end of file + public getValidContentType(): string { + return this._concrete.getValidContentType(); + } + /** + * Creates a new proxy factory that wraps the specified concrete factory while composing the before and after callbacks. + * @param _concrete the concrete factory to wrap + * @param _onBefore the callback to invoke before the serialization of any model object. + * @param _onAfter the callback to invoke after the serialization of any model object. + * @param _onStart the callback to invoke when the serialization of a model object starts + */ + constructor(private readonly _concrete: SerializationWriterFactory, private readonly _onBefore?: ((value: Parsable) => void) | undefined, private readonly _onAfter?: ((value: Parsable) => void) | undefined, private readonly _onStart?: ((value: Parsable, writer: SerializationWriter) => void) | undefined) { + if (!_concrete) { + throw new Error("_concrete cannot be undefined"); + } + } + public getSerializationWriter(contentType: string): SerializationWriter { + const writer = this._concrete.getSerializationWriter(contentType); + const originalBefore = writer.onBeforeObjectSerialization; + const originalAfter = writer.onAfterObjectSerialization; + const originalStart = writer.onStartObjectSerialization; + writer.onBeforeObjectSerialization = (value) => { + this._onBefore && this._onBefore(value); + originalBefore && originalBefore(value); + }; + writer.onAfterObjectSerialization = (value) => { + this._onAfter && this._onAfter(value); + originalAfter && originalAfter(value); + }; + writer.onStartObjectSerialization = (value, writer) => { + this._onStart && this._onStart(value, writer); + originalStart && originalStart(value, writer); + }; + return writer; + } +} diff --git a/abstractions/typescript/src/shims.d.ts b/abstractions/typescript/src/shims.d.ts deleted file mode 100644 index cb6c10a33b..0000000000 --- a/abstractions/typescript/src/shims.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -interface Request { } -interface RequestInit { } -interface Response { } -interface Headers { } -interface ReadableStream { } diff --git a/abstractions/typescript/src/store/backedModel.ts b/abstractions/typescript/src/store/backedModel.ts index 571154c699..6bdd6d3109 100644 --- a/abstractions/typescript/src/store/backedModel.ts +++ b/abstractions/typescript/src/store/backedModel.ts @@ -2,8 +2,8 @@ import { BackingStore } from "./backingStore"; /** Defines the contracts for a model that is backed by a store. */ export interface BackedModel { - /** - * Gets the store that is backing the model. - */ - backingStore: BackingStore; -} \ No newline at end of file + /** + * Gets the store that is backing the model. + */ + backingStore: BackingStore; +} diff --git a/abstractions/typescript/src/store/backingStore.ts b/abstractions/typescript/src/store/backingStore.ts index 09715b898a..419084fe2d 100644 --- a/abstractions/typescript/src/store/backingStore.ts +++ b/abstractions/typescript/src/store/backingStore.ts @@ -1,52 +1,52 @@ /** -* Stores model information in a different location than the object properties. Implementations can provide dirty tracking capabilities, caching capabilities or integration with 3rd party stores. -*/ + * Stores model information in a different location than the object properties. Implementations can provide dirty tracking capabilities, caching capabilities or integration with 3rd party stores. + */ export interface BackingStore { - /** - * Gets a value from the backing store based on its key. Returns null if the value hasn't changed and "ReturnOnlyChangedValues" is true. - * @return The value from the backing store. - * @param key The key to lookup the backing store with. - */ - get(key: string): T | undefined; - /** - * Sets or updates the stored value for the given key. - * Will trigger subscriptions callbacks. - * @param key The key to store and retrieve the information. - * @param value The value to be stored. - */ - set(key: string, value: T): void; - /** - * Enumerates all the values stored in the backing store. Values will be filtered if "ReturnOnlyChangedValues" is true. - * @return The values available in the backing store. - */ - enumerate(): {key: string, value: unknown}[]; - /** - * Enumerates the keys for all values that changed to null. - * @return The keys for the values that changed to null. - */ - enumerateKeysForValuesChangedToNull(): string[]; - /** - * Creates a subscription to any data change happening. - * @param callback Callback to be invoked on data changes where the first parameter is the data key, the second the previous value and the third the new value. - * @param subscriptionId The subscription Id to use. - * @return The subscription Id to use when removing the subscription - */ - subscribe(callback:() => {key: string, previousValue: unknown, newValue: unknown}, subscriptionId?: string | undefined): string; - /** - * Removes a subscription from the store based on its subscription id. - * @param subscriptionId The Id of the subscription to remove. - */ - unsubscribe(subscriptionId: string): void; - /** - * Clears the data stored in the backing store. Doesn't trigger any subscription. - */ - clear(): void; - /** - * Whether the initialization of the object and/or the initial deserialization has been completed to track whether objects have changed. - */ - initializationCompleted: boolean; - /** - * Whether to return only values that have changed since the initialization of the object when calling the Get and Enumerate methods. - */ - returnOnlyChangedValues: boolean; -} \ No newline at end of file + /** + * Gets a value from the backing store based on its key. Returns null if the value hasn't changed and "ReturnOnlyChangedValues" is true. + * @return The value from the backing store. + * @param key The key to lookup the backing store with. + */ + get(key: string): T | undefined; + /** + * Sets or updates the stored value for the given key. + * Will trigger subscriptions callbacks. + * @param key The key to store and retrieve the information. + * @param value The value to be stored. + */ + set(key: string, value: T): void; + /** + * Enumerates all the values stored in the backing store. Values will be filtered if "ReturnOnlyChangedValues" is true. + * @return The values available in the backing store. + */ + enumerate(): { key: string; value: unknown }[]; + /** + * Enumerates the keys for all values that changed to null. + * @return The keys for the values that changed to null. + */ + enumerateKeysForValuesChangedToNull(): string[]; + /** + * Creates a subscription to any data change happening. + * @param callback Callback to be invoked on data changes where the first parameter is the data key, the second the previous value and the third the new value. + * @param subscriptionId The subscription Id to use. + * @return The subscription Id to use when removing the subscription + */ + subscribe(callback: () => { key: string; previousValue: unknown; newValue: unknown }, subscriptionId?: string | undefined): string; + /** + * Removes a subscription from the store based on its subscription id. + * @param subscriptionId The Id of the subscription to remove. + */ + unsubscribe(subscriptionId: string): void; + /** + * Clears the data stored in the backing store. Doesn't trigger any subscription. + */ + clear(): void; + /** + * Whether the initialization of the object and/or the initial deserialization has been completed to track whether objects have changed. + */ + initializationCompleted: boolean; + /** + * Whether to return only values that have changed since the initialization of the object when calling the Get and Enumerate methods. + */ + returnOnlyChangedValues: boolean; +} diff --git a/abstractions/typescript/src/store/backingStoreFactory.ts b/abstractions/typescript/src/store/backingStoreFactory.ts index 5803451d85..9378d8b423 100644 --- a/abstractions/typescript/src/store/backingStoreFactory.ts +++ b/abstractions/typescript/src/store/backingStoreFactory.ts @@ -2,9 +2,9 @@ import { BackingStore } from "./backingStore"; /** Defines the contract for a factory that creates backing stores. */ export interface BackingStoreFactory { - /** - * Creates a new instance of the backing store. - * @return a new instance of the backing store. - */ - createBackingStore(): BackingStore; -} \ No newline at end of file + /** + * Creates a new instance of the backing store. + * @return a new instance of the backing store. + */ + createBackingStore(): BackingStore; +} diff --git a/abstractions/typescript/src/store/backingStoreFactorySingleton.ts b/abstractions/typescript/src/store/backingStoreFactorySingleton.ts index 68829335e8..8aeb2e7dde 100644 --- a/abstractions/typescript/src/store/backingStoreFactorySingleton.ts +++ b/abstractions/typescript/src/store/backingStoreFactorySingleton.ts @@ -2,5 +2,5 @@ import { BackingStoreFactory } from "./backingStoreFactory"; import { InMemoryBackingStoreFactory } from "./inMemoryBackingStoreFactory"; export class BackingStoreFactorySingleton { - public static instance: BackingStoreFactory = new InMemoryBackingStoreFactory(); -} \ No newline at end of file + public static instance: BackingStoreFactory = new InMemoryBackingStoreFactory(); +} diff --git a/abstractions/typescript/src/store/backingStoreParseNodeFactory.ts b/abstractions/typescript/src/store/backingStoreParseNodeFactory.ts index 1d63967a8b..fd22c9566f 100644 --- a/abstractions/typescript/src/store/backingStoreParseNodeFactory.ts +++ b/abstractions/typescript/src/store/backingStoreParseNodeFactory.ts @@ -3,21 +3,25 @@ import { BackedModel } from "./backedModel"; /** Proxy implementation of ParseNodeFactory for the backing store that automatically sets the state of the backing store when deserializing. */ export class BackingStoreParseNodeFactory extends ParseNodeProxyFactory { - /** - * Initializes a new instance of the BackingStoreParseNodeFactory class given the concrete implementation. - * @param concrete the concrete implementation of the ParseNodeFactory - */ - public constructor(concrete: ParseNodeFactory) { - super(concrete, - value => { - const backedModel = value as unknown as BackedModel; - if(backedModel && backedModel.backingStore) - backedModel.backingStore.initializationCompleted = false; - }, - value => { - const backedModel = value as unknown as BackedModel; - if(backedModel && backedModel.backingStore) - backedModel.backingStore.initializationCompleted = true; - }); - } -} \ No newline at end of file + /** + * Initializes a new instance of the BackingStoreParseNodeFactory class given the concrete implementation. + * @param concrete the concrete implementation of the ParseNodeFactory + */ + public constructor(concrete: ParseNodeFactory) { + super( + concrete, + (value) => { + const backedModel = value as unknown as BackedModel; + if (backedModel && backedModel.backingStore) { + backedModel.backingStore.initializationCompleted = false; + } + }, + (value) => { + const backedModel = value as unknown as BackedModel; + if (backedModel && backedModel.backingStore) { + backedModel.backingStore.initializationCompleted = true; + } + }, + ); + } +} diff --git a/abstractions/typescript/src/store/backingStoreSerializationWriterProxyFactory.ts b/abstractions/typescript/src/store/backingStoreSerializationWriterProxyFactory.ts index 41d54f7576..d110fa64ae 100644 --- a/abstractions/typescript/src/store/backingStoreSerializationWriterProxyFactory.ts +++ b/abstractions/typescript/src/store/backingStoreSerializationWriterProxyFactory.ts @@ -3,31 +3,35 @@ import { BackedModel } from "./backedModel"; /**Proxy implementation of SerializationWriterFactory for the backing store that automatically sets the state of the backing store when serializing. */ export class BackingStoreSerializationWriterProxyFactory extends SerializationWriterProxyFactory { - /** - * Initializes a new instance of the BackingStoreSerializationWriterProxyFactory class given a concrete implementation of SerializationWriterFactory. - * @param concrete a concrete implementation of SerializationWriterFactory to wrap. - */ - public constructor(concrete: SerializationWriterFactory) { - super(concrete, - value => { - const backedModel = value as unknown as BackedModel; - if(backedModel && backedModel.backingStore) - backedModel.backingStore.returnOnlyChangedValues = true; - }, - value => { - const backedModel = value as unknown as BackedModel; - if(backedModel && backedModel.backingStore) { - backedModel.backingStore.returnOnlyChangedValues = false; - backedModel.backingStore.initializationCompleted = true; - } - }, - (value, writer) => { - const backedModel = value as unknown as BackedModel; - if(backedModel && backedModel.backingStore) { - const keys = backedModel.backingStore.enumerateKeysForValuesChangedToNull(); - for(const key of keys) - writer.writeNullValue(key); - } - }); - } -} \ No newline at end of file + /** + * Initializes a new instance of the BackingStoreSerializationWriterProxyFactory class given a concrete implementation of SerializationWriterFactory. + * @param concrete a concrete implementation of SerializationWriterFactory to wrap. + */ + public constructor(concrete: SerializationWriterFactory) { + super( + concrete, + (value) => { + const backedModel = value as unknown as BackedModel; + if (backedModel && backedModel.backingStore) { + backedModel.backingStore.returnOnlyChangedValues = true; + } + }, + (value) => { + const backedModel = value as unknown as BackedModel; + if (backedModel && backedModel.backingStore) { + backedModel.backingStore.returnOnlyChangedValues = false; + backedModel.backingStore.initializationCompleted = true; + } + }, + (value, writer) => { + const backedModel = value as unknown as BackedModel; + if (backedModel && backedModel.backingStore) { + const keys = backedModel.backingStore.enumerateKeysForValuesChangedToNull(); + for (const key of keys) { + writer.writeNullValue(key); + } + } + }, + ); + } +} diff --git a/abstractions/typescript/src/store/inMemoryBackingStore.ts b/abstractions/typescript/src/store/inMemoryBackingStore.ts index 36c32162ec..de0e69a048 100644 --- a/abstractions/typescript/src/store/inMemoryBackingStore.ts +++ b/abstractions/typescript/src/store/inMemoryBackingStore.ts @@ -1,79 +1,85 @@ +import { v4 as uuidv4 } from "uuid"; + import { BackingStore } from "./backingStore"; -import { v4 as uuidv4 } from 'uuid'; -type storeEntryWrapper = {changed: boolean, value: unknown}; +interface storeEntryWrapper { + changed: boolean; + value: unknown; +} type subscriptionCallback = (key: string, previousValue: unknown, newValue: unknown) => void; -type storeEntry = {key: string, value: unknown}; +interface storeEntry { + key: string; + value: unknown; +} /** In-memory implementation of the backing store. Allows for dirty tracking of changes. */ export class InMemoryBackingStore implements BackingStore { - public get(key: string): T | undefined { - const wrapper = this.store.get(key); - if(wrapper && - (this.returnOnlyChangedValues && wrapper.changed || - !this.returnOnlyChangedValues)) { - return wrapper.value as T; - } - return undefined; - } - public set(key: string, value: T): void { - var oldValueWrapper = this.store.get(key); - var oldValue = oldValueWrapper?.value; - if(oldValueWrapper) { - oldValueWrapper.value = value; - oldValueWrapper.changed = this.initializationCompleted; - } else { - this.store.set(key, { - changed: this.initializationCompleted, - value: value - }); - } - this.subscriptions.forEach(sub => { - sub(key, oldValue, value); - }); - } - public enumerate(): storeEntry[] { - let filterableArray = [...this.store.entries()]; - if(this.returnOnlyChangedValues) { - filterableArray = filterableArray.filter(([_, v]) => v.changed); - } - return filterableArray.map(([key, value]) => { - return {key, value}; - }); - } - public enumerateKeysForValuesChangedToNull(): string[] { - const keys: string[] = []; - for(const [key, entry] of this.store) { - if(entry.changed && !entry.value) { - keys.push(key); - } - } - return keys; - } - public subscribe(callback: subscriptionCallback, subscriptionId?: string | undefined): string { - if(!callback) - throw new Error("callback cannot be undefined"); - subscriptionId = subscriptionId ?? uuidv4(); - this.subscriptions.set(subscriptionId, callback); - return subscriptionId; - } - public unsubscribe(subscriptionId: string): void { - this.subscriptions.delete(subscriptionId); - } - public clear(): void { - this.store.clear(); - } - private readonly subscriptions: Map = new Map(); - private readonly store: Map = new Map(); - public returnOnlyChangedValues: boolean = false; - private _initializationCompleted: boolean = true; - public set initializationCompleted(value: boolean) { - this._initializationCompleted = value; - this.store.forEach((v) => { - v.changed = !value; - }); - } - public get initializationCompleted() { - return this._initializationCompleted; - } -} \ No newline at end of file + public get(key: string): T | undefined { + const wrapper = this.store.get(key); + if (wrapper && ((this.returnOnlyChangedValues && wrapper.changed) || !this.returnOnlyChangedValues)) { + return wrapper.value as T; + } + return undefined; + } + public set(key: string, value: T): void { + const oldValueWrapper = this.store.get(key); + const oldValue = oldValueWrapper?.value; + if (oldValueWrapper) { + oldValueWrapper.value = value; + oldValueWrapper.changed = this.initializationCompleted; + } else { + this.store.set(key, { + changed: this.initializationCompleted, + value, + }); + } + this.subscriptions.forEach((sub) => { + sub(key, oldValue, value); + }); + } + public enumerate(): storeEntry[] { + let filterableArray = [...this.store.entries()]; + if (this.returnOnlyChangedValues) { + filterableArray = filterableArray.filter(([_, v]) => v.changed); + } + return filterableArray.map(([key, value]) => { + return { key, value }; + }); + } + public enumerateKeysForValuesChangedToNull(): string[] { + const keys: string[] = []; + for (const [key, entry] of this.store) { + if (entry.changed && !entry.value) { + keys.push(key); + } + } + return keys; + } + public subscribe(callback: subscriptionCallback, subscriptionId?: string | undefined): string { + if (!callback) { + throw new Error("callback cannot be undefined"); + } + subscriptionId = subscriptionId ?? uuidv4(); + this.subscriptions.set(subscriptionId, callback); + return subscriptionId; + } + public unsubscribe(subscriptionId: string): void { + this.subscriptions.delete(subscriptionId); + } + public clear(): void { + this.store.clear(); + } + private readonly subscriptions: Map = new Map(); + private readonly store: Map = new Map(); + public returnOnlyChangedValues = false; + private _initializationCompleted = true; + public set initializationCompleted(value: boolean) { + this._initializationCompleted = value; + this.store.forEach((v) => { + v.changed = !value; + }); + } + public get initializationCompleted() { + return this._initializationCompleted; + } +} diff --git a/abstractions/typescript/src/store/inMemoryBackingStoreFactory.ts b/abstractions/typescript/src/store/inMemoryBackingStoreFactory.ts index 9ff53d26be..e43a9f37b3 100644 --- a/abstractions/typescript/src/store/inMemoryBackingStoreFactory.ts +++ b/abstractions/typescript/src/store/inMemoryBackingStoreFactory.ts @@ -4,7 +4,7 @@ import { InMemoryBackingStore } from "./inMemoryBackingStore"; /** This class is used to create instances of InMemoryBackingStore */ export class InMemoryBackingStoreFactory implements BackingStoreFactory { - public createBackingStore(): BackingStore { - return new InMemoryBackingStore(); - } -} \ No newline at end of file + public createBackingStore(): BackingStore { + return new InMemoryBackingStore(); + } +} diff --git a/abstractions/typescript/src/store/index.ts b/abstractions/typescript/src/store/index.ts index 6d26bb0eda..782f915ac1 100644 --- a/abstractions/typescript/src/store/index.ts +++ b/abstractions/typescript/src/store/index.ts @@ -1,8 +1,8 @@ -export * from './backedModel'; -export * from './backingStore'; -export * from './backingStoreFactory'; -export * from './backingStoreFactorySingleton'; -export * from './backingStoreParseNodeFactory'; -export * from './backingStoreSerializationWriterProxyFactory'; -export * from './inMemoryBackingStore'; -export * from './inMemoryBackingStoreFactory'; \ No newline at end of file +export * from "./backedModel"; +export * from "./backingStore"; +export * from "./backingStoreFactory"; +export * from "./backingStoreFactorySingleton"; +export * from "./backingStoreParseNodeFactory"; +export * from "./backingStoreSerializationWriterProxyFactory"; +export * from "./inMemoryBackingStore"; +export * from "./inMemoryBackingStoreFactory"; diff --git a/abstractions/typescript/src/utils/index.ts b/abstractions/typescript/src/utils/index.ts index 03f4f7e5ac..33622931e5 100644 --- a/abstractions/typescript/src/utils/index.ts +++ b/abstractions/typescript/src/utils/index.ts @@ -1 +1 @@ -export * from "./stringUtils"; \ No newline at end of file +export * from "./stringUtils"; diff --git a/abstractions/typescript/src/utils/stringUtils.ts b/abstractions/typescript/src/utils/stringUtils.ts index 8cbcda5aad..417a912136 100644 --- a/abstractions/typescript/src/utils/stringUtils.ts +++ b/abstractions/typescript/src/utils/stringUtils.ts @@ -1,7 +1,7 @@ export function toFirstCharacterUpper(source?: string): string { - if(source && source.length > 0) { - return source.substring(0, 1).toLocaleUpperCase() + source.substring(1); - } else { - return ''; - } -} \ No newline at end of file + if (source && source.length > 0) { + return source.substring(0, 1).toLocaleUpperCase() + source.substring(1); + } else { + return ""; + } +} diff --git a/abstractions/typescript/test/browser/index.ts b/abstractions/typescript/test/browser/index.ts index 4636b9f4eb..d8b0232737 100644 --- a/abstractions/typescript/test/browser/index.ts +++ b/abstractions/typescript/test/browser/index.ts @@ -1,2 +1,9 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + export * from "./requestInformation"; -export * from "../common/requestInformation"; \ No newline at end of file +export * from "../common/requestInformation"; diff --git a/abstractions/typescript/test/browser/requestInformation.ts b/abstractions/typescript/test/browser/requestInformation.ts index 6478da1a11..a5a9f61d8b 100644 --- a/abstractions/typescript/test/browser/requestInformation.ts +++ b/abstractions/typescript/test/browser/requestInformation.ts @@ -11,10 +11,10 @@ import { RequestInformation } from "../../src/"; describe("RequestInformation", () => { it("Should set request information uri", () => { - const requestInformation = new RequestInformation(); - const browserReadableStream = new ReadableStream(); - requestInformation.setStreamContent(browserReadableStream); + const requestInformation = new RequestInformation(); + const browserReadableStream = new ReadableStream(); + requestInformation.setStreamContent(browserReadableStream); - assert.equal(requestInformation["content"], browserReadableStream) - }); + assert.equal(requestInformation["content"], browserReadableStream); + }); }); diff --git a/abstractions/typescript/test/common/requestInformation.ts b/abstractions/typescript/test/common/requestInformation.ts index aa8e06f9c7..e6fc0e8d09 100644 --- a/abstractions/typescript/test/common/requestInformation.ts +++ b/abstractions/typescript/test/common/requestInformation.ts @@ -11,12 +11,12 @@ import { RequestInformation } from "../../src/"; describe("RequestInformation", () => { it("Should set request information uri", () => { - const requestInformation = new RequestInformation(); - const currentPath = "CURRENT_PATH"; - const pathSegment = "PATH_SEGMENT" - requestInformation.setUri( currentPath, pathSegment, false); - assert.isNotNull(URL); - console.log(requestInformation.URI); - assert.equal(requestInformation.URI, currentPath+ "" +pathSegment); - }); + const requestInformation = new RequestInformation(); + const currentPath = "CURRENT_PATH"; + const pathSegment = "PATH_SEGMENT"; + requestInformation.setUri(currentPath, pathSegment, false); + assert.isNotNull(URL); + console.log(requestInformation.URI); + assert.equal(requestInformation.URI, currentPath + "" + pathSegment); + }); }); diff --git a/abstractions/typescript/test/node/requestInformation.ts b/abstractions/typescript/test/node/requestInformation.ts index 61a8915596..261b50e7d1 100644 --- a/abstractions/typescript/test/node/requestInformation.ts +++ b/abstractions/typescript/test/node/requestInformation.ts @@ -6,16 +6,16 @@ */ import { assert } from "chai"; +import { Readable } from "stream"; import { RequestInformation } from "../../src/"; -import { Readable } from "stream"; describe("RequestInformation", () => { it("Should set request information uri", () => { - const requestInformation = new RequestInformation(); - const nodeReadableStream = new Readable(); - requestInformation.setStreamContent(nodeReadableStream); + const requestInformation = new RequestInformation(); + const nodeReadableStream = new Readable(); + requestInformation.setStreamContent(nodeReadableStream); - assert.equal(requestInformation["content"], nodeReadableStream) - }); + assert.equal(requestInformation["content"], nodeReadableStream); + }); }); diff --git a/http/typescript/fetch/.vscode/settings.json b/http/typescript/fetch/.vscode/settings.json deleted file mode 100644 index 55712c19f1..0000000000 --- a/http/typescript/fetch/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "typescript.tsdk": "node_modules/typescript/lib" -} \ No newline at end of file diff --git a/http/typescript/fetch/docs/design/isomorphic.md b/http/typescript/fetch/docs/design/isomorphic.md new file mode 100644 index 0000000000..b2e351cb04 --- /dev/null +++ b/http/typescript/fetch/docs/design/isomorphic.md @@ -0,0 +1,148 @@ +## Terms - + +- bundler - Module bundlers are tools frontend developers used to bundle JavaScript modules into a single JavaScript files that can be executed in the browser. + +- rollup - rollup.js is the module bundler that the JS SDK uses. + +- package.json fields - + + - main - The main field is a module ID that is the primary entry point to your program. Points to the CJS modules. + + - module - The module field is not an official npm feature but a common convention among bundlers to designate how to import an ESM version of a library. Points to the ES modules. + + - browser - If the module is meant to be used client-side, the browser field should be used instead of the main field. + +## Isomorphic library +The Kiota libraries are isomorphic, that is, this library runs in node and browser. + +To achieve the isomorphism, the library is set up in the following ways: + + TypeScript Source Code + / \ + Transpiles into JavaScript + 'dist' folder + / \ + CJS module ES modules +1. The library supports `CommonJS` modules and `ES` modules.`CommonJS` formats are popular in the node enviroment. + `main` - `dist/es/src/index.js` + `module` - `dist/es/src/index.js` + +2. Entry point for the browser - `dist/es/src/browser/index.js`. + +Often times the library will have code which is different for the browser and node environments. +Examples: +- Browsers use a global `fetch` defined in the `DOM` while node relies on an external library such as `node-fetch` or `undici`. +- `ReadableStream` are different interfaces in node and browser. + +To manage such differences, separate files are maintained when the code can be different for node or browser. + +For example: +- The `DefaultFetchHandler` uses `node-fetch` for node and the `dom` fetch for browser. +- Map this difference as follows: + +```json +"browser": { + "./dist/es/src/index.js": "./dist/es/src/browser/index.js", + "./dist/es/src/utils/utils.js": "./dist/es/src/utils/browser/utils.js", + "./dist/es/src/middlewares/defaultFetchHandler.js": "./dist/es/src/middlewares/browser/defaultFetchHandler.js", + "./dist/es/src/middlewares/middlewareFactory.js": "./dist/es/src/middlewares/browser/middlewareFactory.js", + "./dist/cjs/src/middlewares/middlewareFactory.js": "./dist/es/src/middlewares/browser/middlewareFactory.js" +} +``` + +The applications or library using `kiota-http-fetch library` will have bundlers that use this `package.json browser` mapping if the target environment is set to browser. + + +## Use of `lib:dom` and `@types/node` + +Typescript isomorphic libraries often rely on the DOM definitions and `@types/node` as compile-time dependencies. + +Example 1: +```json +// tsconfig.json in the isomorphic library + +{ + "compileroptions": { + "lib":"dom" + } +} +``` +Issues with example 1: + - This configuration makes DOM definitions globally available as a compile time dependency during development and it is not shipped with the library. However, when a node only application uses the isomorphic library, the DOM definitions will not be available and this causes Typescript compile time errors. + - [Issue example: Removed dom lib dependency](https://github.com/prisma-labs/graphql-request/issues/26) + - [PR example: azure core-http](https://github.com/Azure/azure-sdk-for-js/pull/7500) + + +Example 2: +``` +// example of use of @type/nodes +const readableStream : NodeJS.ReadableStream + +or + +global ambient declarations at the top of the file +/// +/// +``` + +Issues with example 2: + - When transpiling a direct reference to `@types/node`, such as `NodeJS.ReadableStream`, the transpiled code contains a global ambient declaration `/// `. The global ambient declarations leak the typings to the user code. + - Example of issues: + - [Removes reference to node typings and stubs dom interfaces](https://github.com/aws/aws-sdk-js/pull/1228) + - [Typings polutes global space with DOM types ](https://github.com/node-fetch/node-fetch/issues/1285) + + +Other issues: +Typescript is yet capture some of complete dynamic support that JavaScript provides. An example of this is [Node browser resolution strategy](https://github.com/microsoft/TypeScript/issues/7753) since today the compiler cannot type check based on the environment. + +### Solution to this: + +Approaches for this problem as observed in other isomorphic libraries: +- A good reference to a very optimal solution is here: [PR example: azure core-http](https://github.com/Azure/azure-sdk-for-js/pull/7500) +- A common approch that is taken is to create empty interfaces or shims. Then, if the user includes dom or the required definitions, the interfaces are merged. Reference [Removes reference to node typings and stubs dom interfaces](https://github.com/aws/aws-sdk-js/pull/1228) + +##### DOM shims and Fetch definitions +The `kiota-http-fetch library` relies on the DOM definitions such as `RequestInit`, `RequestInfo`. + +1. Maintain and export `dom.shim.d.ts` containing empty interfaces. This way the user can compile their code with the library without having a DOM library. + +```typescript +interface Request { } +interface RequestInit { } +interface Response { } +interface Headers { } +interface ReadableStream { } +interface fetch { } +``` + +2. The library code relies on interface definitions and interface properties such as `Request.body`, `Request.headers`. Introduced the `FetchDefinitions.ts` to achieve this. `FetchDefinitions.ts` contains the following intersection types: +- `FetchRequestInit` +- `FetchHeadersInit` +- `FetchResponse` + +These types are redefined so that definitions are available and can be set isomorphically. + +For example: + +``` typescript +export type FetchRequestInit = Omit & { + /** + * Request's body + * Expected type in case of dom - ReadableStream | XMLHttpRequestBodyInit|null + * Expected type in case of node-fetch - | Blob | Buffer | URLSearchParams | NodeJS.ReadableStream | string|null + */ + body?: unknown; +} +```` + +##### ReadableStreamContent + +- `ReadableStream` are different interfaces in node and browser. +- Introducing `ReadableStreamContent`, empty interface expecting the type of NodeJS.ReadableStream or dom ReadableStream + * Node example: import {Readable} from "stream"; const readableStream = new Readable(); + * Browser example: const readableStream = new ReadableStream(); + +Alternatives considered to manage this difference: +- `content - NodeJS.ReadableStream | ReadableStream`. This transpiles to use the global ambient declaration of `type = nodes` which causes the global leaking issues discussed above. +- `content - ReadableStream` and maintaining an empty interface with the same name, that is, ReadableStream causes a mismatch error if content is set to NodeJS.Readable and DOM definitions are present at the same time. +- Due to the lack of `node browser resolution strategy` in the typings, we cannot maintain separate node and browser typings files for `ReadableStream` interface. diff --git a/http/typescript/fetch/docs/design/testing.md b/http/typescript/fetch/docs/design/testing.md new file mode 100644 index 0000000000..819b20d7e3 --- /dev/null +++ b/http/typescript/fetch/docs/design/testing.md @@ -0,0 +1,25 @@ +## Testing for node and browser + +### Testing for node + +- Tests targeting the node environment are in `/test/node` and `/test/common` folder and use `mocha` and `chai` JS libraries. +- Test formats: + - script to test `CommonJS` modules: `npm run test:cjs` + - script to test `ES` modules: `npm run test:es` +- Examples of node environment specific tests: Test `DefaultFetchHandler` using `node-fetch` library. + + +### Testing for browser + + +- Tests targeting the node environment are in `/test/browser` and `/test/common` folder and use `mocha` and `chai` JS libraries. +- To test for browsers, the tests and the source code are bundled using `rollup` and the bundled file is tested using `karma`. +- Test formats: + - script to test: `npm run karma`. +- Examples of node environment specific tests: Test `DefaultFetchHandler` using dom - `fetch`. + +--- +**NOTE** + +The bundled file considers the `package.json browser spec` during the rollup process. The entry point of the source code for the tests will be `src/browser/index.js` and the `package.json browser spec` file mapping should work. +--- diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index 77ebbfedf9..ae4b056a1a 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -1,13 +1,24 @@ { "name": "@microsoft/kiota-http-fetchlibrary", "version": "1.0.10", - "description": "Kiota HttpCore implementation with fetch", - "main": "dist/cjs/src/index.js", - "files": [ - "dist/", - "src/" + "description": "Kiota request adapter implementation with fetch", + "keywords": [ + "Kiota", + "OpenAPI", + "HTTP", + "fetch" ], - "types": "dist/cjs/src/index.d.ts", + "homepage": "https://github.com/microsoft/kiota#readme", + "bugs": { + "url": "https://github.com/microsoft/kiota/issues" + }, + "repository": { + "type": "git", + "url": "git://github.com/microsoft/kiota.git" + }, + "license": "MIT", + "author": "Microsoft", + "main": "dist/cjs/src/index.js", "browser": { "./dist/es/src/index.js": "./dist/es/src/browser/index.js", "./dist/es/src/utils/utils.js": "./dist/es/src/utils/browser/utils.js", @@ -15,37 +26,23 @@ "./dist/es/src/middlewares/middlewareFactory.js": "./dist/es/src/middlewares/browser/middlewareFactory.js", "./dist/cjs/src/middlewares/middlewareFactory.js": "./dist/es/src/middlewares/browser/middlewareFactory.js" }, + "types": "dist/cjs/src/index.d.ts", + "files": [ + "dist/", + "src/" + ], "scripts": { "build": "npm run build:cjs && npm run build:es", "build:cjs": "tsc -p tsconfig.cjs.json", "build:es": "tsc -p tsconfig.es.json", - "test:cjs": "npm run build:cjs && mocha 'dist/cjs/test/common/**/*.js' && mocha 'dist/cjs/test/node/**/*.js'", - "test:es": " npm run build:es && mocha 'dist/es/test/common/**/*.js' --require esm && mocha 'dist/es/test/node/**/*.js' --require esm", - "test": "npm run test:cjs && npm run test:es && npm run karma", "clean": "rm -r ./dist", "karma": "npm run rollup && karma start --single-run --browsers ChromeHeadless karma.conf.js", - "rollup": "rollup -c", "lint": "eslint . --ext .ts", - "lint:fix": "eslint . --ext .ts --fix" - }, - "repository": { - "type": "git", - "url": "git://github.com/microsoft/kiota.git" - }, - "keywords": [ - "Kiota", - "OpenAPI", - "HTTP", - "fetch" - ], - "author": "Microsoft", - "license": "MIT", - "bugs": { - "url": "https://github.com/microsoft/kiota/issues" - }, - "homepage": "https://github.com/microsoft/kiota#readme", - "publishConfig": { - "registry": "https://npm.pkg.github.com" + "lint:fix": "eslint . --ext .ts --fix", + "rollup": "rollup -c", + "test": "npm run test:cjs && npm run test:es && npm run karma", + "test:cjs": "npm run build:cjs && mocha 'dist/cjs/test/common/**/*.js' && mocha 'dist/cjs/test/node/**/*.js'", + "test:es": " npm run build:es && mocha 'dist/es/test/common/**/*.js' --require esm && mocha 'dist/es/test/node/**/*.js' --require esm" }, "dependencies": { "@microsoft/kiota-abstractions": "file:../../../abstractions/typescript", @@ -81,5 +78,8 @@ "sinon": "^11.1.2", "tslib": "^2.3.1", "typescript": "^4.4.3" + }, + "publishConfig": { + "registry": "https://npm.pkg.github.com" } -} +} \ No newline at end of file diff --git a/http/typescript/fetch/src/browser/index.ts b/http/typescript/fetch/src/browser/index.ts index d0be0b5602..c6a46e5a81 100644 --- a/http/typescript/fetch/src/browser/index.ts +++ b/http/typescript/fetch/src/browser/index.ts @@ -1,3 +1,13 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +/* eslint-disable @typescript-eslint/triple-slash-reference*/ +/// + export * from "../fetchRequestAdapter"; export * from "../httpClient"; export * from "../middlewares/middleware"; diff --git a/http/typescript/fetch/src/dom.shim.d.ts b/http/typescript/fetch/src/dom.shim.d.ts index e31b8219a0..8ae5c5b756 100644 --- a/http/typescript/fetch/src/dom.shim.d.ts +++ b/http/typescript/fetch/src/dom.shim.d.ts @@ -10,4 +10,5 @@ interface RequestInit { } interface Response { } interface Headers { } interface ReadableStream { } -interface fetch { } \ No newline at end of file +interface fetch { } +interface Blob {} \ No newline at end of file diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index 2ef19617e3..fd0687c12a 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -1,41 +1,48 @@ -import { customFetchHandler } from "./middlewares/customFetchHandler"; -import { defaultFetchHandler } from "./middlewares/defaultFetchHandler"; +import { CustomFetchHandler } from "./middlewares/customFetchHandler"; +import { DefaultFetchHandler } from "./middlewares/defaultFetchHandler"; import { Middleware } from "./middlewares/middleware"; import { MiddlewareContext } from "./middlewares/middlewareContext"; import { MiddlewareFactory } from "./middlewares/middlewareFactory"; import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "./utils/fetchDefinitions"; -/** Default fetch client with options and a middleware pipleline for requests execution. */ + + export class HttpClient { private middleware: Middleware; - /** - * Instantiates a new HttpClient. - * @param middlewares middlewares to be used for requests execution. - * @param custom fetch function + /** + * @public + * @constructor + * Creates an instance of a HttpClient which contains the middlewares and fetch implementation for request execution. + * @param {...Middleware} middleware - The first middleware of the middleware chain or a sequence of all the Middleware handlers + * If middlewares param is undefined, the httpClient instance will use the default array of middlewares. + * Set middlewares to `null` if you do not wish to use middlewares. + * If custom fetch is undefined, the httpClient instance uses the `DefaultFetchHandler` + * @param {(request: FetchRequestInfo, init?: FetchRequestInit) => Promise < FetchResponse >} custom fetch function - a Fetch API implementation + * */ - public constructor(private customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise, ...middlewares: Middleware[]) { - // Use default middleware chain if middlewares and custom fetch function are not defined - if (!middlewares.length) { - if (this.customFetch) { - this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain(customFetch)); - } else { - this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain()); + public constructor(private customFetch ?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise < FetchResponse >, ...middlewares: Middleware[]) { + // Use default middleware chain if middlewares and custom fetch function are undefined + if (!middlewares.length) { + if (this.customFetch) { + this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain(customFetch)); + } else { + this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain()); + } + } else { + if (middlewares[0] === null) { + if (!customFetch) { + this.setMiddleware(new DefaultFetchHandler()); } + return; } else { - if (middlewares[0] === null) { - if (!customFetch) { - this.setMiddleware(new defaultFetchHandler()); - } - return; + if (this.customFetch) { + this.setMiddleware(...middlewares, new CustomFetchHandler(customFetch)); } else { - if (this.customFetch) { - this.setMiddleware(...middlewares, new customFetchHandler(customFetch)); - } else { - this.setMiddleware(...middlewares); - } + this.setMiddleware(...middlewares); } } } +} /** * @private @@ -45,11 +52,11 @@ export class HttpClient { * @returns Nothing */ private setMiddleware(...middleware: Middleware[]): void { - if (middleware.length > 1) { - this.parseMiddleWareArray(middleware); - } else { - this.middleware = middleware[0]; - } + if(middleware.length > 1) { + this.parseMiddleWareArray(middleware); +} else { + this.middleware = middleware[0]; +} } /** @@ -61,13 +68,13 @@ export class HttpClient { * @returns Nothing */ private parseMiddleWareArray(middlewareArray: Middleware[]) { - middlewareArray.forEach((element, index) => { - if (index < middlewareArray.length - 1) { - element.next = middlewareArray[index + 1]; - } - }); - this.middleware = middlewareArray[0]; - } + middlewareArray.forEach((element, index) => { + if (index < middlewareArray.length - 1) { + element.next = middlewareArray[index + 1]; + } + }); + this.middleware = middlewareArray[0]; +} /** * Executes a request and returns a promise resolving the response. @@ -75,16 +82,16 @@ export class HttpClient { * @param options request options. * @returns the promise resolving the response. */ - public async executeFetch(context: MiddlewareContext): Promise { - if (this.customFetch && !this.middleware) { - return this.customFetch(context.request, context.options); - } + public async executeFetch(context: MiddlewareContext): Promise < FetchResponse > { + if(this.customFetch && !this.middleware) { + return this.customFetch(context.request, context.options); +} - if (this.middleware) { - await this.middleware.execute(context); - return context.response; - } else { - throw new Error("Please provide middlewares or a custom fetch function to execute the request"); - } +if (this.middleware) { + await this.middleware.execute(context); + return context.response; +} else { + throw new Error("Please provide middlewares or a custom fetch function to execute the request"); +} } } diff --git a/http/typescript/fetch/src/index.ts b/http/typescript/fetch/src/index.ts index 0e7b989e9a..833ac1091a 100644 --- a/http/typescript/fetch/src/index.ts +++ b/http/typescript/fetch/src/index.ts @@ -1,3 +1,10 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + /* eslint-disable @typescript-eslint/triple-slash-reference*/ /// export * from "./fetchRequestAdapter"; diff --git a/http/typescript/fetch/src/kiotaClientFactory.ts b/http/typescript/fetch/src/kiotaClientFactory.ts new file mode 100644 index 0000000000..520254023c --- /dev/null +++ b/http/typescript/fetch/src/kiotaClientFactory.ts @@ -0,0 +1,17 @@ +import { Middleware } from "./middlewares/middleware"; +import { MiddlewareFactory } from "./middlewares/middlewareFactory"; + +/** + * Gets the default middlewares in use for the client. + * @returns the default middlewares. + */ +export function getDefaultMiddlewares(): Middleware[] { + return MiddlewareFactory.getDefaultMiddlewareChain(); +} +/** + * Gets the default request settings to be used for the client. + * @returns the default request settings. + */ +export function getDefaultRequestSettings(): RequestInit { + return {}; //TODO add default request settings +} \ No newline at end of file diff --git a/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts b/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts index 53c96ceae2..274991b3a1 100644 --- a/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts @@ -6,7 +6,7 @@ */ /** - * @module FetchHandler + * @module DefaultFetchHandler */ import { FetchResponse } from "../../utils/fetchDefinitions"; @@ -16,9 +16,8 @@ import { MiddlewareContext } from "../middlewareContext"; /** * @class * @implements Middleware - * Class for FetchHandler + * Class for DefaultFetchHandler */ - export class DefaultFetchHandler implements Middleware { /** * @private diff --git a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts index f6b17988dc..da905ca5c5 100644 --- a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts @@ -10,11 +10,11 @@ */ import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../../utils/fetchDefinitions"; -import { customFetchHandler } from "../customFetchHandler"; +import { CustomFetchHandler } from "../customFetchHandler"; import { Middleware } from "../middleware"; import { RetryHandlerOptions } from "../options/retryHandlerOptions"; import { RetryHandler } from "../retryHandler"; -import { defaultFetchHandler } from "./defaultFetchHandler"; +import { DefaultFetchHandler } from "./defaultFetchHandler"; /** * @class @@ -33,9 +33,9 @@ export class MiddlewareFactory { const retryHandler = new RetryHandler(new RetryHandlerOptions()); middlewareArray.push(retryHandler); if (customFetch) { - middlewareArray.push(new customFetchHandler(customFetch)); + middlewareArray.push(new CustomFetchHandler(customFetch)); } else { - middlewareArray.push(new defaultFetchHandler()); + middlewareArray.push(new DefaultFetchHandler()); } return middlewareArray; } diff --git a/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts b/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts index f86d576827..7346058512 100644 --- a/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts @@ -6,7 +6,7 @@ */ /** - * @module FetchHandler + * @module DefaultFetchHandler */ import fetch from "node-fetch"; diff --git a/http/typescript/fetch/src/middlewares/middleware.ts b/http/typescript/fetch/src/middlewares/middleware.ts index 921dfff0db..7f3c139480 100644 --- a/http/typescript/fetch/src/middlewares/middleware.ts +++ b/http/typescript/fetch/src/middlewares/middleware.ts @@ -1,3 +1,9 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ import { MiddlewareContext } from "./middlewareContext"; /** Defines the contract for a middleware in the request execution pipeline. */ diff --git a/http/typescript/fetch/src/middlewares/middlewareContext.ts b/http/typescript/fetch/src/middlewares/middlewareContext.ts index 1bd4df7e53..2122e37fd8 100644 --- a/http/typescript/fetch/src/middlewares/middlewareContext.ts +++ b/http/typescript/fetch/src/middlewares/middlewareContext.ts @@ -1,3 +1,10 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; import { MiddlewareControl } from "./middlewareControl"; @@ -6,8 +13,6 @@ import { MiddlewareControl } from "./middlewareControl"; * @property {RequestInfo} request - The request url string or the Request instance * @property {RequestInit} [options] - The options for the request * @property {Response} [response] - The response content - * @property {MiddlewareControl} [middlewareControl] - The options for the middleware chain - * @property {Set}[customHosts] - A set of custom host names. Should contain hostnames only. * */ @@ -15,5 +20,5 @@ export interface MiddlewareContext { request: FetchRequestInfo; response?: FetchResponse; options?: FetchRequestInit; - middlewareControl?: MiddlewareControl; + middlewareControl?: MiddlewareControl; // this can get updated depending on the use of request options } diff --git a/http/typescript/fetch/src/middlewares/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/middlewareFactory.ts index a0e1380254..cb300fbdf6 100644 --- a/http/typescript/fetch/src/middlewares/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/middlewareFactory.ts @@ -10,8 +10,8 @@ */ import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; -import { customFetchHandler } from "./customFetchHandler"; -import { defaultFetchHandler } from "./defaultFetchHandler"; +import { CustomFetchHandler } from "./customFetchHandler"; +import { DefaultFetchHandler } from "./defaultFetchHandler"; import { Middleware } from "./middleware"; import { RedirectHandlerOptions } from "./options/redirectHandlerOption"; import { RetryHandlerOptions } from "./options/retryHandlerOptions"; @@ -37,9 +37,9 @@ export class MiddlewareFactory { const redirectHandler = new RedirectHandler(new RedirectHandlerOptions()); middlewareArray.push(redirectHandler); if (customFetch) { - middlewareArray.push(new customFetchHandler(customFetch)); + middlewareArray.push(new CustomFetchHandler(customFetch)); } else { - middlewareArray.push(new defaultFetchHandler()); + middlewareArray.push(new DefaultFetchHandler()); } return middlewareArray; diff --git a/http/typescript/fetch/src/utils/demo.ts b/http/typescript/fetch/src/utils/demo.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/http/typescript/fetch/src/utils/fetchDefinitions.ts b/http/typescript/fetch/src/utils/fetchDefinitions.ts index 99f45e9af8..55d7fd0ecf 100644 --- a/http/typescript/fetch/src/utils/fetchDefinitions.ts +++ b/http/typescript/fetch/src/utils/fetchDefinitions.ts @@ -1,5 +1,20 @@ -export type FetchRequestInfo = string; // We only ever call fetch() on string urls. +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +// fetch() will only be called using string requests along with options +export type FetchRequestInfo = string; + + +/** + * Use Record type to store request headers. + * Node and browser have different implementations of `Headers`. + * Record type is used to store headers in most http request and fetch libraries. + */ export type FetchHeadersInit = Record; interface FetchBody { diff --git a/http/typescript/fetch/src/utils/referDom.d.ts b/http/typescript/fetch/src/utils/referDom.d.ts index 8b21a29344..f5f22c51a3 100644 --- a/http/typescript/fetch/src/utils/referDom.d.ts +++ b/http/typescript/fetch/src/utils/referDom.d.ts @@ -1 +1,11 @@ -////// \ No newline at end of file +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ +/// + +/** + * This ambient declaration is used to have a reference to dom definition without setting lib = dom in tsconfig files. + */ \ No newline at end of file diff --git a/http/typescript/fetch/test/browser/MiddlewareFactory.ts b/http/typescript/fetch/test/browser/MiddlewareFactory.ts index e1c7e354fc..cb13986f7f 100644 --- a/http/typescript/fetch/test/browser/MiddlewareFactory.ts +++ b/http/typescript/fetch/test/browser/MiddlewareFactory.ts @@ -7,7 +7,7 @@ import { assert } from "chai"; -import { defaultFetchHandler, MiddlewareFactory, RetryHandler } from "../../src/browser"; +import { DefaultFetchHandler, MiddlewareFactory, RetryHandler } from "../../src/browser"; describe("MiddlewareFactory", () => { it("Should return the default pipeline", () => { @@ -15,6 +15,6 @@ describe("MiddlewareFactory", () => { assert.equal(defaultMiddleWareArray.length, 2); assert.isTrue(defaultMiddleWareArray[0] instanceof RetryHandler); - assert.isTrue(defaultMiddleWareArray[1] instanceof defaultFetchHandler); + assert.isTrue(defaultMiddleWareArray[1] instanceof DefaultFetchHandler); }); }); diff --git a/http/typescript/fetch/test/browser/httpClient.ts b/http/typescript/fetch/test/browser/httpClient.ts index 0356bb486c..f71da4efdf 100644 --- a/http/typescript/fetch/test/browser/httpClient.ts +++ b/http/typescript/fetch/test/browser/httpClient.ts @@ -7,7 +7,7 @@ import { assert } from "chai"; -import { CustomFetchHandler, defaultFetchHandler, HttpClient, RetryHandler } from "../../src"; +import { CustomFetchHandler, DefaultFetchHandler, HttpClient, RetryHandler } from "../../src"; import { DummyFetchHandler } from "../common/middleware/dummyFetchHandler"; describe("HTTPClient.ts", () => { @@ -36,7 +36,7 @@ describe("HTTPClient.ts", () => { const next = client["middleware"].next; assert.isTrue(client["middleware"] instanceof RetryHandler); - assert.isTrue(next instanceof defaultFetchHandler); + assert.isTrue(next instanceof DefaultFetchHandler); }); it("Should set default middleware array with customFetchHandler if middleware parameter is undefined && customFetch is defined", () => { @@ -56,7 +56,7 @@ describe("HTTPClient.ts", () => { assert.isNotNull(client["middleware"]); - assert.isTrue(client["middleware"] instanceof defaultFetchHandler); + assert.isTrue(client["middleware"] instanceof DefaultFetchHandler); }); it("Should only set custom fetch if middleware parameter is null && customFetch is defined", () => { @@ -66,48 +66,4 @@ describe("HTTPClient.ts", () => { assert.equal(client["customFetch"], dummyCustomFetch); }); }); - - // describe("sendRequest", async () => { - // it("Should throw error for invalid request options incase if the url and options are passed", async () => { - // try { - // const url = "dummy_url"; - // const context: MiddlewareContext = { - // request: url, - // options: { - // method: "GET" - // } - // }; - - // assert.isTrue(httpClient["middleware"] instanceof defaultFetchHandler) - // await httpClient.executeFetch(context); - // throw new Error("Test Failed - Something wrong with the context validation"); - // } catch (error) { - // assert.equal(error.name, "InvalidRequestOptions"); - // } - // }); - - // it("Should execute for context object with Request instance", async () => { - // const request: FetchRequestInfo = "dummy_url"; - // const options: FetchRequestInit = { - // method: "GET" - // }; - // const context: MiddlewareContext = { - // request, - // options - // }; - // await httpClient.executeFetch(context); - // }); - - // it("Should execute for context object with request uri and options", async () => { - // const url = "dummy_url"; - // const options: FetchRequestInit = { - // method: "GET", - // }; - // const context: MiddlewareContext = { - // request: url, - // options, - // }; - // await httpClient.executeFetch(context); - // }); - // }); -}); +}); \ No newline at end of file diff --git a/http/typescript/fetch/test/node/MiddlewareFactory.ts b/http/typescript/fetch/test/node/MiddlewareFactory.ts index 5ec023be2f..ce1b0cfcf4 100644 --- a/http/typescript/fetch/test/node/MiddlewareFactory.ts +++ b/http/typescript/fetch/test/node/MiddlewareFactory.ts @@ -7,7 +7,7 @@ import { assert } from "chai"; -import { defaultFetchHandler, MiddlewareFactory, RedirectHandler, RetryHandler } from "../../src"; +import { DefaultFetchHandler, MiddlewareFactory, RedirectHandler, RetryHandler } from "../../src"; describe("MiddlewareFactory", () => { it("Should return the default pipeline", () => { @@ -16,6 +16,6 @@ describe("MiddlewareFactory", () => { assert.isTrue(defaultMiddleWareArray[0] instanceof RetryHandler); assert.isTrue(defaultMiddleWareArray[1] instanceof RedirectHandler); - assert.isTrue(defaultMiddleWareArray[2] instanceof defaultFetchHandler); + assert.isTrue(defaultMiddleWareArray[2] instanceof DefaultFetchHandler); }); }); diff --git a/http/typescript/fetch/test/node/httpClient.ts b/http/typescript/fetch/test/node/httpClient.ts index 26cb458d68..1a02904929 100644 --- a/http/typescript/fetch/test/node/httpClient.ts +++ b/http/typescript/fetch/test/node/httpClient.ts @@ -7,7 +7,7 @@ import { assert } from "chai"; -import { customFetchHandler, defaultFetchHandler, HttpClient, RedirectHandler, RetryHandler } from "../../src"; +import { CustomFetchHandler, DefaultFetchHandler, HttpClient, RedirectHandler, RetryHandler } from "../../src"; import { DummyFetchHandler } from "../common/middleware/dummyFetchHandler"; describe("HTTPClient.ts", () => { @@ -37,7 +37,7 @@ describe("HTTPClient.ts", () => { assert.isTrue(client["middleware"] instanceof RetryHandler); assert.isTrue(next instanceof RedirectHandler); - assert.isTrue(next.next instanceof defaultFetchHandler); + assert.isTrue(next.next instanceof DefaultFetchHandler); }); it("Should set default middleware array with customFetchHandler if middleware parameter is undefined && customFetch is defined", () => { @@ -50,7 +50,7 @@ describe("HTTPClient.ts", () => { assert.isTrue(client["middleware"] instanceof RetryHandler); assert.isTrue(next instanceof RedirectHandler); - assert.isTrue(next.next instanceof customFetchHandler); + assert.isTrue(next.next instanceof CustomFetchHandler); }); it("Should set to default fetch handler middleware array if middleware parameter is null && customFetch is undefined", () => { @@ -58,7 +58,7 @@ describe("HTTPClient.ts", () => { assert.isNotNull(client["middleware"]); - assert.isTrue(client["middleware"] instanceof defaultFetchHandler); + assert.isTrue(client["middleware"] instanceof DefaultFetchHandler); }); it("Should only set custom fetch if middleware parameter is null && customFetch is defined", () => { @@ -68,48 +68,4 @@ describe("HTTPClient.ts", () => { assert.equal(client["customFetch"], dummyCustomFetch); }); }); - - // describe("sendRequest", async () => { - // it("Should throw error for invalid request options incase if the url and options are passed", async () => { - // try { - // const url = "dummy_url"; - // const context: MiddlewareContext = { - // request: url, - // options: { - // method: "GET" - // } - // }; - - // assert.isTrue(httpClient["middleware"] instanceof defaultFetchHandler) - // await httpClient.executeFetch(context); - // throw new Error("Test Failed - Something wrong with the context validation"); - // } catch (error) { - // assert.equal(error.name, "InvalidRequestOptions"); - // } - // }); - - // it("Should execute for context object with Request instance", async () => { - // const request: FetchRequestInfo = "dummy_url"; - // const options: FetchRequestInit = { - // method: "GET" - // }; - // const context: MiddlewareContext = { - // request, - // options - // }; - // await httpClient.executeFetch(context); - // }); - - // it("Should execute for context object with request uri and options", async () => { - // const url = "dummy_url"; - // const options: FetchRequestInit = { - // method: "GET", - // }; - // const context: MiddlewareContext = { - // request: url, - // options, - // }; - // await httpClient.executeFetch(context); - // }); - // }); }); From ed1580f4a04bba66f8adc81e7ce3483439d510b6 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Mon, 25 Oct 2021 23:24:16 -0700 Subject: [PATCH 18/34] middleware return type, getkey definition --- abstractions/typescript/package-lock.json | 16 +- abstractions/typescript/package.json | 2 +- abstractions/typescript/rollup.config.js | 3 +- .../typescript/src/requestInformation.ts | 10 +- abstractions/typescript/src/requestOption.ts | 13 +- http/typescript/fetch/package.json | 3 +- http/typescript/fetch/rollup.config.js | 2 +- .../fetch/src/fetchRequestAdapter.ts | 380 +++++++++--------- http/typescript/fetch/src/httpClient.ts | 165 ++++---- .../browser/defaultFetchHandler.ts | 5 +- .../src/middlewares/defaultFetchHandler.ts | 5 +- .../fetch/src/middlewares/middleware.ts | 3 +- .../src/middlewares/middlewareContext.ts | 7 +- .../options/RetryHandlerOptions.ts | 5 +- ...lerOption.ts => redirectHandlerOptions.ts} | 20 +- .../fetch/src/middlewares/redirectHandler.ts | 364 ++++++++--------- .../fetch/src/middlewares/retryHandler.ts | 28 +- .../typescript/fetch/src/utils/headersUtil.ts | 5 +- http/typescript/package-lock.json | 3 - package-lock.json | 11 - 20 files changed, 503 insertions(+), 547 deletions(-) rename http/typescript/fetch/src/middlewares/options/{redirectHandlerOption.ts => redirectHandlerOptions.ts} (82%) delete mode 100644 http/typescript/package-lock.json delete mode 100644 package-lock.json diff --git a/abstractions/typescript/package-lock.json b/abstractions/typescript/package-lock.json index 7e1d7aeead..d03a83d273 100644 --- a/abstractions/typescript/package-lock.json +++ b/abstractions/typescript/package-lock.json @@ -1908,12 +1908,14 @@ "eslint-config-prettier": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==" + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true }, "eslint-plugin-prettier": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" } @@ -1921,7 +1923,8 @@ "eslint-plugin-simple-import-sort": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz", - "integrity": "sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==" + "integrity": "sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==", + "dev": true }, "eslint-scope": { "version": "5.1.1", @@ -2068,7 +2071,8 @@ "fast-diff": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true }, "fast-glob": { "version": "3.2.7", @@ -3674,12 +3678,14 @@ "prettier": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==" + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "dev": true }, "prettier-linter-helpers": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, "requires": { "fast-diff": "^1.1.2" } @@ -4650,4 +4656,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/abstractions/typescript/package.json b/abstractions/typescript/package.json index 2dfe8f57de..243958c013 100644 --- a/abstractions/typescript/package.json +++ b/abstractions/typescript/package.json @@ -65,4 +65,4 @@ "publishConfig": { "registry": "https://npm.pkg.github.com" } -} \ No newline at end of file +} diff --git a/abstractions/typescript/rollup.config.js b/abstractions/typescript/rollup.config.js index 16862b8890..b33c9c674d 100644 --- a/abstractions/typescript/rollup.config.js +++ b/abstractions/typescript/rollup.config.js @@ -1,3 +1,4 @@ + /** * ------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. @@ -13,7 +14,7 @@ const config = [{ output: { file: "dist/es/test/index.js", format: "esm", - name: "MicrosoftGraph", + name: "MicrosoftKiotaAbstractionsTest", }, plugins: [ commonjs({ include: ["node_modules/**"] }), diff --git a/abstractions/typescript/src/requestInformation.ts b/abstractions/typescript/src/requestInformation.ts index 031b5cef99..45d529fbf6 100644 --- a/abstractions/typescript/src/requestInformation.ts +++ b/abstractions/typescript/src/requestInformation.ts @@ -52,22 +52,22 @@ export class RequestInformation { * Fetch Request Options : https://developer.mozilla.org/en-US/docs/Web/API/Request#properties * https://github.com/microsoftgraph/msgraph-sdk-javascript/pull/105 */ - private _requestOptions = new Map(); + private _requestOptions: Record = {}; /** Gets the request options for the request. */ - public getRequestOptions() { - return this._requestOptions.values(); + public getRequestOptions(): Record { + return this._requestOptions; } public addRequestOptions(...options: RequestOption[]) { if (!options || options.length === 0) return; options.forEach((option) => { - this._requestOptions.set(option.getKey(), option); + this._requestOptions[option.constructor()] = option; }); } /** Removes the request options for the request. */ public removeRequestOptions(...options: RequestOption[]) { if (!options || options.length === 0) return; options.forEach((option) => { - this._requestOptions.delete(option.getKey()); + delete this._requestOptions[option.getKey()]; }); } private static binaryContentType = "application/octet-stream"; diff --git a/abstractions/typescript/src/requestOption.ts b/abstractions/typescript/src/requestOption.ts index 7fa88bf825..93a45fb04e 100644 --- a/abstractions/typescript/src/requestOption.ts +++ b/abstractions/typescript/src/requestOption.ts @@ -1,5 +1,14 @@ -/** Represents a request option. */ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ +/** + * Interface accepting request options + * to be passed in RequestInformaton object + */ export interface RequestOption { - /** Gets the option key for when adding it to a request. Must be unique. */ + /** Gets the option key for when adding it to a request. Must be unique. */ getKey(): string; } diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index ae4b056a1a..263511760c 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -23,8 +23,7 @@ "./dist/es/src/index.js": "./dist/es/src/browser/index.js", "./dist/es/src/utils/utils.js": "./dist/es/src/utils/browser/utils.js", "./dist/es/src/middlewares/defaultFetchHandler.js": "./dist/es/src/middlewares/browser/defaultFetchHandler.js", - "./dist/es/src/middlewares/middlewareFactory.js": "./dist/es/src/middlewares/browser/middlewareFactory.js", - "./dist/cjs/src/middlewares/middlewareFactory.js": "./dist/es/src/middlewares/browser/middlewareFactory.js" + "./dist/es/src/middlewares/middlewareFactory.js": "./dist/es/src/middlewares/browser/middlewareFactory.js" }, "types": "dist/cjs/src/index.d.ts", "files": [ diff --git a/http/typescript/fetch/rollup.config.js b/http/typescript/fetch/rollup.config.js index 16862b8890..80f2a0f1e3 100644 --- a/http/typescript/fetch/rollup.config.js +++ b/http/typescript/fetch/rollup.config.js @@ -13,7 +13,7 @@ const config = [{ output: { file: "dist/es/test/index.js", format: "esm", - name: "MicrosoftGraph", + name: "MicrosoftKiotaHttpFetchTest", }, plugins: [ commonjs({ include: ["node_modules/**"] }), diff --git a/http/typescript/fetch/src/fetchRequestAdapter.ts b/http/typescript/fetch/src/fetchRequestAdapter.ts index cd9dd40e11..95ae224b21 100644 --- a/http/typescript/fetch/src/fetchRequestAdapter.ts +++ b/http/typescript/fetch/src/fetchRequestAdapter.ts @@ -7,201 +7,201 @@ import { FetchRequestInit, FetchResponse } from "./utils/fetchDefinitions"; import { URLSearchParams } from "./utils/utils"; export class FetchRequestAdapter implements RequestAdapter { - public getSerializationWriterFactory(): SerializationWriterFactory { - return this.serializationWriterFactory; - } - /** - * Instantiates a new http core service - * @param authenticationProvider the authentication provider to use. - * @param parseNodeFactory the parse node factory to deserialize responses. - * @param serializationWriterFactory the serialization writer factory to use to serialize request bodies. - * @param httpClient the http client to use to execute requests. - */ - public constructor(public readonly authenticationProvider: AuthenticationProvider, private parseNodeFactory: ParseNodeFactory = ParseNodeFactoryRegistry.defaultInstance, private serializationWriterFactory: SerializationWriterFactory = SerializationWriterFactoryRegistry.defaultInstance, private readonly httpClient: HttpClient = new HttpClient()) { - if (!authenticationProvider) { - throw new Error("authentication provider cannot be null"); - } - if (!parseNodeFactory) { - throw new Error("parse node factory cannot be null"); - } - if (!serializationWriterFactory) { - throw new Error("serialization writer factory cannot be null"); - } - if (!httpClient) { - throw new Error("http client cannot be null"); - } - } - private getResponseContentType = (response: Response): string | undefined => { - const header = response.headers.get("content-type")?.toLowerCase(); - if (!header) return undefined; - const segments = header.split(";"); - if (segments.length === 0) return undefined; - else return segments[0]; - }; - public sendCollectionOfPrimitiveAsync = async (requestInfo: RequestInformation, responseType: "string" | "number" | "boolean" | "Date", responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInfo) { - throw new Error("requestInfo cannot be null"); - } - const response = await this.getHttpResponseMessage(requestInfo); - if (responseHandler) { - return await responseHandler.handleResponseAsync(response); - } else { - switch (responseType) { - case "string": - case "number": - case "boolean": - case "Date": { - const payload = await response.arrayBuffer(); - const responseContentType = this.getResponseContentType(response); - if (!responseContentType) { - throw new Error("no response content type found for deserialization"); - } + public getSerializationWriterFactory(): SerializationWriterFactory { + return this.serializationWriterFactory; + } + /** + * Instantiates a new http core service + * @param authenticationProvider the authentication provider to use. + * @param parseNodeFactory the parse node factory to deserialize responses. + * @param serializationWriterFactory the serialization writer factory to use to serialize request bodies. + * @param httpClient the http client to use to execute requests. + */ + public constructor(public readonly authenticationProvider: AuthenticationProvider, private parseNodeFactory: ParseNodeFactory = ParseNodeFactoryRegistry.defaultInstance, private serializationWriterFactory: SerializationWriterFactory = SerializationWriterFactoryRegistry.defaultInstance, private readonly httpClient: HttpClient = new HttpClient()) { + if (!authenticationProvider) { + throw new Error("authentication provider cannot be null"); + } + if (!parseNodeFactory) { + throw new Error("parse node factory cannot be null"); + } + if (!serializationWriterFactory) { + throw new Error("serialization writer factory cannot be null"); + } + if (!httpClient) { + throw new Error("http client cannot be null"); + } + } + private getResponseContentType = (response: Response): string | undefined => { + const header = response.headers.get("content-type")?.toLowerCase(); + if (!header) return undefined; + const segments = header.split(";"); + if (segments.length === 0) return undefined; + else return segments[0]; + }; + public sendCollectionOfPrimitiveAsync = async (requestInfo: RequestInformation, responseType: "string" | "number" | "boolean" | "Date", responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInfo) { + throw new Error("requestInfo cannot be null"); + } + const response = await this.getHttpResponseMessage(requestInfo); + if (responseHandler) { + return await responseHandler.handleResponseAsync(response); + } else { + switch (responseType) { + case "string": + case "number": + case "boolean": + case "Date": { + const payload = await response.arrayBuffer(); + const responseContentType = this.getResponseContentType(response); + if (!responseContentType) { + throw new Error("no response content type found for deserialization"); + } - const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); - if (responseType === "string") { - return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; - } else if (responseType === "number") { - return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; - } else if (responseType === "boolean") { - return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; - } else if (responseType === "Date") { - return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; - } else { - throw new Error("unexpected type to deserialize"); - } - } - } - } - }; - public sendCollectionAsync = async (requestInformation: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInformation) { - throw new Error("requestInfo cannot be null"); - } - const response = await this.getHttpResponseMessage(requestInformation); - if (responseHandler) { - return await responseHandler.handleResponseAsync(response); - } else { - const payload = await response.arrayBuffer(); - const responseContentType = this.getResponseContentType(response); - if (!responseContentType) { - throw new Error("no response content type found for deserialization"); - } + const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); + if (responseType === "string") { + return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; + } else if (responseType === "number") { + return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; + } else if (responseType === "boolean") { + return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; + } else if (responseType === "Date") { + return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; + } else { + throw new Error("unexpected type to deserialize"); + } + } + } + } + }; + public sendCollectionAsync = async (requestInformation: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInformation) { + throw new Error("requestInfo cannot be null"); + } + const response = await this.getHttpResponseMessage(requestInformation); + if (responseHandler) { + return await responseHandler.handleResponseAsync(response); + } else { + const payload = await response.arrayBuffer(); + const responseContentType = this.getResponseContentType(response); + if (!responseContentType) { + throw new Error("no response content type found for deserialization"); + } - const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); - const result = rootNode.getCollectionOfObjectValues(type); - return (result as unknown) as ModelType[]; - } - }; - public sendAsync = async (requestInformation: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInformation) { - throw new Error("requestInfo cannot be null"); - } - const response = await this.getHttpResponseMessage(requestInformation); - if (responseHandler) { - return await responseHandler.handleResponseAsync(response); - } else { - const payload = await response.arrayBuffer(); - const responseContentType = this.getResponseContentType(response); - if (!responseContentType) { - throw new Error("no response content type found for deserialization"); - } + const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); + const result = rootNode.getCollectionOfObjectValues(type); + return (result as unknown) as ModelType[]; + } + }; + public sendAsync = async (requestInformation: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInformation) { + throw new Error("requestInfo cannot be null"); + } + const response = await this.getHttpResponseMessage(requestInformation); + if (responseHandler) { + return await responseHandler.handleResponseAsync(response); + } else { + const payload = await response.arrayBuffer(); + const responseContentType = this.getResponseContentType(response); + if (!responseContentType) { + throw new Error("no response content type found for deserialization"); + } - const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); - const result = rootNode.getObjectValue(type); - return (result as unknown) as ModelType; - } - }; - public sendPrimitiveAsync = async (requestInformation: RequestInformation, responseType: "string" | "number" | "boolean" | "Date" | "ReadableStream", responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInformation) { - throw new Error("requestInfo cannot be null"); - } - const response = await this.getHttpResponseMessage(requestInformation); - if (responseHandler) { - return await responseHandler.handleResponseAsync(response); - } else { - switch (responseType) { - case "ReadableStream": - return (response.body as unknown) as ResponseType; - case "string": - case "number": - case "boolean": - case "Date": { - const payload = await response.arrayBuffer(); - const responseContentType = this.getResponseContentType(response); - if (!responseContentType) { - throw new Error("no response content type found for deserialization"); - } + const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); + const result = rootNode.getObjectValue(type); + return (result as unknown) as ModelType; + } + }; + public sendPrimitiveAsync = async (requestInformation: RequestInformation, responseType: "string" | "number" | "boolean" | "Date" | "ReadableStream", responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInformation) { + throw new Error("requestInfo cannot be null"); + } + const response = await this.getHttpResponseMessage(requestInformation); + if (responseHandler) { + return await responseHandler.handleResponseAsync(response); + } else { + switch (responseType) { + case "ReadableStream": + return (response.body as unknown) as ResponseType; + case "string": + case "number": + case "boolean": + case "Date": { + const payload = await response.arrayBuffer(); + const responseContentType = this.getResponseContentType(response); + if (!responseContentType) { + throw new Error("no response content type found for deserialization"); + } - const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); - if (responseType === "string") { - return (rootNode.getStringValue() as unknown) as ResponseType; - } else if (responseType === "number") { - return (rootNode.getNumberValue() as unknown) as ResponseType; - } else if (responseType === "boolean") { - return (rootNode.getBooleanValue() as unknown) as ResponseType; - } else if (responseType === "Date") { - return (rootNode.getDateValue() as unknown) as ResponseType; - } else { - throw new Error("unexpected type to deserialize"); - } - } - } - } - }; - public sendNoResponseContentAsync = async (requestInfo: RequestInformation, responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInfo) { - throw new Error("requestInfo cannot be null"); - } - const response = await this.getHttpResponseMessage(requestInfo); - if (responseHandler) { - return await responseHandler.handleResponseAsync(response); - } - }; - public enableBackingStore = (backingStoreFactory?: BackingStoreFactory | undefined): void => { - this.parseNodeFactory = enableBackingStoreForParseNodeFactory(this.parseNodeFactory); - this.serializationWriterFactory = enableBackingStoreForSerializationWriterFactory(this.serializationWriterFactory); - if (!this.serializationWriterFactory || !this.parseNodeFactory) { - throw new Error("unable to enable backing store"); - } - if (backingStoreFactory) { - BackingStoreFactorySingleton.instance = backingStoreFactory; - } - }; - private getHttpResponseMessage = async (requestInfo: RequestInformation): Promise => { - if (!requestInfo) { - throw new Error("requestInfo cannot be null"); - } - await this.authenticationProvider.authenticateRequest(requestInfo); + const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); + if (responseType === "string") { + return (rootNode.getStringValue() as unknown) as ResponseType; + } else if (responseType === "number") { + return (rootNode.getNumberValue() as unknown) as ResponseType; + } else if (responseType === "boolean") { + return (rootNode.getBooleanValue() as unknown) as ResponseType; + } else if (responseType === "Date") { + return (rootNode.getDateValue() as unknown) as ResponseType; + } else { + throw new Error("unexpected type to deserialize"); + } + } + } + } + }; + public sendNoResponseContentAsync = async (requestInfo: RequestInformation, responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInfo) { + throw new Error("requestInfo cannot be null"); + } + const response = await this.getHttpResponseMessage(requestInfo); + if (responseHandler) { + return await responseHandler.handleResponseAsync(response); + } + }; + public enableBackingStore = (backingStoreFactory?: BackingStoreFactory | undefined): void => { + this.parseNodeFactory = enableBackingStoreForParseNodeFactory(this.parseNodeFactory); + this.serializationWriterFactory = enableBackingStoreForSerializationWriterFactory(this.serializationWriterFactory); + if (!this.serializationWriterFactory || !this.parseNodeFactory) { + throw new Error("unable to enable backing store"); + } + if (backingStoreFactory) { + BackingStoreFactorySingleton.instance = backingStoreFactory; + } + }; + private getHttpResponseMessage = async (requestInfo: RequestInformation): Promise => { + if (!requestInfo) { + throw new Error("requestInfo cannot be null"); + } + await this.authenticationProvider.authenticateRequest(requestInfo); - return await this.httpClient.executeFetch(this.createContext(requestInfo)); - }; - private getRequestFromRequestInformation = (requestInfo: RequestInformation): FetchRequestInit => { - const request: FetchRequestInit = { - method: requestInfo.httpMethod?.toString(), - headers: requestInfo.headers, - body: requestInfo.content, - }; - return request; - }; + return await this.httpClient.executeFetch(this.createContext(requestInfo)); + }; + private getRequestFromRequestInformation = (requestInfo: RequestInformation): FetchRequestInit => { + const request: FetchRequestInit = { + method: requestInfo.httpMethod?.toString(), + headers: requestInfo.headers, + body: requestInfo.content + }; + return request; + }; - private getRequestUrl = (requestInformation: RequestInformation): string => { - let url = requestInformation.URI ?? ""; - if (requestInformation.queryParameters?.size ?? -1 > 0) { - const queryParametersBuilder = new URLSearchParams(); - requestInformation.queryParameters?.forEach((v, k) => { - queryParametersBuilder.append(k, `${v}`); - }); - url = url + "?" + queryParametersBuilder.toString(); - } - return url; - }; + private getRequestUrl = (requestInformation: RequestInformation): string => { + let url = requestInformation.URI ?? ""; + if (requestInformation.queryParameters?.size ?? -1 > 0) { + const queryParametersBuilder = new URLSearchParams(); + requestInformation.queryParameters?.forEach((v, k) => { + queryParametersBuilder.append(k, `${v}`); + }); + url = url + "?" + queryParametersBuilder.toString(); + } + return url; + }; - private createContext(requestInformation: RequestInformation): MiddlewareContext { - const context: MiddlewareContext = { - request: this.getRequestUrl(requestInformation), - options: this.getRequestFromRequestInformation(requestInformation), - middlewareControl: new MiddlewareControl(Array.from(requestInformation.getRequestOptions())), // Filter RequestOptions to find middleware options. RequestOptions can also contain other FetchRequestInit Options or custom options. - }; - return context; - } + private createContext(requestInformation: RequestInformation): MiddlewareContext { + const context: MiddlewareContext = { + request: this.getRequestUrl(requestInformation), + options: this.getRequestFromRequestInformation(requestInformation), + requestOptions: requestInformation.getRequestOptions(); + }; + return context; + } } diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index fd0687c12a..f756208288 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -6,92 +6,91 @@ import { MiddlewareFactory } from "./middlewares/middlewareFactory"; import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "./utils/fetchDefinitions"; - export class HttpClient { - private middleware: Middleware; - /** - * @public - * @constructor - * Creates an instance of a HttpClient which contains the middlewares and fetch implementation for request execution. - * @param {...Middleware} middleware - The first middleware of the middleware chain or a sequence of all the Middleware handlers - * If middlewares param is undefined, the httpClient instance will use the default array of middlewares. - * Set middlewares to `null` if you do not wish to use middlewares. - * If custom fetch is undefined, the httpClient instance uses the `DefaultFetchHandler` - * @param {(request: FetchRequestInfo, init?: FetchRequestInit) => Promise < FetchResponse >} custom fetch function - a Fetch API implementation - * - */ - public constructor(private customFetch ?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise < FetchResponse >, ...middlewares: Middleware[]) { - // Use default middleware chain if middlewares and custom fetch function are undefined - if (!middlewares.length) { - if (this.customFetch) { - this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain(customFetch)); - } else { - this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain()); - } - } else { - if (middlewares[0] === null) { - if (!customFetch) { - this.setMiddleware(new DefaultFetchHandler()); - } - return; - } else { - if (this.customFetch) { - this.setMiddleware(...middlewares, new CustomFetchHandler(customFetch)); - } else { - this.setMiddleware(...middlewares); - } - } - } -} + private middleware: Middleware; + /** + * @public + * @constructor + * Creates an instance of a HttpClient which contains the middlewares and fetch implementation for request execution. + * @param {...Middleware} middleware - The first middleware of the middleware chain or a sequence of all the Middleware handlers + * If middlewares param is undefined, the httpClient instance will use the default array of middlewares. + * Set middlewares to `null` if you do not wish to use middlewares. + * If custom fetch is undefined, the httpClient instance uses the `DefaultFetchHandler` + * @param {(request: FetchRequestInfo, init?: FetchRequestInit) => Promise < FetchResponse >} custom fetch function - a Fetch API implementation + * + */ + public constructor(private customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise, ...middlewares: Middleware[]) { + // Use default middleware chain if middlewares and custom fetch function are undefined + if (!middlewares.length) { + if (this.customFetch) { + this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain(customFetch)); + } else { + this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain()); + } + } else { + if (middlewares[0] === null) { + if (!customFetch) { + this.setMiddleware(new DefaultFetchHandler()); + } + return; + } else { + if (this.customFetch) { + this.setMiddleware(...middlewares, new CustomFetchHandler(customFetch)); + } else { + this.setMiddleware(...middlewares); + } + } + } + } - /** - * @private - * Processes the middleware parameter passed to set this.middleware property - * The calling function should validate if middleware is not undefined or not empty. - * @param {...Middleware} middleware - The middleware passed - * @returns Nothing - */ - private setMiddleware(...middleware: Middleware[]): void { - if(middleware.length > 1) { - this.parseMiddleWareArray(middleware); -} else { - this.middleware = middleware[0]; -} - } + /** + * @private + * Processes the middleware parameter passed to set this.middleware property + * The calling function should validate if middleware is not undefined or not empty. + * @param {...Middleware} middleware - The middleware passed + * @returns Nothing + */ + private setMiddleware(...middleware: Middleware[]): void { + if (middleware.length > 1) { + this.parseMiddleWareArray(middleware); + } else { + this.middleware = middleware[0]; + } + } - /** - * @private - * Processes the middleware array to construct the chain - * and sets this.middleware property to the first middlware handler of the array - * The calling function should validate if middleware is not undefined or not empty - * @param {Middleware[]} middlewareArray - The array of middleware handlers - * @returns Nothing - */ - private parseMiddleWareArray(middlewareArray: Middleware[]) { - middlewareArray.forEach((element, index) => { - if (index < middlewareArray.length - 1) { - element.next = middlewareArray[index + 1]; - } - }); - this.middleware = middlewareArray[0]; -} + /** + * @private + * Processes the middleware array to construct the chain + * and sets this.middleware property to the first middlware handler of the array + * The calling function should validate if middleware is not undefined or not empty + * @param {Middleware[]} middlewareArray - The array of middleware handlers + * @returns Nothing + */ + private parseMiddleWareArray(middlewareArray: Middleware[]) { + middlewareArray.forEach((element, index) => { + if (index < middlewareArray.length - 1) { + element.next = middlewareArray[index + 1]; + } + }); + this.middleware = middlewareArray[0]; + } - /** - * Executes a request and returns a promise resolving the response. - * @param url the request url. - * @param options request options. - * @returns the promise resolving the response. - */ - public async executeFetch(context: MiddlewareContext): Promise < FetchResponse > { - if(this.customFetch && !this.middleware) { - return this.customFetch(context.request, context.options); -} + /** + * Executes a request and returns a promise resolving the response. + * @param url the request url. + * @param options request options. + * @returns the promise resolving the response. + */ + public async executeFetch(context: MiddlewareContext): Promise { + if (this.customFetch && !this.middleware) { + return this.customFetch(context.request, context.options); + } -if (this.middleware) { - await this.middleware.execute(context); - return context.response; -} else { - throw new Error("Please provide middlewares or a custom fetch function to execute the request"); -} - } + if (this.middleware) { + await this.middleware.execute(context); + return context.response; + } else { + throw new Error("Please provide middlewares or a custom fetch function to execute the request"); + } + } } diff --git a/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts b/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts index 274991b3a1..0a9f1009b1 100644 --- a/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts @@ -32,8 +32,7 @@ export class DefaultFetchHandler implements Middleware { * @param {Context} context - The request context object * @returns A promise that resolves to nothing */ - public async execute(context: MiddlewareContext): Promise { - context.response = (await fetch(context.request, context.options as RequestInit)) as FetchResponse; - return; + public async execute(context: MiddlewareContext): Promise { + return (await fetch(context.request, context.options as RequestInit)) as FetchResponse; } } diff --git a/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts b/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts index 7346058512..44dae962d7 100644 --- a/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts @@ -35,8 +35,7 @@ export class DefaultFetchHandler implements Middleware { * @param {Context} context - The request context object * @returns A promise that resolves to nothing */ - public async execute(context: MiddlewareContext): Promise { - context.response = (await fetch(context.request, context.options)) as FetchResponse; - return; + public async execute(context: MiddlewareContext): Promise { + return (await fetch(context.request, context.options)) as FetchResponse; } } diff --git a/http/typescript/fetch/src/middlewares/middleware.ts b/http/typescript/fetch/src/middlewares/middleware.ts index 7f3c139480..18b83bace4 100644 --- a/http/typescript/fetch/src/middlewares/middleware.ts +++ b/http/typescript/fetch/src/middlewares/middleware.ts @@ -4,6 +4,7 @@ * See License in the project root for license information. * ------------------------------------------------------------------------------------------- */ +import { FetchResponse } from "../utils/fetchDefinitions"; import { MiddlewareContext } from "./middlewareContext"; /** Defines the contract for a middleware in the request execution pipeline. */ @@ -17,5 +18,5 @@ export interface Middleware { * @param url The URL of the request. * @return A promise that resolves to the response object. */ - execute(middlewareContext: MiddlewareContext): Promise; + execute(middlewareContext: MiddlewareContext): Promise; } diff --git a/http/typescript/fetch/src/middlewares/middlewareContext.ts b/http/typescript/fetch/src/middlewares/middlewareContext.ts index 2122e37fd8..a086bb82cc 100644 --- a/http/typescript/fetch/src/middlewares/middlewareContext.ts +++ b/http/typescript/fetch/src/middlewares/middlewareContext.ts @@ -5,8 +5,8 @@ * ------------------------------------------------------------------------------------------- */ -import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; -import { MiddlewareControl } from "./middlewareControl"; +import { RequestOption } from "@microsoft/kiota-abstractions"; +import { FetchRequestInfo, FetchRequestInit } from "../utils/fetchDefinitions"; /** * @interface @@ -18,7 +18,6 @@ import { MiddlewareControl } from "./middlewareControl"; export interface MiddlewareContext { request: FetchRequestInfo; - response?: FetchResponse; options?: FetchRequestInit; - middlewareControl?: MiddlewareControl; // this can get updated depending on the use of request options + middlewareOptions?: Record; // this can get updated depending on the use of request options } diff --git a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts index 39532fa0f3..c30a8ec636 100644 --- a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts +++ b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts @@ -19,6 +19,8 @@ import { FetchRequestInit, FetchResponse } from "../../utils/fetchDefinitions"; */ export type ShouldRetry = (delay: number, attempt: number, request: string, options: FetchRequestInit | undefined, response: FetchResponse) => boolean; +export const RetryHandlerOptionKey = "RetryHandlerOptionKey"; + /** * @class * @implements Middleware @@ -129,7 +131,6 @@ export class RetryHandlerOptions implements RequestOption { } public getKey(): string { - // TODO - return ""; + return RetryHandlerOptionKey; } } diff --git a/http/typescript/fetch/src/middlewares/options/redirectHandlerOption.ts b/http/typescript/fetch/src/middlewares/options/redirectHandlerOptions.ts similarity index 82% rename from http/typescript/fetch/src/middlewares/options/redirectHandlerOption.ts rename to http/typescript/fetch/src/middlewares/options/redirectHandlerOptions.ts index ca44e59c49..4dce617db3 100644 --- a/http/typescript/fetch/src/middlewares/options/redirectHandlerOption.ts +++ b/http/typescript/fetch/src/middlewares/options/redirectHandlerOptions.ts @@ -17,6 +17,7 @@ import { RequestOption } from "@microsoft/kiota-abstractions"; */ export type ShouldRedirect = (response: Response) => boolean; +export const RedirectHandlerOptionKey = "RedirectHandlerOption"; /** * @class * @implements MiddlewareOptions @@ -37,18 +38,6 @@ export class RedirectHandlerOptions implements RequestOption { */ private static MAX_MAX_REDIRECTS = 20; - /** - * @public - * A member holding max redirects value - */ - public maxRedirects: number; - - /** - * @public - * A member holding shouldRedirect callback - */ - public shouldRedirect: ShouldRedirect; - /** * @private * A member holding default shouldRedirect callback @@ -63,7 +52,7 @@ export class RedirectHandlerOptions implements RequestOption { * @param {ShouldRedirect} [shouldRedirect = RedirectHandlerOptions.DEFAULT_SHOULD_RETRY] - The should redirect callback * @returns An instance of RedirectHandlerOptions */ - public constructor(maxRedirects: number = RedirectHandlerOptions.DEFAULT_MAX_REDIRECTS, shouldRedirect: ShouldRedirect = RedirectHandlerOptions.defaultShouldRetry) { + public constructor(public maxRedirects: number = RedirectHandlerOptions.DEFAULT_MAX_REDIRECTS, public shouldRedirect: ShouldRedirect = RedirectHandlerOptions.defaultShouldRetry) { if (maxRedirects > RedirectHandlerOptions.MAX_MAX_REDIRECTS) { const error = new Error(`MaxRedirects should not be more than ${RedirectHandlerOptions.MAX_MAX_REDIRECTS}`); error.name = "MaxLimitExceeded"; @@ -78,8 +67,7 @@ export class RedirectHandlerOptions implements RequestOption { this.shouldRedirect = shouldRedirect; } - public getKey(): string { - // TODO - return ""; + public getKey(): string { + return RedirectHandlerOptionKey; } } diff --git a/http/typescript/fetch/src/middlewares/redirectHandler.ts b/http/typescript/fetch/src/middlewares/redirectHandler.ts index 5c489e2132..04f7df40e1 100644 --- a/http/typescript/fetch/src/middlewares/redirectHandler.ts +++ b/http/typescript/fetch/src/middlewares/redirectHandler.ts @@ -14,7 +14,7 @@ import { HttpMethod } from "@microsoft/kiota-abstractions"; import { FetchResponse } from "../utils/fetchDefinitions"; import { Middleware } from "./middleware"; import { MiddlewareContext } from "./middlewareContext"; -import { RedirectHandlerOptions } from "./options/redirectHandlerOption"; +import { RedirectHandlerOptionKey, RedirectHandlerOptions } from "./options/redirectHandlerOptions"; /** * @class @@ -23,194 +23,176 @@ import { RedirectHandlerOptions } from "./options/redirectHandlerOption"; * Class representing RedirectHandler */ export class RedirectHandler implements Middleware { - /** - * @private - * @static - * A member holding the array of redirect status codes - */ - private static REDIRECT_STATUS_CODES: number[] = [ - 301, // Moved Permanently - 302, // Found - 303, // See Other - 307, // Temporary Permanently - 308, // Moved Permanently - ]; - - /** - * @private - * @static - * A member holding SeeOther status code - */ - private static STATUS_CODE_SEE_OTHER = 303; - - /** - * @private - * @static - * A member holding the name of the location header - */ - private static LOCATION_HEADER = "Location"; - - /** - * @private - * @static - * A member representing the authorization header name - */ - private static AUTHORIZATION_HEADER = "Authorization"; - - /** - * @private - * @static - * A member holding the manual redirect value - */ - private static MANUAL_REDIRECT = "manual"; - - /** Next middleware to be executed*/ - next: Middleware | undefined; - /** - * - * @public - * @constructor - * To create an instance of RedirectHandler - * @param {RedirectHandlerOptions} [options = new RedirectHandlerOptions()] - The redirect handler options instance - * @returns An instance of RedirectHandler - */ - - public constructor(private options: RedirectHandlerOptions = new RedirectHandlerOptions()) { - this.options = options; - } - - /** - * @private - * To check whether the response has the redirect status code or not - * @param {Response} response - The response object - * @returns A boolean representing whether the response contains the redirect status code or not - */ - private isRedirect(response: FetchResponse): boolean { - return RedirectHandler.REDIRECT_STATUS_CODES.indexOf(response.status) !== -1; - } - - /** - * @private - * To check whether the response has location header or not - * @param {Response} response - The response object - * @returns A boolean representing the whether the response has location header or not - */ - private hasLocationHeader(response: FetchResponse): boolean { - return response.headers.has(RedirectHandler.LOCATION_HEADER); - } - - /** - * @private - * To get the redirect url from location header in response object - * @param {Response} response - The response object - * @returns A redirect url from location header - */ - private getLocationHeader(response: FetchResponse): string { - return response.headers.get(RedirectHandler.LOCATION_HEADER); - } - - /** - * @private - * To check whether the given url is a relative url or not - * @param {string} url - The url string value - * @returns A boolean representing whether the given url is a relative url or not - */ - private isRelativeURL(url: string): boolean { - return url.indexOf("://") === -1; - } - - /** - * @private - * To check whether the authorization header in the request should be dropped for consequent redirected requests - * @param {string} requestUrl - The request url value - * @param {string} redirectUrl - The redirect url value - * @returns A boolean representing whether the authorization header in the request should be dropped for consequent redirected requests - */ - private shouldDropAuthorizationHeader(requestUrl: string, redirectUrl: string): boolean { - const schemeHostRegex = /^[A-Za-z].+?:\/\/.+?(?=\/|$)/; - const requestMatches: string[] = schemeHostRegex.exec(requestUrl); - let requestAuthority: string; - let redirectAuthority: string; - if (requestMatches !== null) { - requestAuthority = requestMatches[0]; - } - const redirectMatches: string[] = schemeHostRegex.exec(redirectUrl); - if (redirectMatches !== null) { - redirectAuthority = redirectMatches[0]; - } - return typeof requestAuthority !== "undefined" && typeof redirectAuthority !== "undefined" && requestAuthority !== redirectAuthority; - } - - /** - * @private - * @async - * To update a request url with the redirect url - * @param {string} redirectUrl - The redirect url value - * @param {Context} context - The context object value - * @returns Nothing - */ - private async updateRequestUrl(redirectUrl: string, context: MiddlewareContext): Promise { - context.request = redirectUrl; - } - - /** - * @private - * To get the options for execution of the middleware - * @param {Context} context - The context object - * @returns A options for middleware execution - */ - private getOptions(context: MiddlewareContext): RedirectHandlerOptions { - let options: RedirectHandlerOptions; - if (context.middlewareControl) { - options = context.middlewareControl.getMiddlewareOptions(RedirectHandlerOptions) as RedirectHandlerOptions; - } - if (typeof options === "undefined") { - options = Object.assign(new RedirectHandlerOptions(), this.options); - } - return options; - } - - /** - * @private - * @async - * To execute the next middleware and to handle in case of redirect response returned by the server - * @param {Context} context - The context object - * @param {number} redirectCount - The redirect count value - * @param {RedirectHandlerOptions} options - The redirect handler options instance - * @returns A promise that resolves to nothing - */ - private async executeWithRedirect(context: MiddlewareContext, redirectCount: number, options: RedirectHandlerOptions): Promise { - await this.next.execute(context); - const response = context.response; - if (redirectCount < options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && options.shouldRedirect(response)) { - ++redirectCount; - if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { - context.options["method"] = HttpMethod.GET; - delete context.options.body; - } else { - const redirectUrl: string = this.getLocationHeader(response); - if (!this.isRelativeURL(redirectUrl) && this.shouldDropAuthorizationHeader(response.url, redirectUrl)) { - delete context.options.headers[RedirectHandler.AUTHORIZATION_HEADER]; - } - await this.updateRequestUrl(redirectUrl, context); - } - await this.executeWithRedirect(context, redirectCount, options); - } else { - return; - } - } - - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The context object of the request - * @returns A Promise that resolves to nothing - */ - public async execute(context: MiddlewareContext): Promise { - const redirectCount = 0; - const options = this.getOptions(context); - context.options.redirect = RedirectHandler.MANUAL_REDIRECT; - return await this.executeWithRedirect(context, redirectCount, options); - } + /** + * @private + * @static + * A member holding the array of redirect status codes + */ + private static REDIRECT_STATUS_CODES: Set = new Set([ + 301, // Moved Permanently + 302, // Found + 303, // See Other + 307, // Temporary Permanently + 308, // Moved Permanently + ]); + + /** + * @private + * @static + * A member holding SeeOther status code + */ + private static STATUS_CODE_SEE_OTHER = 303; + + /** + * @private + * @static + * A member holding the name of the location header + */ + private static LOCATION_HEADER = "Location"; + + /** + * @private + * @static + * A member representing the authorization header name + */ + private static AUTHORIZATION_HEADER = "Authorization"; + + /** + * @private + * @static + * A member holding the manual redirect value + */ + private static MANUAL_REDIRECT = "manual"; + + /** Next middleware to be executed*/ + next: Middleware | undefined; + /** + * + * @public + * @constructor + * To create an instance of RedirectHandler + * @param {RedirectHandlerOptions} [options = new RedirectHandlerOptions()] - The redirect handler options instance + * @returns An instance of RedirectHandler + */ + + public constructor(private options: RedirectHandlerOptions = new RedirectHandlerOptions()) { + this.options = options; + } + + /** + * @private + * To check whether the response has the redirect status code or not + * @param {Response} response - The response object + * @returns A boolean representing whether the response contains the redirect status code or not + */ + private isRedirect(response: FetchResponse): boolean { + return RedirectHandler.REDIRECT_STATUS_CODES.has(response.status); + } + + /** + * @private + * To check whether the response has location header or not + * @param {Response} response - The response object + * @returns A boolean representing the whether the response has location header or not + */ + private hasLocationHeader(response: FetchResponse): boolean { + return response.headers.has(RedirectHandler.LOCATION_HEADER); + } + + /** + * @private + * To get the redirect url from location header in response object + * @param {Response} response - The response object + * @returns A redirect url from location header + */ + private getLocationHeader(response: FetchResponse): string { + return response.headers.get(RedirectHandler.LOCATION_HEADER); + } + + /** + * @private + * To check whether the given url is a relative url or not + * @param {string} url - The url string value + * @returns A boolean representing whether the given url is a relative url or not + */ + private isRelativeURL(url: string): boolean { + return url.indexOf("://") === -1; + } + + /** + * @private + * To check whether the authorization header in the request should be dropped for consequent redirected requests + * @param {string} requestUrl - The request url value + * @param {string} redirectUrl - The redirect url value + * @returns A boolean representing whether the authorization header in the request should be dropped for consequent redirected requests + */ + private shouldDropAuthorizationHeader(requestUrl: string, redirectUrl: string): boolean { + const schemeHostRegex = /^[A-Za-z].+?:\/\/.+?(?=\/|$)/; + const requestMatches: string[] = schemeHostRegex.exec(requestUrl); + let requestAuthority: string; + let redirectAuthority: string; + if (requestMatches !== null) { + requestAuthority = requestMatches[0]; + } + const redirectMatches: string[] = schemeHostRegex.exec(redirectUrl); + if (redirectMatches !== null) { + redirectAuthority = redirectMatches[0]; + } + return typeof requestAuthority !== "undefined" && typeof redirectAuthority !== "undefined" && requestAuthority !== redirectAuthority; + } + + /** + * @private + * @async + * To update a request url with the redirect url + * @param {string} redirectUrl - The redirect url value + * @param {Context} context - The context object value + * @returns Nothing + */ + private async updateRequestUrl(redirectUrl: string, context: MiddlewareContext): Promise { + context.request = redirectUrl; + } + + /** + * @private + * @async + * To execute the next middleware and to handle in case of redirect response returned by the server + * @param {Context} context - The context object + * @param {number} redirectCount - The redirect count value + * @param {RedirectHandlerOptions} options - The redirect handler options instance + * @returns A promise that resolves to nothing + */ + private async executeWithRedirect(context: MiddlewareContext, redirectCount: number, options: RedirectHandlerOptions): Promise { + const response = await this.next.execute(context); + if (redirectCount < options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && options.shouldRedirect(response)) { + ++redirectCount; + if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { + context.options["method"] = HttpMethod.GET; + delete context.options.body; + } else { + const redirectUrl: string = this.getLocationHeader(response); + if (!this.isRelativeURL(redirectUrl) && this.shouldDropAuthorizationHeader(response.url, redirectUrl)) { + delete context.options.headers[RedirectHandler.AUTHORIZATION_HEADER]; + } + await this.updateRequestUrl(redirectUrl, context); + } + await this.executeWithRedirect(context, redirectCount, options); + } else { + return; + } + } + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The context object of the request + * @returns A Promise that resolves to nothing + */ + public async execute(context: MiddlewareContext): Promise { + const redirectCount = 0; + const options:RedirectHandlerOptions = (context?.middlewareOptions && context.middlewareOptions[RedirectHandlerOptionKey]) || this.options; + context.options.redirect = RedirectHandler.MANUAL_REDIRECT; + return await this.executeWithRedirect(context, redirectCount, options); + } } diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts index 5d8693c23d..9dafaa2fb5 100644 --- a/http/typescript/fetch/src/middlewares/retryHandler.ts +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -15,8 +15,7 @@ import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetc import { getRequestHeader, setRequestHeader } from "../utils/headersUtil"; import { Middleware } from "./middleware"; import { MiddlewareContext } from "./middlewareContext"; -import { MiddlewareControl } from "./middlewareControl"; -import { RetryHandlerOptions } from "./options/retryHandlerOptions"; +import { RetryHandlerOptions, RetryHandlerOptionKey } from "./options/retryHandlerOptions"; /** * @class @@ -150,18 +149,7 @@ export class RetryHandler implements Middleware { const delayMilliseconds = delaySeconds * 1000; return new Promise((resolve) => setTimeout(resolve, delayMilliseconds)); // browser or node } - - private getOptions(context: MiddlewareContext): RetryHandlerOptions { - let options: RetryHandlerOptions; - if (context.middlewareControl instanceof MiddlewareControl) { - options = context.middlewareControl.getMiddlewareOptions(RetryHandlerOptions) as RetryHandlerOptions; - } - if (!options) { - options = Object.assign(new RetryHandlerOptions(), this.options); - } - return options; - } - + /** * @private * @async @@ -171,12 +159,12 @@ export class RetryHandler implements Middleware { * @param {RetryHandlerOptions} options - The retry middleware options instance * @returns A Promise that resolves to nothing */ - private async executeWithRetry(context: MiddlewareContext, retryAttempts: number, options: RetryHandlerOptions): Promise { - await this.next.execute(context); - if (retryAttempts < options.maxRetries && this.isRetry(context.response) && this.isBuffered(context.request, context.options) && options.shouldRetry(options.delay, retryAttempts, context.request, context.options, context.response)) { + private async executeWithRetry(context: MiddlewareContext, retryAttempts: number, options: RetryHandlerOptions): Promise { + const response = await this.next.execute(context); + if (retryAttempts < options.maxRetries && this.isRetry(response) && this.isBuffered(context.request, context.options) && options.shouldRetry(options.delay, retryAttempts, context.request, context.options, response)) { ++retryAttempts; setRequestHeader(context.options, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); - const delay = this.getDelay(context.response, retryAttempts, options.delay); + const delay = this.getDelay(response, retryAttempts, options.delay); await this.sleep(delay); return await this.executeWithRetry(context, retryAttempts, options); } else { @@ -191,9 +179,9 @@ export class RetryHandler implements Middleware { * @param {Context} context - The context object of the request * @returns A Promise that resolves to nothing */ - public async execute(context: MiddlewareContext): Promise { + public async execute(context: MiddlewareContext): Promise { const retryAttempts = 0; - const options: RetryHandlerOptions = this.getOptions(context); + const options:RetryHandlerOptions = (context?.middlewareOptions && context.middlewareOptions[RetryHandlerOptionKey]) || this.options; return await this.executeWithRetry(context, retryAttempts, options); } } diff --git a/http/typescript/fetch/src/utils/headersUtil.ts b/http/typescript/fetch/src/utils/headersUtil.ts index e39895bf72..3a3dbadaa8 100644 --- a/http/typescript/fetch/src/utils/headersUtil.ts +++ b/http/typescript/fetch/src/utils/headersUtil.ts @@ -20,11 +20,10 @@ import { FetchRequestInit } from "./fetchDefinitions"; * @returns A header value for the given key from the request */ export const getRequestHeader = (options: FetchRequestInit | undefined, key: string): string | null => { - let value: string = null; if (typeof options !== "undefined" && options.headers !== undefined) { - value = options.headers[key]; + return options.headers[key]; } - return value; + return undefined; }; /** diff --git a/http/typescript/package-lock.json b/http/typescript/package-lock.json deleted file mode 100644 index 48e341a095..0000000000 --- a/http/typescript/package-lock.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "lockfileVersion": 1 -} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 501d74f81c..0000000000 --- a/package-lock.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "typescript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", - "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==" - } - } -} From e6dcdce71509d55a124eb3f12d645e9694624f2f Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Wed, 27 Oct 2021 19:41:46 -0700 Subject: [PATCH 19/34] updating tests --- .../typescript/src/requestInformation.ts | 12 +- http/typescript/fetch/.vscode/launch.json | 20 + http/typescript/fetch/package-lock.json | 903 +++++++++++++++++- http/typescript/fetch/package.json | 4 +- http/typescript/fetch/src/browser/index.ts | 1 - .../fetch/src/fetchRequestAdapter.ts | 385 ++++---- http/typescript/fetch/src/httpClient.ts | 164 ++-- http/typescript/fetch/src/index.ts | 3 +- .../fetch/src/kiotaClientFactory.ts | 6 +- .../src/middlewares/MiddlewareControl.ts | 64 -- .../browser/defaultFetchHandler.ts | 2 +- .../middlewares/browser/middlewareFactory.ts | 2 + .../src/middlewares/customFetchHandler.ts | 5 +- .../src/middlewares/defaultFetchHandler.ts | 2 +- .../src/middlewares/middlewareContext.ts | 7 +- .../src/middlewares/middlewareFactory.ts | 2 +- .../options/redirectHandlerOptions.ts | 2 +- .../fetch/src/middlewares/redirectHandler.ts | 345 +++---- .../fetch/src/middlewares/retryHandler.ts | 12 +- .../fetch/src/utils/fetchDefinitions.ts | 8 +- .../fetch/test/browser/httpClient.ts | 2 +- http/typescript/fetch/test/browser/index.ts | 8 +- .../test/common/middleware/RetryHandler.ts | 82 +- .../common/middleware/dummyFetchHandler.ts | 4 +- .../{MiddlewareUtil.ts => headersUtil.ts} | 0 .../fetch/test/node/RedirectHandler.ts | 147 ++- .../fetch/test/node/RedirectHandlerOptions.ts | 2 +- 27 files changed, 1540 insertions(+), 654 deletions(-) create mode 100644 http/typescript/fetch/.vscode/launch.json delete mode 100644 http/typescript/fetch/src/middlewares/MiddlewareControl.ts rename http/typescript/fetch/test/common/middleware/{MiddlewareUtil.ts => headersUtil.ts} (100%) diff --git a/abstractions/typescript/src/requestInformation.ts b/abstractions/typescript/src/requestInformation.ts index 45d529fbf6..a968bfc444 100644 --- a/abstractions/typescript/src/requestInformation.ts +++ b/abstractions/typescript/src/requestInformation.ts @@ -45,17 +45,13 @@ export class RequestInformation { public headers: Record; //TODO: case insensitive /** - * /TODO: case insensitive - * TODO: Determine the scope of request options - * Request Options should also consider specific request configurations such as : - * Axios : https://axios-http.com/docs/req_config - * Fetch Request Options : https://developer.mozilla.org/en-US/docs/Web/API/Request#properties - * https://github.com/microsoftgraph/msgraph-sdk-javascript/pull/105 + * @private + * Additional request options */ private _requestOptions: Record = {}; /** Gets the request options for the request. */ - public getRequestOptions(): Record { - return this._requestOptions; + public getRequestOptions(): RequestOption[] { + return Object.values(this._requestOptions); } public addRequestOptions(...options: RequestOption[]) { if (!options || options.length === 0) return; diff --git a/http/typescript/fetch/.vscode/launch.json b/http/typescript/fetch/.vscode/launch.json new file mode 100644 index 0000000000..6b7f670222 --- /dev/null +++ b/http/typescript/fetch/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [{ + "args": [ + "${workspaceFolder}/dist/cjs/test/node/*.js" + ], + "internalConsoleOptions": "openOnSessionStart", + "name": "Mocha Tests", + "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", + "request": "launch", + "skipFiles": [ + "/**" + ], + "type": "pwa-node" + } + ] +} \ No newline at end of file diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index f9f2f4a090..17fa5298bf 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -661,11 +661,125 @@ "to-fast-properties": "^2.0.0" } }, + "@eslint/eslintrc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.3.tgz", + "integrity": "sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.0.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", + "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==" + }, "@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@rollup/plugin-commonjs": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.0.tgz", @@ -751,6 +865,11 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + }, "@types/mocha": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", @@ -782,6 +901,143 @@ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==" }, + "@typescript-eslint/eslint-plugin": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.0.0.tgz", + "integrity": "sha512-T6V6fCD2U0YesOedvydTnrNtsC8E+c2QzpawIpDdlaObX0OX5dLo7tLU5c64FhTZvA1Xrdim+cXDI7NPsVx8Cg==", + "requires": { + "@typescript-eslint/experimental-utils": "5.0.0", + "@typescript-eslint/scope-manager": "5.0.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.0.0.tgz", + "integrity": "sha512-Dnp4dFIsZcPawD6CT1p5NibNUQyGSEz80sULJZkyhyna8AEqArmfwMwJPbmKzWVo4PabqNVzHYlzmcdLQWk+pg==", + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "5.0.0", + "@typescript-eslint/types": "5.0.0", + "@typescript-eslint/typescript-estree": "5.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.0.0.tgz", + "integrity": "sha512-B6D5rmmQ14I1fdzs71eL3DAuvnPHTY/t7rQABrL9BLnx/H51Un8ox1xqYAchs0/V2trcoyxB1lMJLlrwrJCDgw==", + "requires": { + "@typescript-eslint/scope-manager": "5.0.0", + "@typescript-eslint/types": "5.0.0", + "@typescript-eslint/typescript-estree": "5.0.0", + "debug": "^4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.0.0.tgz", + "integrity": "sha512-5RFjdA/ain/MDUHYXdF173btOKncIrLuBmA9s6FJhzDrRAyVSA+70BHg0/MW6TE+UiKVyRtX91XpVS0gVNwVDQ==", + "requires": { + "@typescript-eslint/types": "5.0.0", + "@typescript-eslint/visitor-keys": "5.0.0" + } + }, + "@typescript-eslint/types": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.0.0.tgz", + "integrity": "sha512-dU/pKBUpehdEqYuvkojmlv0FtHuZnLXFBn16zsDmlFF3LXkOpkAQ2vrKc3BidIIve9EMH2zfTlxqw9XM0fFN5w==" + }, + "@typescript-eslint/typescript-estree": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.0.0.tgz", + "integrity": "sha512-V/6w+PPQMhinWKSn+fCiX5jwvd1vRBm7AX7SJQXEGQtwtBvjMPjaU3YTQ1ik2UF1u96X7tsB96HMnulG3eLi9Q==", + "requires": { + "@typescript-eslint/types": "5.0.0", + "@typescript-eslint/visitor-keys": "5.0.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.0.0.tgz", + "integrity": "sha512-yRyd2++o/IrJdyHuYMxyFyBhU762MRHQ/bAGQeTnN3pGikfh+nEmM61XTqaDH1XDp53afZ+waXrk0ZvenoZ6xw==", + "requires": { + "@typescript-eslint/types": "5.0.0", + "eslint-visitor-keys": "^3.0.0" + } + }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -801,11 +1057,27 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==" }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -838,6 +1110,11 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -1093,6 +1370,11 @@ "get-intrinsic": "^1.0.2" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, "camelcase": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", @@ -1161,7 +1443,6 @@ "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -1350,6 +1631,26 @@ "sha.js": "^2.4.8" } }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -1399,6 +1700,11 @@ "type-detect": "^4.0.0" } }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -1461,6 +1767,22 @@ } } }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, "dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -1560,6 +1882,14 @@ "base64-arraybuffer": "0.1.4" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "requires": { + "ansi-colors": "^4.1.1" + } + }, "ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", @@ -1622,16 +1952,256 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "eslint": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.1.tgz", + "integrity": "sha512-LsgcwZgQ72vZ+SMp4K6pAnk2yFDWL7Ti4pJaRvsZ0Hsw2h8ZjUIW38a9AFn2cZXdBMlScMFYYgsSp4ttFI/0bA==", + "requires": { + "@eslint/eslintrc": "^1.0.3", + "@humanwhocodes/config-array": "^0.6.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^6.0.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "eslint-scope": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", + "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==" + }, + "eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-simple-import-sort": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz", + "integrity": "sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==" + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + } + } + }, + "eslint-visitor-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", + "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==" + }, "esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" }, + "espree": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", + "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", + "requires": { + "acorn": "^8.5.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.0.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, "estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -1656,6 +2226,54 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1692,6 +2310,22 @@ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "dependencies": { + "flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" + } + } + }, "flatted": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", @@ -1722,17 +2356,16 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -1793,6 +2426,19 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, "graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", @@ -1920,6 +2566,25 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2276,6 +2941,16 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -2424,6 +3099,15 @@ } } }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2442,6 +3126,11 @@ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "log-symbols": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", @@ -2501,6 +3190,14 @@ } } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", @@ -2537,6 +3234,20 @@ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -2633,7 +3344,6 @@ "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -2730,6 +3440,11 @@ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -2796,6 +3511,19 @@ "wrappy": "1" } }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -2830,6 +3558,14 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, "parse-asn1": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", @@ -2862,11 +3598,21 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -2894,11 +3640,34 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==" + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "requires": { + "fast-diff": "^1.1.2" + } + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -2944,6 +3713,11 @@ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -2995,6 +3769,11 @@ "picomatch": "^2.2.1" } }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3014,6 +3793,16 @@ "path-parse": "^1.0.6" } }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, "rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", @@ -3039,10 +3828,7 @@ "rollup": { "version": "2.58.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.0.tgz", - "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==", - "requires": { - "fsevents": "~2.3.2" - } + "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==" }, "rollup-plugin-terser": { "version": "7.0.2", @@ -3065,6 +3851,14 @@ } } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3107,6 +3901,19 @@ "safe-buffer": "^5.0.1" } }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -3117,6 +3924,11 @@ "object-inspect": "^1.9.0" } }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, "socket.io": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz", @@ -3197,6 +4009,11 @@ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -3340,6 +4157,11 @@ } } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, "timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", @@ -3374,16 +4196,42 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "requires": { + "tslib": "^1.8.1" + } + }, "tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -3424,6 +4272,14 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -3468,6 +4324,11 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -3561,6 +4422,11 @@ } } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, "workerpool": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", @@ -3596,6 +4462,11 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -5270,9 +6141,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -8112,4 +8983,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index 263511760c..8134bfa150 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -68,8 +68,6 @@ "karma-firefox-launcher": "^2.1.1", "karma-mocha": "^2.0.1", "karma-typescript": "^5.5.2", - "lint": "eslint . --ext .ts", - "lint:fix": "eslint . --ext .ts --fix", "mocha": "^8.4.0", "prettier": "^1.19.1", "rollup": "^2.58.0", @@ -81,4 +79,4 @@ "publishConfig": { "registry": "https://npm.pkg.github.com" } -} \ No newline at end of file +} diff --git a/http/typescript/fetch/src/browser/index.ts b/http/typescript/fetch/src/browser/index.ts index c6a46e5a81..1c97e19eee 100644 --- a/http/typescript/fetch/src/browser/index.ts +++ b/http/typescript/fetch/src/browser/index.ts @@ -17,5 +17,4 @@ export * from "../middlewares/retryHandler"; export * from "../middlewares/options/retryHandlerOptions"; export * from "../middlewares/middlewareContext"; export * from "../middlewares/browser/middlewareFactory"; -export * from "../middlewares/middlewareControl"; export * from "../utils/headersUtil"; diff --git a/http/typescript/fetch/src/fetchRequestAdapter.ts b/http/typescript/fetch/src/fetchRequestAdapter.ts index 95ae224b21..0bdb3f85de 100644 --- a/http/typescript/fetch/src/fetchRequestAdapter.ts +++ b/http/typescript/fetch/src/fetchRequestAdapter.ts @@ -2,206 +2,209 @@ import { AuthenticationProvider, BackingStoreFactory, BackingStoreFactorySinglet import { HttpClient } from "./httpClient"; import { MiddlewareContext } from "./middlewares/middlewareContext"; -import { MiddlewareControl } from "./middlewares/middlewareControl"; import { FetchRequestInit, FetchResponse } from "./utils/fetchDefinitions"; import { URLSearchParams } from "./utils/utils"; export class FetchRequestAdapter implements RequestAdapter { - public getSerializationWriterFactory(): SerializationWriterFactory { - return this.serializationWriterFactory; - } - /** - * Instantiates a new http core service - * @param authenticationProvider the authentication provider to use. - * @param parseNodeFactory the parse node factory to deserialize responses. - * @param serializationWriterFactory the serialization writer factory to use to serialize request bodies. - * @param httpClient the http client to use to execute requests. - */ - public constructor(public readonly authenticationProvider: AuthenticationProvider, private parseNodeFactory: ParseNodeFactory = ParseNodeFactoryRegistry.defaultInstance, private serializationWriterFactory: SerializationWriterFactory = SerializationWriterFactoryRegistry.defaultInstance, private readonly httpClient: HttpClient = new HttpClient()) { - if (!authenticationProvider) { - throw new Error("authentication provider cannot be null"); - } - if (!parseNodeFactory) { - throw new Error("parse node factory cannot be null"); - } - if (!serializationWriterFactory) { - throw new Error("serialization writer factory cannot be null"); - } - if (!httpClient) { - throw new Error("http client cannot be null"); - } - } - private getResponseContentType = (response: Response): string | undefined => { - const header = response.headers.get("content-type")?.toLowerCase(); - if (!header) return undefined; - const segments = header.split(";"); - if (segments.length === 0) return undefined; - else return segments[0]; - }; - public sendCollectionOfPrimitiveAsync = async (requestInfo: RequestInformation, responseType: "string" | "number" | "boolean" | "Date", responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInfo) { - throw new Error("requestInfo cannot be null"); - } - const response = await this.getHttpResponseMessage(requestInfo); - if (responseHandler) { - return await responseHandler.handleResponseAsync(response); - } else { - switch (responseType) { - case "string": - case "number": - case "boolean": - case "Date": { - const payload = await response.arrayBuffer(); - const responseContentType = this.getResponseContentType(response); - if (!responseContentType) { - throw new Error("no response content type found for deserialization"); - } + public getSerializationWriterFactory(): SerializationWriterFactory { + return this.serializationWriterFactory; + } + /** + * Instantiates a new http core service + * @param authenticationProvider the authentication provider to use. + * @param parseNodeFactory the parse node factory to deserialize responses. + * @param serializationWriterFactory the serialization writer factory to use to serialize request bodies. + * @param httpClient the http client to use to execute requests. + */ + public constructor(public readonly authenticationProvider: AuthenticationProvider, private parseNodeFactory: ParseNodeFactory = ParseNodeFactoryRegistry.defaultInstance, private serializationWriterFactory: SerializationWriterFactory = SerializationWriterFactoryRegistry.defaultInstance, private readonly httpClient: HttpClient = new HttpClient()) { + if (!authenticationProvider) { + throw new Error("authentication provider cannot be null"); + } + if (!parseNodeFactory) { + throw new Error("parse node factory cannot be null"); + } + if (!serializationWriterFactory) { + throw new Error("serialization writer factory cannot be null"); + } + if (!httpClient) { + throw new Error("http client cannot be null"); + } + } + private getResponseContentType = (response: Response): string | undefined => { + const header = response.headers.get("content-type")?.toLowerCase(); + if (!header) return undefined; + const segments = header.split(";"); + if (segments.length === 0) return undefined; + else return segments[0]; + }; + public sendCollectionOfPrimitiveAsync = async (requestInfo: RequestInformation, responseType: "string" | "number" | "boolean" | "Date", responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInfo) { + throw new Error("requestInfo cannot be null"); + } + const response = await this.getHttpResponseMessage(requestInfo); + if (responseHandler) { + return await responseHandler.handleResponseAsync(response); + } else { + switch (responseType) { + case "string": + case "number": + case "boolean": + case "Date": { + const payload = await response.arrayBuffer(); + const responseContentType = this.getResponseContentType(response); + if (!responseContentType) { + throw new Error("no response content type found for deserialization"); + } - const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); - if (responseType === "string") { - return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; - } else if (responseType === "number") { - return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; - } else if (responseType === "boolean") { - return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; - } else if (responseType === "Date") { - return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; - } else { - throw new Error("unexpected type to deserialize"); - } - } - } - } - }; - public sendCollectionAsync = async (requestInformation: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInformation) { - throw new Error("requestInfo cannot be null"); - } - const response = await this.getHttpResponseMessage(requestInformation); - if (responseHandler) { - return await responseHandler.handleResponseAsync(response); - } else { - const payload = await response.arrayBuffer(); - const responseContentType = this.getResponseContentType(response); - if (!responseContentType) { - throw new Error("no response content type found for deserialization"); - } + const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); + if (responseType === "string") { + return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; + } else if (responseType === "number") { + return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; + } else if (responseType === "boolean") { + return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; + } else if (responseType === "Date") { + return (rootNode.getCollectionOfPrimitiveValues() as unknown) as ResponseType[]; + } else { + throw new Error("unexpected type to deserialize"); + } + } + } + } + }; + public sendCollectionAsync = async (requestInformation: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInformation) { + throw new Error("requestInfo cannot be null"); + } + const response = await this.getHttpResponseMessage(requestInformation); + if (responseHandler) { + return await responseHandler.handleResponseAsync(response); + } else { + const payload = await response.arrayBuffer(); + const responseContentType = this.getResponseContentType(response); + if (!responseContentType) { + throw new Error("no response content type found for deserialization"); + } - const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); - const result = rootNode.getCollectionOfObjectValues(type); - return (result as unknown) as ModelType[]; - } - }; - public sendAsync = async (requestInformation: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInformation) { - throw new Error("requestInfo cannot be null"); - } - const response = await this.getHttpResponseMessage(requestInformation); - if (responseHandler) { - return await responseHandler.handleResponseAsync(response); - } else { - const payload = await response.arrayBuffer(); - const responseContentType = this.getResponseContentType(response); - if (!responseContentType) { - throw new Error("no response content type found for deserialization"); - } + const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); + const result = rootNode.getCollectionOfObjectValues(type); + return (result as unknown) as ModelType[]; + } + }; + public sendAsync = async (requestInformation: RequestInformation, type: new () => ModelType, responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInformation) { + throw new Error("requestInfo cannot be null"); + } + const response = await this.getHttpResponseMessage(requestInformation); + if (responseHandler) { + return await responseHandler.handleResponseAsync(response); + } else { + const payload = await response.arrayBuffer(); + const responseContentType = this.getResponseContentType(response); + if (!responseContentType) { + throw new Error("no response content type found for deserialization"); + } - const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); - const result = rootNode.getObjectValue(type); - return (result as unknown) as ModelType; - } - }; - public sendPrimitiveAsync = async (requestInformation: RequestInformation, responseType: "string" | "number" | "boolean" | "Date" | "ReadableStream", responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInformation) { - throw new Error("requestInfo cannot be null"); - } - const response = await this.getHttpResponseMessage(requestInformation); - if (responseHandler) { - return await responseHandler.handleResponseAsync(response); - } else { - switch (responseType) { - case "ReadableStream": - return (response.body as unknown) as ResponseType; - case "string": - case "number": - case "boolean": - case "Date": { - const payload = await response.arrayBuffer(); - const responseContentType = this.getResponseContentType(response); - if (!responseContentType) { - throw new Error("no response content type found for deserialization"); - } + const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); + const result = rootNode.getObjectValue(type); + return (result as unknown) as ModelType; + } + }; + public sendPrimitiveAsync = async (requestInformation: RequestInformation, responseType: "string" | "number" | "boolean" | "Date" | "ReadableStream", responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInformation) { + throw new Error("requestInfo cannot be null"); + } + const response = await this.getHttpResponseMessage(requestInformation); + if (responseHandler) { + return await responseHandler.handleResponseAsync(response); + } else { + switch (responseType) { + case "ReadableStream": + return (response.body as unknown) as ResponseType; + case "string": + case "number": + case "boolean": + case "Date": { + const payload = await response.arrayBuffer(); + const responseContentType = this.getResponseContentType(response); + if (!responseContentType) { + throw new Error("no response content type found for deserialization"); + } - const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); - if (responseType === "string") { - return (rootNode.getStringValue() as unknown) as ResponseType; - } else if (responseType === "number") { - return (rootNode.getNumberValue() as unknown) as ResponseType; - } else if (responseType === "boolean") { - return (rootNode.getBooleanValue() as unknown) as ResponseType; - } else if (responseType === "Date") { - return (rootNode.getDateValue() as unknown) as ResponseType; - } else { - throw new Error("unexpected type to deserialize"); - } - } - } - } - }; - public sendNoResponseContentAsync = async (requestInfo: RequestInformation, responseHandler: ResponseHandler | undefined): Promise => { - if (!requestInfo) { - throw new Error("requestInfo cannot be null"); - } - const response = await this.getHttpResponseMessage(requestInfo); - if (responseHandler) { - return await responseHandler.handleResponseAsync(response); - } - }; - public enableBackingStore = (backingStoreFactory?: BackingStoreFactory | undefined): void => { - this.parseNodeFactory = enableBackingStoreForParseNodeFactory(this.parseNodeFactory); - this.serializationWriterFactory = enableBackingStoreForSerializationWriterFactory(this.serializationWriterFactory); - if (!this.serializationWriterFactory || !this.parseNodeFactory) { - throw new Error("unable to enable backing store"); - } - if (backingStoreFactory) { - BackingStoreFactorySingleton.instance = backingStoreFactory; - } - }; - private getHttpResponseMessage = async (requestInfo: RequestInformation): Promise => { - if (!requestInfo) { - throw new Error("requestInfo cannot be null"); - } - await this.authenticationProvider.authenticateRequest(requestInfo); + const rootNode = this.parseNodeFactory.getRootParseNode(responseContentType, payload); + if (responseType === "string") { + return (rootNode.getStringValue() as unknown) as ResponseType; + } else if (responseType === "number") { + return (rootNode.getNumberValue() as unknown) as ResponseType; + } else if (responseType === "boolean") { + return (rootNode.getBooleanValue() as unknown) as ResponseType; + } else if (responseType === "Date") { + return (rootNode.getDateValue() as unknown) as ResponseType; + } else { + throw new Error("unexpected type to deserialize"); + } + } + } + } + }; + public sendNoResponseContentAsync = async (requestInfo: RequestInformation, responseHandler: ResponseHandler | undefined): Promise => { + if (!requestInfo) { + throw new Error("requestInfo cannot be null"); + } + const response = await this.getHttpResponseMessage(requestInfo); + if (responseHandler) { + return await responseHandler.handleResponseAsync(response); + } + }; + public enableBackingStore = (backingStoreFactory?: BackingStoreFactory | undefined): void => { + this.parseNodeFactory = enableBackingStoreForParseNodeFactory(this.parseNodeFactory); + this.serializationWriterFactory = enableBackingStoreForSerializationWriterFactory(this.serializationWriterFactory); + if (!this.serializationWriterFactory || !this.parseNodeFactory) { + throw new Error("unable to enable backing store"); + } + if (backingStoreFactory) { + BackingStoreFactorySingleton.instance = backingStoreFactory; + } + }; + private getHttpResponseMessage = async (requestInfo: RequestInformation): Promise => { + if (!requestInfo) { + throw new Error("requestInfo cannot be null"); + } + await this.authenticationProvider.authenticateRequest(requestInfo); - return await this.httpClient.executeFetch(this.createContext(requestInfo)); - }; - private getRequestFromRequestInformation = (requestInfo: RequestInformation): FetchRequestInit => { - const request: FetchRequestInit = { - method: requestInfo.httpMethod?.toString(), - headers: requestInfo.headers, - body: requestInfo.content - }; - return request; - }; + return await this.httpClient.executeFetch(this.createContext(requestInfo)); + }; + private getRequestFromRequestInformation = (requestInfo: RequestInformation): FetchRequestInit => { + const request: FetchRequestInit = { + method: requestInfo.httpMethod?.toString(), + headers: requestInfo.headers, + body: requestInfo.content, + }; + return request; + }; - private getRequestUrl = (requestInformation: RequestInformation): string => { - let url = requestInformation.URI ?? ""; - if (requestInformation.queryParameters?.size ?? -1 > 0) { - const queryParametersBuilder = new URLSearchParams(); - requestInformation.queryParameters?.forEach((v, k) => { - queryParametersBuilder.append(k, `${v}`); - }); - url = url + "?" + queryParametersBuilder.toString(); - } - return url; - }; + private getRequestUrl = (requestInformation: RequestInformation): string => { + let url = requestInformation.URI ?? ""; + if (requestInformation.queryParameters?.size ?? -1 > 0) { + const queryParametersBuilder = new URLSearchParams(); + requestInformation.queryParameters?.forEach((v, k) => { + queryParametersBuilder.append(k, `${v}`); + }); + url = url + "?" + queryParametersBuilder.toString(); + } + return url; + }; - private createContext(requestInformation: RequestInformation): MiddlewareContext { - const context: MiddlewareContext = { - request: this.getRequestUrl(requestInformation), - options: this.getRequestFromRequestInformation(requestInformation), - requestOptions: requestInformation.getRequestOptions(); - }; - return context; - } + private createContext(requestInformation: RequestInformation): MiddlewareContext { + const context: MiddlewareContext = { + requestUrl: this.getRequestUrl(requestInformation), + fetchRequestInit: this.getRequestFromRequestInformation(requestInformation), + }; + const requestOptions = requestInformation.getRequestOptions(); + + requestOptions.forEach((option) => { + context.requestInformationOptions[option.getKey()] = option; + }); + return context; + } } diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index f756208288..fdf3b0c9b9 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -5,92 +5,90 @@ import { MiddlewareContext } from "./middlewares/middlewareContext"; import { MiddlewareFactory } from "./middlewares/middlewareFactory"; import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "./utils/fetchDefinitions"; - export class HttpClient { - private middleware: Middleware; - /** - * @public - * @constructor - * Creates an instance of a HttpClient which contains the middlewares and fetch implementation for request execution. - * @param {...Middleware} middleware - The first middleware of the middleware chain or a sequence of all the Middleware handlers - * If middlewares param is undefined, the httpClient instance will use the default array of middlewares. - * Set middlewares to `null` if you do not wish to use middlewares. - * If custom fetch is undefined, the httpClient instance uses the `DefaultFetchHandler` - * @param {(request: FetchRequestInfo, init?: FetchRequestInit) => Promise < FetchResponse >} custom fetch function - a Fetch API implementation - * - */ - public constructor(private customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise, ...middlewares: Middleware[]) { - // Use default middleware chain if middlewares and custom fetch function are undefined - if (!middlewares.length) { - if (this.customFetch) { - this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain(customFetch)); - } else { - this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain()); - } - } else { - if (middlewares[0] === null) { - if (!customFetch) { - this.setMiddleware(new DefaultFetchHandler()); - } - return; - } else { - if (this.customFetch) { - this.setMiddleware(...middlewares, new CustomFetchHandler(customFetch)); - } else { - this.setMiddleware(...middlewares); - } - } - } - } + private middleware: Middleware; + /** + * @public + * @constructor + * Creates an instance of a HttpClient which contains the middlewares and fetch implementation for request execution. + * @param {...Middleware} middleware - The first middleware of the middleware chain or a sequence of all the Middleware handlers + * If middlewares param is undefined, the httpClient instance will use the default array of middlewares. + * Set middlewares to `null` if you do not wish to use middlewares. + * If custom fetch is undefined, the httpClient instance uses the `DefaultFetchHandler` + * @param {(request: FetchRequestInfo, init?: FetchRequestInit) => Promise < FetchResponse >} custom fetch function - a Fetch API implementation + * + */ + public constructor(private customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise, ...middlewares: Middleware[]) { + // Use default middleware chain if middlewares and custom fetch function are undefined + if (!middlewares.length) { + if (this.customFetch) { + this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain(customFetch)); + } else { + this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain()); + } + } else { + if (middlewares[0] === null) { + if (!customFetch) { + this.setMiddleware(new DefaultFetchHandler()); + } + return; + } else { + if (this.customFetch) { + this.setMiddleware(...middlewares, new CustomFetchHandler(customFetch)); + } else { + this.setMiddleware(...middlewares); + } + } + } + } - /** - * @private - * Processes the middleware parameter passed to set this.middleware property - * The calling function should validate if middleware is not undefined or not empty. - * @param {...Middleware} middleware - The middleware passed - * @returns Nothing - */ - private setMiddleware(...middleware: Middleware[]): void { - if (middleware.length > 1) { - this.parseMiddleWareArray(middleware); - } else { - this.middleware = middleware[0]; - } - } + /** + * @private + * Processes the middleware parameter passed to set this.middleware property + * The calling function should validate if middleware is not undefined or not empty. + * @param {...Middleware} middleware - The middleware passed + * @returns Nothing + */ + private setMiddleware(...middleware: Middleware[]): void { + if (middleware.length > 1) { + this.parseMiddleWareArray(middleware); + } else { + this.middleware = middleware[0]; + } + } - /** - * @private - * Processes the middleware array to construct the chain - * and sets this.middleware property to the first middlware handler of the array - * The calling function should validate if middleware is not undefined or not empty - * @param {Middleware[]} middlewareArray - The array of middleware handlers - * @returns Nothing - */ - private parseMiddleWareArray(middlewareArray: Middleware[]) { - middlewareArray.forEach((element, index) => { - if (index < middlewareArray.length - 1) { - element.next = middlewareArray[index + 1]; - } - }); - this.middleware = middlewareArray[0]; - } + /** + * @private + * Processes the middleware array to construct the chain + * and sets this.middleware property to the first middlware handler of the array + * The calling function should validate if middleware is not undefined or not empty + * @param {Middleware[]} middlewareArray - The array of middleware handlers + * @returns Nothing + */ + private parseMiddleWareArray(middlewareArray: Middleware[]) { + middlewareArray.forEach((element, index) => { + if (index < middlewareArray.length - 1) { + element.next = middlewareArray[index + 1]; + } + }); + this.middleware = middlewareArray[0]; + } - /** - * Executes a request and returns a promise resolving the response. - * @param url the request url. - * @param options request options. - * @returns the promise resolving the response. - */ - public async executeFetch(context: MiddlewareContext): Promise { - if (this.customFetch && !this.middleware) { - return this.customFetch(context.request, context.options); - } + /** + * Executes a request and returns a promise resolving the response. + * @param url the request url. + * @param options request options. + * @returns the promise resolving the response. + */ + public async executeFetch(context: MiddlewareContext): Promise { + if (this.customFetch && !this.middleware) { + return this.customFetch(context.requestUrl, context.requestInformationOptions); + } - if (this.middleware) { - await this.middleware.execute(context); - return context.response; - } else { - throw new Error("Please provide middlewares or a custom fetch function to execute the request"); - } - } + if (this.middleware) { + return await this.middleware.execute(context); + } else { + throw new Error("Please provide middlewares or a custom fetch function to execute the request"); + } + } } diff --git a/http/typescript/fetch/src/index.ts b/http/typescript/fetch/src/index.ts index 833ac1091a..7773376e3f 100644 --- a/http/typescript/fetch/src/index.ts +++ b/http/typescript/fetch/src/index.ts @@ -14,11 +14,10 @@ export * from "./middlewares/defaultFetchHandler"; export * from "./middlewares/customFetchHandler"; export * from "./middlewares/redirectHandler"; export * from "./middlewares/retryHandler"; -export * from "./middlewares/options/redirectHandlerOption"; +export * from "./middlewares/options/redirectHandlerOptions"; export * from "./middlewares/options/retryHandlerOptions"; export * from "./middlewares/middlewareContext"; export * from "./middlewares/middlewareFactory"; -export * from "./middlewares/middlewareControl"; export * from "./utils/headersUtil"; export * from "./utils/fetchDefinitions"; export * from "./utils/utils"; diff --git a/http/typescript/fetch/src/kiotaClientFactory.ts b/http/typescript/fetch/src/kiotaClientFactory.ts index 520254023c..5a1655093a 100644 --- a/http/typescript/fetch/src/kiotaClientFactory.ts +++ b/http/typescript/fetch/src/kiotaClientFactory.ts @@ -6,12 +6,12 @@ import { MiddlewareFactory } from "./middlewares/middlewareFactory"; * @returns the default middlewares. */ export function getDefaultMiddlewares(): Middleware[] { - return MiddlewareFactory.getDefaultMiddlewareChain(); + return MiddlewareFactory.getDefaultMiddlewareChain(); } /** * Gets the default request settings to be used for the client. * @returns the default request settings. */ export function getDefaultRequestSettings(): RequestInit { - return {}; //TODO add default request settings -} \ No newline at end of file + return {}; //TODO add default request settings +} diff --git a/http/typescript/fetch/src/middlewares/MiddlewareControl.ts b/http/typescript/fetch/src/middlewares/MiddlewareControl.ts deleted file mode 100644 index b2593f4fff..0000000000 --- a/http/typescript/fetch/src/middlewares/MiddlewareControl.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @module MiddlewareControl - */ - -import { RequestOption } from "@microsoft/kiota-abstractions"; - -/** - * @class - * Class representing MiddlewareControl - */ -export class MiddlewareControl { - /** - * @private - * A member holding map of MiddlewareOptions - */ - private middlewareOptions: Map; - - /** - * @public - * @constructor - * Creates an instance of MiddlewareControl - * @param {MiddlewareOptions[]} [middlewareOptions = []] - The array of middlewareOptions - * @returns The instance of MiddlewareControl - */ - public constructor(middlewareOptions: RequestOption[] = []) { - this.middlewareOptions = new Map(); - for (const option of middlewareOptions) { - const fn = option.constructor; - this.middlewareOptions.set(fn, option); - } - } - - /** - * @public - * To get the middleware option using the class of the option - * @param {Function} fn - The class of the strongly typed option class - * @returns The middleware option - * @example - * // if you wanted to return the middleware option associated with this class (MiddlewareControl) - * // call this function like this: - * getMiddlewareOptions(MiddlewareControl) - */ - public getMiddlewareOptions(fn: Function): RequestOption { - return this.middlewareOptions.get(fn); - } - - /** - * @public - * To set the middleware options using the class of the option - * @param {Function} fn - The class of the strongly typed option class - * @param {MiddlewareOptions} option - The strongly typed middleware option - * @returns nothing - */ - public setMiddlewareOptions(fn: Function, option: RequestOption): void { - this.middlewareOptions.set(fn, option); - } -} diff --git a/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts b/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts index 0a9f1009b1..966bcdd4b4 100644 --- a/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts @@ -33,6 +33,6 @@ export class DefaultFetchHandler implements Middleware { * @returns A promise that resolves to nothing */ public async execute(context: MiddlewareContext): Promise { - return (await fetch(context.request, context.options as RequestInit)) as FetchResponse; + return (await fetch(context.requestUrl, context.fetchRequestInit as RequestInit)) as FetchResponse; } } diff --git a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts index da905ca5c5..fd368e488c 100644 --- a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts @@ -29,6 +29,8 @@ export class MiddlewareFactory { * @returns an array of the middleware handlers of the default middleware chain */ public static getDefaultMiddlewareChain(customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise): Middleware[] { + // Browsers handles redirection automatically and do not require the redirectionHandler + const middlewareArray: Middleware[] = []; const retryHandler = new RetryHandler(new RetryHandlerOptions()); middlewareArray.push(retryHandler); diff --git a/http/typescript/fetch/src/middlewares/customFetchHandler.ts b/http/typescript/fetch/src/middlewares/customFetchHandler.ts index 0244dfa407..35b1fd12bf 100644 --- a/http/typescript/fetch/src/middlewares/customFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/customFetchHandler.ts @@ -35,8 +35,7 @@ export class CustomFetchHandler implements Middleware { * @param {Context} context - The request context object * @returns A promise that resolves to nothing */ - public async execute(context: MiddlewareContext): Promise { - context.response = (await this.customFetch(context.request, context.options)) as FetchResponse; - return; + public async execute(context: MiddlewareContext): Promise { + return await this.customFetch(context.requestUrl, context.fetchRequestInit); } } diff --git a/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts b/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts index 44dae962d7..ac3db6f0e7 100644 --- a/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts @@ -36,6 +36,6 @@ export class DefaultFetchHandler implements Middleware { * @returns A promise that resolves to nothing */ public async execute(context: MiddlewareContext): Promise { - return (await fetch(context.request, context.options)) as FetchResponse; + return (await fetch(context.requestUrl, context.fetchRequestInit)) as FetchResponse; } } diff --git a/http/typescript/fetch/src/middlewares/middlewareContext.ts b/http/typescript/fetch/src/middlewares/middlewareContext.ts index a086bb82cc..4ba826783b 100644 --- a/http/typescript/fetch/src/middlewares/middlewareContext.ts +++ b/http/typescript/fetch/src/middlewares/middlewareContext.ts @@ -6,6 +6,7 @@ */ import { RequestOption } from "@microsoft/kiota-abstractions"; + import { FetchRequestInfo, FetchRequestInit } from "../utils/fetchDefinitions"; /** @@ -17,7 +18,7 @@ import { FetchRequestInfo, FetchRequestInit } from "../utils/fetchDefinitions"; */ export interface MiddlewareContext { - request: FetchRequestInfo; - options?: FetchRequestInit; - middlewareOptions?: Record; // this can get updated depending on the use of request options + requestUrl: FetchRequestInfo; + fetchRequestInit?: FetchRequestInit; + requestInformationOptions?: Record; // this can get updated depending on the use of request options } diff --git a/http/typescript/fetch/src/middlewares/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/middlewareFactory.ts index cb300fbdf6..56b1c95d54 100644 --- a/http/typescript/fetch/src/middlewares/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/middlewareFactory.ts @@ -13,7 +13,7 @@ import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetc import { CustomFetchHandler } from "./customFetchHandler"; import { DefaultFetchHandler } from "./defaultFetchHandler"; import { Middleware } from "./middleware"; -import { RedirectHandlerOptions } from "./options/redirectHandlerOption"; +import { RedirectHandlerOptions } from "./options/redirectHandlerOptions"; import { RetryHandlerOptions } from "./options/retryHandlerOptions"; import { RedirectHandler } from "./redirectHandler"; import { RetryHandler } from "./retryHandler"; diff --git a/http/typescript/fetch/src/middlewares/options/redirectHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/redirectHandlerOptions.ts index 4dce617db3..2679bd41a8 100644 --- a/http/typescript/fetch/src/middlewares/options/redirectHandlerOptions.ts +++ b/http/typescript/fetch/src/middlewares/options/redirectHandlerOptions.ts @@ -67,7 +67,7 @@ export class RedirectHandlerOptions implements RequestOption { this.shouldRedirect = shouldRedirect; } - public getKey(): string { + public getKey(): string { return RedirectHandlerOptionKey; } } diff --git a/http/typescript/fetch/src/middlewares/redirectHandler.ts b/http/typescript/fetch/src/middlewares/redirectHandler.ts index 04f7df40e1..5bf822b67f 100644 --- a/http/typescript/fetch/src/middlewares/redirectHandler.ts +++ b/http/typescript/fetch/src/middlewares/redirectHandler.ts @@ -23,176 +23,177 @@ import { RedirectHandlerOptionKey, RedirectHandlerOptions } from "./options/redi * Class representing RedirectHandler */ export class RedirectHandler implements Middleware { - /** - * @private - * @static - * A member holding the array of redirect status codes - */ - private static REDIRECT_STATUS_CODES: Set = new Set([ - 301, // Moved Permanently - 302, // Found - 303, // See Other - 307, // Temporary Permanently - 308, // Moved Permanently - ]); - - /** - * @private - * @static - * A member holding SeeOther status code - */ - private static STATUS_CODE_SEE_OTHER = 303; - - /** - * @private - * @static - * A member holding the name of the location header - */ - private static LOCATION_HEADER = "Location"; - - /** - * @private - * @static - * A member representing the authorization header name - */ - private static AUTHORIZATION_HEADER = "Authorization"; - - /** - * @private - * @static - * A member holding the manual redirect value - */ - private static MANUAL_REDIRECT = "manual"; - - /** Next middleware to be executed*/ - next: Middleware | undefined; - /** - * - * @public - * @constructor - * To create an instance of RedirectHandler - * @param {RedirectHandlerOptions} [options = new RedirectHandlerOptions()] - The redirect handler options instance - * @returns An instance of RedirectHandler - */ - - public constructor(private options: RedirectHandlerOptions = new RedirectHandlerOptions()) { - this.options = options; - } - - /** - * @private - * To check whether the response has the redirect status code or not - * @param {Response} response - The response object - * @returns A boolean representing whether the response contains the redirect status code or not - */ - private isRedirect(response: FetchResponse): boolean { - return RedirectHandler.REDIRECT_STATUS_CODES.has(response.status); - } - - /** - * @private - * To check whether the response has location header or not - * @param {Response} response - The response object - * @returns A boolean representing the whether the response has location header or not - */ - private hasLocationHeader(response: FetchResponse): boolean { - return response.headers.has(RedirectHandler.LOCATION_HEADER); - } - - /** - * @private - * To get the redirect url from location header in response object - * @param {Response} response - The response object - * @returns A redirect url from location header - */ - private getLocationHeader(response: FetchResponse): string { - return response.headers.get(RedirectHandler.LOCATION_HEADER); - } - - /** - * @private - * To check whether the given url is a relative url or not - * @param {string} url - The url string value - * @returns A boolean representing whether the given url is a relative url or not - */ - private isRelativeURL(url: string): boolean { - return url.indexOf("://") === -1; - } - - /** - * @private - * To check whether the authorization header in the request should be dropped for consequent redirected requests - * @param {string} requestUrl - The request url value - * @param {string} redirectUrl - The redirect url value - * @returns A boolean representing whether the authorization header in the request should be dropped for consequent redirected requests - */ - private shouldDropAuthorizationHeader(requestUrl: string, redirectUrl: string): boolean { - const schemeHostRegex = /^[A-Za-z].+?:\/\/.+?(?=\/|$)/; - const requestMatches: string[] = schemeHostRegex.exec(requestUrl); - let requestAuthority: string; - let redirectAuthority: string; - if (requestMatches !== null) { - requestAuthority = requestMatches[0]; - } - const redirectMatches: string[] = schemeHostRegex.exec(redirectUrl); - if (redirectMatches !== null) { - redirectAuthority = redirectMatches[0]; - } - return typeof requestAuthority !== "undefined" && typeof redirectAuthority !== "undefined" && requestAuthority !== redirectAuthority; - } - - /** - * @private - * @async - * To update a request url with the redirect url - * @param {string} redirectUrl - The redirect url value - * @param {Context} context - The context object value - * @returns Nothing - */ - private async updateRequestUrl(redirectUrl: string, context: MiddlewareContext): Promise { - context.request = redirectUrl; - } - - /** - * @private - * @async - * To execute the next middleware and to handle in case of redirect response returned by the server - * @param {Context} context - The context object - * @param {number} redirectCount - The redirect count value - * @param {RedirectHandlerOptions} options - The redirect handler options instance - * @returns A promise that resolves to nothing - */ - private async executeWithRedirect(context: MiddlewareContext, redirectCount: number, options: RedirectHandlerOptions): Promise { - const response = await this.next.execute(context); - if (redirectCount < options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && options.shouldRedirect(response)) { - ++redirectCount; - if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { - context.options["method"] = HttpMethod.GET; - delete context.options.body; - } else { - const redirectUrl: string = this.getLocationHeader(response); - if (!this.isRelativeURL(redirectUrl) && this.shouldDropAuthorizationHeader(response.url, redirectUrl)) { - delete context.options.headers[RedirectHandler.AUTHORIZATION_HEADER]; - } - await this.updateRequestUrl(redirectUrl, context); - } - await this.executeWithRedirect(context, redirectCount, options); - } else { - return; - } - } - - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The context object of the request - * @returns A Promise that resolves to nothing - */ - public async execute(context: MiddlewareContext): Promise { - const redirectCount = 0; - const options:RedirectHandlerOptions = (context?.middlewareOptions && context.middlewareOptions[RedirectHandlerOptionKey]) || this.options; - context.options.redirect = RedirectHandler.MANUAL_REDIRECT; - return await this.executeWithRedirect(context, redirectCount, options); - } + /** + * @private + * @static + * A member holding the array of redirect status codes + */ + private static REDIRECT_STATUS_CODES: Set = new Set([ + 301, // Moved Permanently + 302, // Found + 303, // See Other + 307, // Temporary Permanently + 308, // Moved Permanently + ]); + + /** + * @private + * @static + * A member holding SeeOther status code + */ + private static STATUS_CODE_SEE_OTHER = 303; + + /** + * @private + * @static + * A member holding the name of the location header + */ + private static LOCATION_HEADER = "Location"; + + /** + * @private + * @static + * A member representing the authorization header name + */ + private static AUTHORIZATION_HEADER = "Authorization"; + + /** + * @private + * @static + * A member holding the manual redirect value + */ + private static MANUAL_REDIRECT = "manual"; + + /** Next middleware to be executed*/ + next: Middleware | undefined; + /** + * + * @public + * @constructor + * To create an instance of RedirectHandler + * @param {RedirectHandlerOptions} [options = new RedirectHandlerOptions()] - The redirect handler options instance + * @returns An instance of RedirectHandler + */ + + public constructor(private options: RedirectHandlerOptions = new RedirectHandlerOptions()) { + this.options = options; + } + + /** + * @private + * To check whether the response has the redirect status code or not + * @param {Response} response - The response object + * @returns A boolean representing whether the response contains the redirect status code or not + */ + private isRedirect(response: FetchResponse): boolean { + return RedirectHandler.REDIRECT_STATUS_CODES.has(response.status); + } + + /** + * @private + * To check whether the response has location header or not + * @param {Response} response - The response object + * @returns A boolean representing the whether the response has location header or not + */ + private hasLocationHeader(response: FetchResponse): boolean { + return response.headers.has(RedirectHandler.LOCATION_HEADER); + } + + /** + * @private + * To get the redirect url from location header in response object + * @param {Response} response - The response object + * @returns A redirect url from location header + */ + private getLocationHeader(response: FetchResponse): string { + return response.headers.get(RedirectHandler.LOCATION_HEADER); + } + + /** + * @private + * To check whether the given url is a relative url or not + * @param {string} url - The url string value + * @returns A boolean representing whether the given url is a relative url or not + */ + private isRelativeURL(url: string): boolean { + return url.indexOf("://") === -1; + } + + /** + * @private + * To check whether the authorization header in the request should be dropped for consequent redirected requests + * @param {string} requestUrl - The request url value + * @param {string} redirectUrl - The redirect url value + * @returns A boolean representing whether the authorization header in the request should be dropped for consequent redirected requests + */ + private shouldDropAuthorizationHeader(requestUrl: string, redirectUrl: string): boolean { + const schemeHostRegex = /^[A-Za-z].+?:\/\/.+?(?=\/|$)/; + const requestMatches: string[] = schemeHostRegex.exec(requestUrl); + let requestAuthority: string; + let redirectAuthority: string; + if (requestMatches !== null) { + requestAuthority = requestMatches[0]; + } + const redirectMatches: string[] = schemeHostRegex.exec(redirectUrl); + if (redirectMatches !== null) { + redirectAuthority = redirectMatches[0]; + } + return typeof requestAuthority !== "undefined" && typeof redirectAuthority !== "undefined" && requestAuthority !== redirectAuthority; + } + + /** + * @private + * @async + * To update a request url with the redirect url + * @param {string} redirectUrl - The redirect url value + * @param {Context} context - The context object value + * @returns Nothing + */ + private updateRequestUrl(redirectUrl: string, context: MiddlewareContext) { + context.requestUrl = redirectUrl; + } + + /** + * @private + * @async + * To execute the next middleware and to handle in case of redirect response returned by the server + * @param {Context} context - The context object + * @param {number} redirectCount - The redirect count value + * @param {RedirectHandlerOptions} options - The redirect handler options instance + * @returns A promise that resolves to nothing + */ + private async executeWithRedirect(context: MiddlewareContext, redirectCount: number, options: RedirectHandlerOptions): Promise { + const response = await this.next.execute(context); + if (redirectCount < options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && options.shouldRedirect(response)) { + ++redirectCount; + if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { + context.fetchRequestInit["method"] = HttpMethod.GET; + delete context.fetchRequestInit.body; + } else { + const redirectUrl: string = this.getLocationHeader(response); + if (context.fetchRequestInit.headers && !this.isRelativeURL(redirectUrl) && this.shouldDropAuthorizationHeader(context.requestUrl, redirectUrl)) { + delete context.fetchRequestInit.headers[RedirectHandler.AUTHORIZATION_HEADER]; + } + this.updateRequestUrl(redirectUrl, context); + } + return await this.executeWithRedirect(context, redirectCount, options); + } else { + return response; + } + } + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The context object of the request + * @returns A Promise that resolves to nothing + */ + public async execute(context: MiddlewareContext): Promise { + const redirectCount = 0; + const options: RedirectHandlerOptions = ((context?.requestInformationOptions && context.requestInformationOptions[RedirectHandlerOptionKey]) as RedirectHandlerOptions) || this.options; + context.fetchRequestInit.redirect = RedirectHandler.MANUAL_REDIRECT; + const response = await this.executeWithRedirect(context, redirectCount, options); + return response; + } } diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts index 9dafaa2fb5..5cfd3b0059 100644 --- a/http/typescript/fetch/src/middlewares/retryHandler.ts +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -15,7 +15,7 @@ import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetc import { getRequestHeader, setRequestHeader } from "../utils/headersUtil"; import { Middleware } from "./middleware"; import { MiddlewareContext } from "./middlewareContext"; -import { RetryHandlerOptions, RetryHandlerOptionKey } from "./options/retryHandlerOptions"; +import { RetryHandlerOptionKey, RetryHandlerOptions } from "./options/retryHandlerOptions"; /** * @class @@ -149,7 +149,7 @@ export class RetryHandler implements Middleware { const delayMilliseconds = delaySeconds * 1000; return new Promise((resolve) => setTimeout(resolve, delayMilliseconds)); // browser or node } - + /** * @private * @async @@ -161,14 +161,14 @@ export class RetryHandler implements Middleware { */ private async executeWithRetry(context: MiddlewareContext, retryAttempts: number, options: RetryHandlerOptions): Promise { const response = await this.next.execute(context); - if (retryAttempts < options.maxRetries && this.isRetry(response) && this.isBuffered(context.request, context.options) && options.shouldRetry(options.delay, retryAttempts, context.request, context.options, response)) { + if (retryAttempts < options.maxRetries && this.isRetry(response) && this.isBuffered(context.requestUrl, context.fetchRequestInit) && options.shouldRetry(options.delay, retryAttempts, context.requestUrl, context.fetchRequestInit, response)) { ++retryAttempts; - setRequestHeader(context.options, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); + setRequestHeader(context.fetchRequestInit, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); const delay = this.getDelay(response, retryAttempts, options.delay); await this.sleep(delay); return await this.executeWithRetry(context, retryAttempts, options); } else { - return; + return response; } } @@ -181,7 +181,7 @@ export class RetryHandler implements Middleware { */ public async execute(context: MiddlewareContext): Promise { const retryAttempts = 0; - const options:RetryHandlerOptions = (context?.middlewareOptions && context.middlewareOptions[RetryHandlerOptionKey]) || this.options; + const options: RetryHandlerOptions = ((context?.requestInformationOptions && context.requestInformationOptions[RetryHandlerOptionKey]) as RetryHandlerOptions) || this.options; return await this.executeWithRetry(context, retryAttempts, options); } } diff --git a/http/typescript/fetch/src/utils/fetchDefinitions.ts b/http/typescript/fetch/src/utils/fetchDefinitions.ts index 55d7fd0ecf..8799dd4f2d 100644 --- a/http/typescript/fetch/src/utils/fetchDefinitions.ts +++ b/http/typescript/fetch/src/utils/fetchDefinitions.ts @@ -1,4 +1,3 @@ - /** * ------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. @@ -7,13 +6,12 @@ */ // fetch() will only be called using string requests along with options -export type FetchRequestInfo = string; - +export type FetchRequestInfo = string; /** * Use Record type to store request headers. - * Node and browser have different implementations of `Headers`. - * Record type is used to store headers in most http request and fetch libraries. + * Node and browser have different implementations of `Headers`. + * Record type is used to store headers in most http request and fetch libraries. */ export type FetchHeadersInit = Record; diff --git a/http/typescript/fetch/test/browser/httpClient.ts b/http/typescript/fetch/test/browser/httpClient.ts index f71da4efdf..f71d6a37ad 100644 --- a/http/typescript/fetch/test/browser/httpClient.ts +++ b/http/typescript/fetch/test/browser/httpClient.ts @@ -66,4 +66,4 @@ describe("HTTPClient.ts", () => { assert.equal(client["customFetch"], dummyCustomFetch); }); }); -}); \ No newline at end of file +}); diff --git a/http/typescript/fetch/test/browser/index.ts b/http/typescript/fetch/test/browser/index.ts index 95d0822714..1ca81205ae 100644 --- a/http/typescript/fetch/test/browser/index.ts +++ b/http/typescript/fetch/test/browser/index.ts @@ -1,5 +1,5 @@ -export * from "./MiddlewareFactory"; -export * from "../common/middleware/MiddlewareUtil"; -export * from "../common/middleware/RetryHandler"; -export * from "../common/middleware/RetryHandlerOptions"; +export * from "./middlewareFactory"; +export * from "../common/middleware/headersUtil"; +export * from "../common/middleware/retryHandler"; +export * from "../common/middleware/retryHandlerOptions"; export * from "./httpClient"; diff --git a/http/typescript/fetch/test/common/middleware/RetryHandler.ts b/http/typescript/fetch/test/common/middleware/RetryHandler.ts index d669e95422..5078a928f0 100644 --- a/http/typescript/fetch/test/common/middleware/RetryHandler.ts +++ b/http/typescript/fetch/test/common/middleware/RetryHandler.ts @@ -7,8 +7,7 @@ import { assert } from "chai"; import { MiddlewareContext } from "../../../src/middlewares/middlewareContext"; -import { MiddlewareControl } from "../../../src/middlewares/middlewareControl"; -import { RetryHandlerOptions, ShouldRetry } from "../../../src/middlewares/options/retryHandlerOptions"; +import { RetryHandlerOptionKey, RetryHandlerOptions, ShouldRetry } from "../../../src/middlewares/options/retryHandlerOptions"; import { RetryHandler } from "../../../src/middlewares/retryHandler"; import { FetchRequestInit } from "../../../src/utils/fetchDefinitions"; import { getResponse } from "../../testUtils"; @@ -156,60 +155,73 @@ describe("RetryHandler.ts", function() { }); }); - describe("getOptions", () => { - it("Should return the options in the context object", () => { - const delay = 10; - const maxRetries = 8; + const options = new RetryHandlerOptions(); + const handler = new RetryHandler(options); + const dummyFetchHandler = new DummyFetchHandler(); + + describe("set RedirectOptions in RequestInformation", () => { + it("Should set the RedirectOptions from the context object", async () => { + const delay = 1; + const maxRetries = 2; const shouldRetry: ShouldRetry = () => false; const options = new RetryHandlerOptions(delay, maxRetries, shouldRetry); const cxt: MiddlewareContext = { - request: "url", - middlewareControl: new MiddlewareControl([options]), + requestUrl: "url", + fetchRequestInit: { + method: "PUT", + headers: { + "Content-Type": "application/octet-stream", + }, + }, + requestInformationOptions: { + [RetryHandlerOptionKey]: options, + }, }; - const o = retryHandler["getOptions"](cxt); - assert.equal(o.delay, delay); - assert.equal(o.maxRetries, maxRetries); - assert.equal(o.shouldRetry, shouldRetry); + dummyFetchHandler.setResponses([new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); + const response = await handler["execute"](cxt); + assert.equal(response.status, 429); }); - it("Should return the default set of options in the middleware", () => { + it("Should use the default set of options", async () => { const cxt: MiddlewareContext = { - request: "url", + requestUrl: "url", + fetchRequestInit: { + method: "PUT", + headers: { + "Content-Type": "application/octet-stream", + }, + }, }; - const o = retryHandler["getOptions"](cxt); - assert.equal(o.delay, retryHandler["options"].delay); - assert.equal(o.maxRetries, retryHandler["options"].maxRetries); - assert.equal(o.shouldRetry, retryHandler["options"].shouldRetry); + dummyFetchHandler.setResponses([new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); + const response = await handler["execute"](cxt); + assert.equal(response.status, 429); }); }); describe("executeWithRetry", async () => { - const options = new RetryHandlerOptions(); - const handler = new RetryHandler(options); - const dummyFetchHandler = new DummyFetchHandler(); handler.next = dummyFetchHandler; const cxt: MiddlewareContext = { - request: "url", - options: { + requestUrl: "url", + fetchRequestInit: { method: "GET", }, }; it("Should return non retried response incase of maxRetries busted out", async () => { dummyFetchHandler.setResponses([new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); - await handler["executeWithRetry"](cxt, RetryHandlerOptions["MAX_MAX_RETRIES"], options); - assert.equal(cxt.response.status, 429); + const response = await handler["executeWithRetry"](cxt, RetryHandlerOptions["MAX_MAX_RETRIES"], options); + assert.equal(response.status, 429); }); it("Should return succeeded response for non retry response", async () => { dummyFetchHandler.setResponses([new Response("ok", { status: 200 })]); - await handler["executeWithRetry"](cxt, 0, options); - assert.equal(cxt.response.status, 200); + const response = await handler["executeWithRetry"](cxt, 0, options); + assert.equal(response.status, 200); }); it("Should return non retried response for streaming request", async () => { const c: MiddlewareContext = { - request: "url", - options: { + requestUrl: "url", + fetchRequestInit: { method: "POST", headers: { "Content-Type": "application/octet-stream", @@ -217,22 +229,22 @@ describe("RetryHandler.ts", function() { }, }; dummyFetchHandler.setResponses([new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); - await handler["executeWithRetry"](c, 0, options); - assert.equal(c.response.status, 429); + const response = await handler["executeWithRetry"](c, 0, options); + assert.equal(response.status, 429); }); it("Should successfully retry and return ok response", async () => { const opts = new RetryHandlerOptions(1); dummyFetchHandler.setResponses([new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); - await handler["executeWithRetry"](cxt, 0, opts); - assert.equal(cxt.response.status, 200); + const response = await handler["executeWithRetry"](cxt, 0, opts); + assert.equal(response.status, 200); }); it("Should fail by exceeding max retries", async () => { const opts = new RetryHandlerOptions(1, 2); dummyFetchHandler.setResponses([new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); - await handler["executeWithRetry"](cxt, 0, opts); - assert.equal(cxt.response.status, 429); + const response = await handler["executeWithRetry"](cxt, 0, opts); + assert.equal(response.status, 429); }); }); }); diff --git a/http/typescript/fetch/test/common/middleware/dummyFetchHandler.ts b/http/typescript/fetch/test/common/middleware/dummyFetchHandler.ts index 5974f40c69..91f1d16157 100644 --- a/http/typescript/fetch/test/common/middleware/dummyFetchHandler.ts +++ b/http/typescript/fetch/test/common/middleware/dummyFetchHandler.ts @@ -54,8 +54,8 @@ export class DummyFetchHandler implements Middleware { * @param {Context} context - The request context object * @returns A promise that resolves to nothing */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars public async execute(context: MiddlewareContext) { - context.response = this.responses.shift(); - return; + return this.responses.shift(); } } diff --git a/http/typescript/fetch/test/common/middleware/MiddlewareUtil.ts b/http/typescript/fetch/test/common/middleware/headersUtil.ts similarity index 100% rename from http/typescript/fetch/test/common/middleware/MiddlewareUtil.ts rename to http/typescript/fetch/test/common/middleware/headersUtil.ts diff --git a/http/typescript/fetch/test/node/RedirectHandler.ts b/http/typescript/fetch/test/node/RedirectHandler.ts index c3e6fd2b14..21d1001bb1 100644 --- a/http/typescript/fetch/test/node/RedirectHandler.ts +++ b/http/typescript/fetch/test/node/RedirectHandler.ts @@ -9,8 +9,7 @@ import { assert } from "chai"; import { Response } from "node-fetch"; import { MiddlewareContext } from "../../src/middlewares/middlewareContext"; -import { MiddlewareControl } from "../../src/middlewares/middlewareControl"; -import { RedirectHandlerOptions } from "../../src/middlewares/options/redirectHandlerOption"; +import { RedirectHandlerOptionKey, RedirectHandlerOptions } from "../../src/middlewares/options/redirectHandlerOptions"; import { RedirectHandler } from "../../src/middlewares/redirectHandler"; import { DummyFetchHandler } from "../common/middleware/dummyFetchHandler"; @@ -162,34 +161,86 @@ describe("RedirectHandler.ts", () => { }); }); - describe("getOptions", () => { - it("Should return the options in the context object", () => { - const maxRedirects = 10; - const shouldRedirect = () => false; + describe("set RedirectOptions in RequestInformation", () => { + it("Should set the RedirectOptions from the context object", async () => { + const defaultOptions = new RedirectHandlerOptions(); + const handler = new RedirectHandler(defaultOptions); + const dummyFetchHandler = new DummyFetchHandler(); + handler.next = dummyFetchHandler; + const maxRedirects = 2; + const shouldRedirect = () => true; const options = new RedirectHandlerOptions(maxRedirects, shouldRedirect); const cxt: MiddlewareContext = { - request: "url", - middlewareControl: new MiddlewareControl([options]), + requestUrl: "url", + fetchRequestInit: { + method: "PUT", + headers: { + "Content-Type": "application/octet-stream", + }, + }, + requestInformationOptions: { + [RedirectHandlerOptionKey]: options, + }, }; - const o = redirectHandler["getOptions"](cxt); - assert.equal(o.maxRedirects, maxRedirects); - assert.equal(o.shouldRedirect, shouldRedirect); + + dummyFetchHandler.setResponses([ + new Response(null, { + status: 301, + headers: { + [RedirectHandler["LOCATION_HEADER"]]: "/location", + }, + }), + new Response(null, { + status: 301, + headers: { + [RedirectHandler["LOCATION_HEADER"]]: "/location", + }, + }), + new Response("RETURNED", { status: 301 }), + new Response("ok", { status: 200 }), + ]); + const response = await handler["execute"](cxt); + assert.equal(response.status, 301); + assert.isDefined(response.body); }); - it("Should return the default set of options in the middleware", () => { + it("Should use default options", async () => { + const handler = new RedirectHandler(); + const dummyFetchHandler = new DummyFetchHandler(); + handler.next = dummyFetchHandler; const cxt: MiddlewareContext = { - request: "url", + requestUrl: "url", + fetchRequestInit: { + method: "PUT", + headers: { + "Content-Type": "application/octet-stream", + }, + }, + }; + const responseBody = { + test: "TEST", }; - const o = redirectHandler["getOptions"](cxt); - assert.equal(o.maxRedirects, redirectHandler["options"].maxRedirects); - assert.equal(o.shouldRedirect, redirectHandler["options"].shouldRedirect); + const arr = []; + for (let i = 0; i < 5; i++) { + arr[i] = new Response(null, { + status: 301, + headers: { + [RedirectHandler["LOCATION_HEADER"]]: "/location", + }, + }); + } + dummyFetchHandler.setResponses([...arr, new Response(responseBody, { status: 301 })]); + + const response = await handler["execute"](cxt); + assert.equal(response.status, 301); + assert.isNotNull(response.body); }); }); describe("executeWithRedirect", async () => { const context: MiddlewareContext = { - request: "/me", - options: { + requestUrl: "/me", + fetchRequestInit: { method: "GET", }, }; @@ -200,29 +251,29 @@ describe("RedirectHandler.ts", () => { const maxRedirect = 1; const options = new RedirectHandlerOptions(maxRedirect); dummyFetchHandler.setResponses([new Response("", { status: 301 }), new Response("ok", { status: 200 })]); - await handler["executeWithRedirect"](context, maxRedirect, options); - assert.equal(context.response.status, 301); + const response = await handler["executeWithRedirect"](context, maxRedirect, options); + assert.equal(response.status, 301); }); it("Should not redirect for the non redirect response", async () => { const options = new RedirectHandlerOptions(); dummyFetchHandler.setResponses([new Response("", { status: 200 })]); - await handler["executeWithRedirect"](context, 0, options); - assert.equal(context.response.status, 200); + const response = await handler["executeWithRedirect"](context, 0, options); + assert.equal(response.status, 200); }); it("Should not redirect for the redirect response without location header", async () => { const options = new RedirectHandlerOptions(); dummyFetchHandler.setResponses([new Response("", { status: 301 }), new Response("ok", { status: 200 })]); - await handler["executeWithRedirect"](context, 0, options); - assert.equal(context.response.status, 301); + const response = await handler["executeWithRedirect"](context, 0, options); + assert.equal(response.status, 301); }); it("Should not redirect for shouldRedirect callback returning false", async () => { const options = new RedirectHandlerOptions(undefined, () => false); dummyFetchHandler.setResponses([new Response("", { status: 301 }), new Response("ok", { status: 200 })]); - await handler["executeWithRedirect"](context, 0, options); - assert.equal(context.response.status, 301); + const response = await handler["executeWithRedirect"](context, 0, options); + assert.equal(response.status, 301); }); it("Should drop body and change method to get for SEE_OTHER status code", async () => { @@ -236,17 +287,17 @@ describe("RedirectHandler.ts", () => { }), new Response("ok", { status: 200 }), ]); - await handler["executeWithRedirect"](context, 0, options); - assert.isUndefined(context.options.body); - assert.equal(context.options.method, "GET"); - assert.equal(context.response.status, 200); + const response = await handler["executeWithRedirect"](context, 0, options); + assert.isUndefined(context.fetchRequestInit.body); + assert.equal(context.fetchRequestInit.method, "GET"); + assert.equal(response.status, 200); }); it("Should not drop Authorization header for relative url redirect", async () => { const options = new RedirectHandlerOptions(); const cxt: MiddlewareContext = { - request: "/me", - options: { + requestUrl: "/me", + fetchRequestInit: { method: "POST", body: "dummy body", headers: { @@ -263,16 +314,18 @@ describe("RedirectHandler.ts", () => { }), new Response("ok", { status: 200 }), ]); - await handler["executeWithRedirect"](cxt, 0, options); - assert.isDefined(cxt.options.headers[RedirectHandler["AUTHORIZATION_HEADER"]]); - assert.equal(cxt.response.status, 200); + const response = await handler["executeWithRedirect"](cxt, 0, options); + assert.isDefined(cxt.fetchRequestInit.headers[RedirectHandler["AUTHORIZATION_HEADER"]]); + assert.equal(cxt.fetchRequestInit.headers[RedirectHandler["AUTHORIZATION_HEADER"]], "Bearer TEST"); + + assert.equal(response.status, 200); }); it("Should not drop Authorization header for same authority redirect url", async () => { const options = new RedirectHandlerOptions(); const cxt: MiddlewareContext = { - request: "https://graph.microsoft.com/v1.0/me", - options: { + requestUrl: "https://graph.microsoft.com/v1.0/me", + fetchRequestInit: { method: "POST", body: "dummy body", headers: { @@ -289,16 +342,16 @@ describe("RedirectHandler.ts", () => { }), new Response("ok", { status: 200 }), ]); - await handler["executeWithRedirect"](cxt, 0, options); - assert.isDefined(cxt.options.headers[RedirectHandler["AUTHORIZATION_HEADER"]]); - assert.equal(cxt.response.status, 200); + const response = await handler["executeWithRedirect"](cxt, 0, options); + assert.isDefined(cxt.fetchRequestInit.headers[RedirectHandler["AUTHORIZATION_HEADER"]]); + assert.equal(response.status, 200); }); it("Should return success response after successful redirect", async () => { const options = new RedirectHandlerOptions(); const cxt: MiddlewareContext = { - request: "https://graph.microsoft.com/v1.0/me", - options: { + requestUrl: "https://graph.microsoft.com/v1.0/me", + fetchRequestInit: { method: "POST", body: "dummy body", }, @@ -312,16 +365,16 @@ describe("RedirectHandler.ts", () => { }), new Response("ok", { status: 200 }), ]); - await handler["executeWithRedirect"](cxt, 0, options); - assert.equal(cxt.response.status, 200); + const response = await handler["executeWithRedirect"](cxt, 0, options); + assert.equal(response.status, 200); }); }); describe("execute", async () => { it("Should set the redirect value in options to manual", async () => { const context: MiddlewareContext = { - request: "/me", - options: { + requestUrl: "/me", + fetchRequestInit: { method: "GET", }, }; @@ -330,7 +383,7 @@ describe("RedirectHandler.ts", () => { handler.next = dummyFetchHandler; dummyFetchHandler.setResponses([new Response("", { status: 200 })]); await handler.execute(context); - assert.equal(context.options.redirect, RedirectHandler["MANUAL_REDIRECT"]); + assert.equal(context.fetchRequestInit.redirect, RedirectHandler["MANUAL_REDIRECT"]); }); }); }); diff --git a/http/typescript/fetch/test/node/RedirectHandlerOptions.ts b/http/typescript/fetch/test/node/RedirectHandlerOptions.ts index 9cd84d1f0d..d93e24bf58 100644 --- a/http/typescript/fetch/test/node/RedirectHandlerOptions.ts +++ b/http/typescript/fetch/test/node/RedirectHandlerOptions.ts @@ -7,7 +7,7 @@ import { assert } from "chai"; -import { RedirectHandlerOptions } from "../../src/middlewares/options/redirectHandlerOption"; +import { RedirectHandlerOptions } from "../../src/middlewares/options/redirectHandlerOptions"; describe("RedirectHandlerOptions.ts", () => { describe("constructor", () => { From f6343534a50f3fc5c7d8a294e385386cd5348746 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Thu, 28 Oct 2021 16:46:18 -0700 Subject: [PATCH 20/34] adding url util --- abstractions/typescript/package-lock.json | 5 ++ abstractions/typescript/package.json | 10 ++-- .../typescript/src/getPathParameters.ts | 22 ++++----- .../typescript/src/readableStreamContent.ts | 3 +- .../typescript/src/requestInformation.ts | 46 +++++++++++++------ abstractions/typescript/src/requestOption.ts | 2 +- .../typescript/src/utils/browser/index.ts | 2 + .../typescript/src/utils/browser/urlUtil.ts | 3 ++ abstractions/typescript/src/utils/index.ts | 1 + abstractions/typescript/src/utils/urlUtil.ts | 1 + abstractions/typescript/test/browser/index.ts | 1 - .../test/browser/requestInformation.ts | 10 ++++ .../test/common/requestInformation.ts | 22 --------- .../test/node/requestInformation.ts | 10 ++++ http/typescript/fetch/package-lock.json | 11 +++++ .../fetch/src/fetchRequestAdapter.ts | 14 +----- 16 files changed, 95 insertions(+), 68 deletions(-) create mode 100644 abstractions/typescript/src/utils/browser/index.ts create mode 100644 abstractions/typescript/src/utils/browser/urlUtil.ts create mode 100644 abstractions/typescript/src/utils/urlUtil.ts delete mode 100644 abstractions/typescript/test/common/requestInformation.ts diff --git a/abstractions/typescript/package-lock.json b/abstractions/typescript/package-lock.json index d03a83d273..988593c553 100644 --- a/abstractions/typescript/package-lock.json +++ b/abstractions/typescript/package-lock.json @@ -4403,6 +4403,11 @@ "punycode": "^2.1.0" } }, + "uri-template-lite": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/uri-template-lite/-/uri-template-lite-20.5.0.tgz", + "integrity": "sha512-RL6Pnz0DO4XH9WZhZTX6u0SP6afNM9z+u7lXYHO+RkVGzpNcgKc1Y2tcAX/KVIEi2ctfzf+iLcofkwKoYiGH4Q==" + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", diff --git a/abstractions/typescript/package.json b/abstractions/typescript/package.json index 243958c013..a2896c420c 100644 --- a/abstractions/typescript/package.json +++ b/abstractions/typescript/package.json @@ -18,6 +18,9 @@ "main": "dist/cjs/src/index.js", "module": "dist/es/src/index.js", "types": "dist/cjs/src/index.d.ts", + "browser": { + "dist/es/src/utils/index.js":"dist/es/src/utils/browser/index.js" + }, "scripts": { "build": "npm run build:cjs && npm run build:es", "build:cjs": "tsc -p tsconfig.cjs.json", @@ -28,10 +31,11 @@ "lint:fix": "eslint . --ext .ts --fix", "rollup": "rollup -c", "test": "npm run test:cjs && npm run test:es", - "test:cjs": "npm run build:cjs && mocha 'dist/cjs/test/common/**/*.js' && mocha 'dist/cjs/test/node/**/*.js'", - "test:es": " npm run build:es && mocha 'dist/es/test/common/**/*.js' --require esm && mocha 'dist/es/test/node/**/*.js' --require esm" + "test:cjs": "npm run build:cjs && mocha 'dist/cjs/test/node/**/*.js'", + "test:es": " npm run build:es && mocha 'dist/es/test/node/**/*.js' --require esm" }, "dependencies": { + "uri-template-lite": "^20.5.0", "uuid": "^8.3.2" }, "devDependencies": { @@ -65,4 +69,4 @@ "publishConfig": { "registry": "https://npm.pkg.github.com" } -} +} \ No newline at end of file diff --git a/abstractions/typescript/src/getPathParameters.ts b/abstractions/typescript/src/getPathParameters.ts index 2893984e1f..2f5b0aeb5d 100644 --- a/abstractions/typescript/src/getPathParameters.ts +++ b/abstractions/typescript/src/getPathParameters.ts @@ -1,13 +1,13 @@ import { RequestInformation } from "./requestInformation"; -export function getPathParameters(parameters: Map | string | undefined) : Map { - const result = new Map(); - if(typeof parameters === "string") { - result.set(RequestInformation.raw_url_key, parameters); - } else if(parameters instanceof Map) { - parameters.forEach((v, k) => { - result.set(k, v); - }); - } - return result; -} \ No newline at end of file +export function getPathParameters(parameters: Map | string | undefined): Map { + const result = new Map(); + if (typeof parameters === "string") { + result.set(RequestInformation.raw_url_key, parameters); + } else if (parameters instanceof Map) { + parameters.forEach((v, k) => { + result.set(k, v); + }); + } + return result; +} diff --git a/abstractions/typescript/src/readableStreamContent.ts b/abstractions/typescript/src/readableStreamContent.ts index 7b72dea109..cb27ea0b5d 100644 --- a/abstractions/typescript/src/readableStreamContent.ts +++ b/abstractions/typescript/src/readableStreamContent.ts @@ -5,9 +5,8 @@ * ------------------------------------------------------------------------------------------- */ - /* eslint-disable @typescript-eslint/no-empty-interface*/ +/* eslint-disable @typescript-eslint/no-empty-interface*/ - /** * Empty interface expecting the type of NodeJS.ReadableStream or dom ReadableStream * Node example: import {Readable} from "stream"; const readableStream = new Readable(); diff --git a/abstractions/typescript/src/requestInformation.ts b/abstractions/typescript/src/requestInformation.ts index 2497e662a1..36ea56d315 100644 --- a/abstractions/typescript/src/requestInformation.ts +++ b/abstractions/typescript/src/requestInformation.ts @@ -1,12 +1,11 @@ import * as urlTpl from "uri-template-lite"; -import { URL } from "url"; -import { ReadableStream } from "web-streams-polyfill/es2018"; import { HttpMethod } from "./httpMethod"; import { ReadableStreamContent } from "./readableStreamContent"; import { RequestAdapter } from "./requestAdapter"; import { RequestOption } from "./requestOption"; import { Parsable } from "./serialization"; +import { URL } from "./utils"; /** This class represents an abstract HTTP request. */ export class RequestInformation { @@ -59,23 +58,28 @@ export class RequestInformation { /** The Query Parameters of the request. */ public queryParameters: Map = new Map(); //TODO: case insensitive /** The Request Headers. */ - public headers: Map = new Map(); //TODO: case insensitive - private _requestOptions = new Map(); //TODO: case insensitive + public headers: Record; //TODO: case insensitive + + /** + * @private + * Additional request options + */ + private _requestOptions: Record = {}; /** Gets the request options for the request. */ - public getRequestOptions() { - return this._requestOptions.values(); + public getRequestOptions(): RequestOption[] { + return Object.values(this._requestOptions); } public addRequestOptions(...options: RequestOption[]) { if (!options || options.length === 0) return; options.forEach((option) => { - this._requestOptions.set(option.getKey(), option); + this._requestOptions[option.constructor()] = option; }); } /** Removes the request options for the request. */ public removeRequestOptions(...options: RequestOption[]) { if (!options || options.length === 0) return; options.forEach((option) => { - this._requestOptions.delete(option.getKey()); + delete this._requestOptions[option.getKey()]; }); } private static binaryContentType = "application/octet-stream"; @@ -93,17 +97,26 @@ export class RequestInformation { if (!values || values.length === 0) throw new Error("values cannot be undefined or empty"); const writer = requestAdapter.getSerializationWriterFactory().getSerializationWriter(contentType); - this.headers.set(RequestInformation.contentTypeHeader, contentType); - if (values.length === 1) writer.writeObjectValue(undefined, values[0]); - else writer.writeCollectionOfObjectValues(undefined, values); + if (!this.headers) { + this.headers = {}; + } + this.headers[RequestInformation.contentTypeHeader] = contentType; + if (values.length === 1) { + writer.writeObjectValue(undefined, values[0]); + } else { + writer.writeCollectionOfObjectValues(undefined, values); + } this.content = writer.getSerializedContent(); }; /** * Sets the request body to be a binary stream. * @param value the binary stream */ - public setStreamContent = (value: ReadableStream): void => { - this.headers.set(RequestInformation.contentTypeHeader, RequestInformation.binaryContentType); + public setStreamContent = (value: ReadableStreamContent): void => { + if (!this.headers) { + this.headers = {}; + } + this.headers[RequestInformation.contentTypeHeader] = RequestInformation.binaryContentType; this.content = value; }; /** @@ -111,8 +124,11 @@ export class RequestInformation { * @param headers the headers. */ public setHeadersFromRawObject = (h: object): void => { + if (!this.headers) { + this.headers = {}; + } Object.entries(h).forEach(([k, v]) => { - this.headers.set(k, v as string); + this.headers[k] = v as string; }); }; /** @@ -121,7 +137,7 @@ export class RequestInformation { */ public setQueryStringParametersFromRawObject = (q: object): void => { Object.entries(q).forEach(([k, v]) => { - this.headers.set(k, v as string); + this.queryParameters.set(k, v as string); }); }; } diff --git a/abstractions/typescript/src/requestOption.ts b/abstractions/typescript/src/requestOption.ts index 93a45fb04e..9043ccb42e 100644 --- a/abstractions/typescript/src/requestOption.ts +++ b/abstractions/typescript/src/requestOption.ts @@ -9,6 +9,6 @@ * to be passed in RequestInformaton object */ export interface RequestOption { - /** Gets the option key for when adding it to a request. Must be unique. */ + /** Gets the option key for when adding it to a request. Must be unique. */ getKey(): string; } diff --git a/abstractions/typescript/src/utils/browser/index.ts b/abstractions/typescript/src/utils/browser/index.ts new file mode 100644 index 0000000000..8cd300ad4f --- /dev/null +++ b/abstractions/typescript/src/utils/browser/index.ts @@ -0,0 +1,2 @@ +export * from "../stringUtils"; +export * from "./urlUtil"; diff --git a/abstractions/typescript/src/utils/browser/urlUtil.ts b/abstractions/typescript/src/utils/browser/urlUtil.ts new file mode 100644 index 0000000000..ed992431bd --- /dev/null +++ b/abstractions/typescript/src/utils/browser/urlUtil.ts @@ -0,0 +1,3 @@ +const url = URL; + +export { url as URL }; diff --git a/abstractions/typescript/src/utils/index.ts b/abstractions/typescript/src/utils/index.ts index 33622931e5..e282167450 100644 --- a/abstractions/typescript/src/utils/index.ts +++ b/abstractions/typescript/src/utils/index.ts @@ -1 +1,2 @@ export * from "./stringUtils"; +export * from "./urlUtil"; diff --git a/abstractions/typescript/src/utils/urlUtil.ts b/abstractions/typescript/src/utils/urlUtil.ts new file mode 100644 index 0000000000..81ef55e6ea --- /dev/null +++ b/abstractions/typescript/src/utils/urlUtil.ts @@ -0,0 +1 @@ +export { URL } from "url"; diff --git a/abstractions/typescript/test/browser/index.ts b/abstractions/typescript/test/browser/index.ts index d8b0232737..6e14e3e798 100644 --- a/abstractions/typescript/test/browser/index.ts +++ b/abstractions/typescript/test/browser/index.ts @@ -6,4 +6,3 @@ */ export * from "./requestInformation"; -export * from "../common/requestInformation"; diff --git a/abstractions/typescript/test/browser/requestInformation.ts b/abstractions/typescript/test/browser/requestInformation.ts index a5a9f61d8b..79033e1915 100644 --- a/abstractions/typescript/test/browser/requestInformation.ts +++ b/abstractions/typescript/test/browser/requestInformation.ts @@ -17,4 +17,14 @@ describe("RequestInformation", () => { assert.equal(requestInformation["content"], browserReadableStream); }); + +// it("Should set request information uri", () => { +// const requestInformation = new RequestInformation(); +// const currentPath = "CURRENT_PATH"; +// const pathSegment = "PATH_SEGMENT"; +// requestInformation.URL = new URL(currentPath, pathSegment) as unknown; +// assert.isNotNull(URL); +// console.log(requestInformation.URL); +// assert.equal(requestInformation.URL, new URL(currentPath, pathSegment)); +// }); }); diff --git a/abstractions/typescript/test/common/requestInformation.ts b/abstractions/typescript/test/common/requestInformation.ts deleted file mode 100644 index e6fc0e8d09..0000000000 --- a/abstractions/typescript/test/common/requestInformation.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -import { assert } from "chai"; - -import { RequestInformation } from "../../src/"; - -describe("RequestInformation", () => { - it("Should set request information uri", () => { - const requestInformation = new RequestInformation(); - const currentPath = "CURRENT_PATH"; - const pathSegment = "PATH_SEGMENT"; - requestInformation.setUri(currentPath, pathSegment, false); - assert.isNotNull(URL); - console.log(requestInformation.URI); - assert.equal(requestInformation.URI, currentPath + "" + pathSegment); - }); -}); diff --git a/abstractions/typescript/test/node/requestInformation.ts b/abstractions/typescript/test/node/requestInformation.ts index 261b50e7d1..9e3f307cc4 100644 --- a/abstractions/typescript/test/node/requestInformation.ts +++ b/abstractions/typescript/test/node/requestInformation.ts @@ -7,6 +7,7 @@ import { assert } from "chai"; import { Readable } from "stream"; +import { URL } from "url"; import { RequestInformation } from "../../src/"; @@ -18,4 +19,13 @@ describe("RequestInformation", () => { assert.equal(requestInformation["content"], nodeReadableStream); }); + it("Should set request information uri", () => { + const requestInformation = new RequestInformation(); + const currentPath = "CURRENT_PATH"; + const pathSegment = "PATH_SEGMENT"; + requestInformation.URL = new URL(currentPath, pathSegment); + assert.isNotNull(URL); + console.log(requestInformation.URL); + assert.equal(requestInformation.URL, new URL(currentPath, pathSegment)); + }); }); diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index 17fa5298bf..80daed9d22 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -398,6 +398,7 @@ "@microsoft/kiota-abstractions": { "version": "file:../../../abstractions/typescript", "requires": { + "uri-template-lite": "^20.5.0", "uuid": "^8.3.2" }, "dependencies": { @@ -4280,6 +4281,11 @@ "punycode": "^2.1.0" } }, + "uri-template-lite": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/uri-template-lite/-/uri-template-lite-20.5.0.tgz", + "integrity": "sha512-RL6Pnz0DO4XH9WZhZTX6u0SP6afNM9z+u7lXYHO+RkVGzpNcgKc1Y2tcAX/KVIEi2ctfzf+iLcofkwKoYiGH4Q==" + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -4352,6 +4358,11 @@ "defaults": "^1.0.3" } }, + "web-streams-polyfill": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.1.tgz", + "integrity": "sha512-Czi3fG883e96T4DLEPRvufrF2ydhOOW1+1a6c3gNjH2aIh50DNFBdfwh2AKoOf1rXvpvavAoA11Qdq9+BKjE0Q==" + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", diff --git a/http/typescript/fetch/src/fetchRequestAdapter.ts b/http/typescript/fetch/src/fetchRequestAdapter.ts index 0bdb3f85de..dd79f8fbfd 100644 --- a/http/typescript/fetch/src/fetchRequestAdapter.ts +++ b/http/typescript/fetch/src/fetchRequestAdapter.ts @@ -183,21 +183,9 @@ export class FetchRequestAdapter implements RequestAdapter { return request; }; - private getRequestUrl = (requestInformation: RequestInformation): string => { - let url = requestInformation.URI ?? ""; - if (requestInformation.queryParameters?.size ?? -1 > 0) { - const queryParametersBuilder = new URLSearchParams(); - requestInformation.queryParameters?.forEach((v, k) => { - queryParametersBuilder.append(k, `${v}`); - }); - url = url + "?" + queryParametersBuilder.toString(); - } - return url; - }; - private createContext(requestInformation: RequestInformation): MiddlewareContext { const context: MiddlewareContext = { - requestUrl: this.getRequestUrl(requestInformation), + requestUrl: requestInformation.URL.toString(), fetchRequestInit: this.getRequestFromRequestInformation(requestInformation), }; const requestOptions = requestInformation.getRequestOptions(); From af9a3c8e3e9cd84f42a47a1f6db32e6fb94266ac Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Mon, 8 Nov 2021 18:16:42 -0800 Subject: [PATCH 21/34] removing url utils --- abstractions/typescript/package.json | 2 +- .../test/browser/requestInformation.ts | 10 - .../test/node/requestInformation.ts | 8 +- abstractions/typescript/tsconfig.base.json | 1 - http/typescript/fetch/package-lock.json | 4717 ++++++++++++++++- http/typescript/fetch/package.json | 2 +- .../fetch/src/fetchRequestAdapter.ts | 1 - http/typescript/fetch/src/index.ts | 1 - .../fetch/src/utils/browser/utils.ts | 3 - http/typescript/fetch/src/utils/utils.ts | 1 - http/typescript/fetch/tsconfig.base.json | 1 - 11 files changed, 4635 insertions(+), 112 deletions(-) delete mode 100644 http/typescript/fetch/src/utils/browser/utils.ts delete mode 100644 http/typescript/fetch/src/utils/utils.ts diff --git a/abstractions/typescript/package.json b/abstractions/typescript/package.json index 6279d12a2a..1460df049f 100644 --- a/abstractions/typescript/package.json +++ b/abstractions/typescript/package.json @@ -19,7 +19,7 @@ "module": "dist/es/src/index.js", "types": "dist/cjs/src/index.d.ts", "browser": { - "dist/es/src/utils/index.js":"dist/es/src/utils/browser/index.js" + "dist/es/src/utils/index.js": "dist/es/src/utils/browser/index.js" }, "scripts": { "build": "npm run build:cjs && npm run build:es", diff --git a/abstractions/typescript/test/browser/requestInformation.ts b/abstractions/typescript/test/browser/requestInformation.ts index 79033e1915..a5a9f61d8b 100644 --- a/abstractions/typescript/test/browser/requestInformation.ts +++ b/abstractions/typescript/test/browser/requestInformation.ts @@ -17,14 +17,4 @@ describe("RequestInformation", () => { assert.equal(requestInformation["content"], browserReadableStream); }); - -// it("Should set request information uri", () => { -// const requestInformation = new RequestInformation(); -// const currentPath = "CURRENT_PATH"; -// const pathSegment = "PATH_SEGMENT"; -// requestInformation.URL = new URL(currentPath, pathSegment) as unknown; -// assert.isNotNull(URL); -// console.log(requestInformation.URL); -// assert.equal(requestInformation.URL, new URL(currentPath, pathSegment)); -// }); }); diff --git a/abstractions/typescript/test/node/requestInformation.ts b/abstractions/typescript/test/node/requestInformation.ts index 9e3f307cc4..788dc0bfb2 100644 --- a/abstractions/typescript/test/node/requestInformation.ts +++ b/abstractions/typescript/test/node/requestInformation.ts @@ -19,13 +19,13 @@ describe("RequestInformation", () => { assert.equal(requestInformation["content"], nodeReadableStream); }); - it("Should set request information uri", () => { + + it("Should set request information uri", () => { const requestInformation = new RequestInformation(); const currentPath = "CURRENT_PATH"; - const pathSegment = "PATH_SEGMENT"; + const pathSegment = "https://base"; requestInformation.URL = new URL(currentPath, pathSegment); assert.isNotNull(URL); - console.log(requestInformation.URL); - assert.equal(requestInformation.URL, new URL(currentPath, pathSegment)); + assert.deepEqual(requestInformation.URL, new URL(currentPath, pathSegment)); }); }); diff --git a/abstractions/typescript/tsconfig.base.json b/abstractions/typescript/tsconfig.base.json index 8a77f38aaa..93a36c4cd1 100644 --- a/abstractions/typescript/tsconfig.base.json +++ b/abstractions/typescript/tsconfig.base.json @@ -2,7 +2,6 @@ "compilerOptions": { "importHelpers": false, "noEmitOnError": true, - "noImplicitAny": false, "moduleResolution": "node", "removeComments": false, "sourceMap": true, diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index 73c8946d08..051f81cc55 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -1,120 +1,4340 @@ { "name": "@microsoft/kiota-http-fetchlibrary", - "version": "1.0.12", - "lockfileVersion": 2, + "version": "1.0.10", + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "@microsoft/kiota-http-fetchlibrary", - "version": "1.0.12", - "license": "MIT", + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", + "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==", + "dev": true + }, + "@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz", + "integrity": "sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helpers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.0.tgz", + "integrity": "sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ==", + "dev": true, + "requires": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "@babel/parser": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.2.tgz", + "integrity": "sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw==", + "dev": true + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + } + } + }, + "@babel/traverse": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.0.tgz", + "integrity": "sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@microsoft/kiota-abstractions": { + "version": "file:microsoft-kiota-abstractions-1.0.21.tgz", + "integrity": "sha512-4PtExSoeDKsetF3JEV+VB7buWff0l34fXNRR2CMvNPpFTxj3EFAdcdgpV1JJ/4huO98Z4vglEAda+wfjAI+X9A==", + "requires": { + "uri-template-lite": "^20.5.0", + "uuid": "^8.3.2" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@rollup/plugin-commonjs": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.1.tgz", + "integrity": "sha512-EA+g22lbNJ8p5kuZJUYyhhDK7WgJckW5g4pNN7n4mAFUM96VuwUnNT3xr2Db2iCZPI1pJPbGyfT5mS9T1dHfMg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.0.6.tgz", + "integrity": "sha512-sFsPDMPd4gMqnh2gS0uIxELnoRUp5kBl5knxD2EO0778G1oOJv4G1vyT2cpWz75OU2jDVcXhjVUuTAczGyFNKA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + } + } + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/samsam": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", + "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "@types/chai": { + "version": "4.2.22", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.22.tgz", + "integrity": "sha512-tFfcE+DSTzWAgifkjik9AySNqIyNoYwmR+uecPwwD/XRNfvOjmC/FjCxpiUGDkDVDphPfCUecSQVFw+lN3M3kQ==", + "dev": true + }, + "@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/mocha": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", + "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", + "dev": true + }, + "@types/node": { + "version": "16.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", + "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==", + "dev": true + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/sinon": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.6.tgz", + "integrity": "sha512-6EF+wzMWvBNeGrfP3Nx60hhx+FfwSg1JJBLAAP/IdIUq0EYkqCYf70VT3PhuhPX9eLD+Dp+lNdpb/ZeHG8Yezg==", + "dev": true, + "requires": { + "@sinonjs/fake-timers": "^7.1.0" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.3.1.tgz", + "integrity": "sha512-cFImaoIr5Ojj358xI/SDhjog57OK2NqlpxwdcgyxDA3bJlZcJq5CPzUXtpD7CxI2Hm6ATU7w5fQnnkVnmwpHqw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.3.1", + "@typescript-eslint/scope-manager": "5.3.1", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", + "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.3.1.tgz", + "integrity": "sha512-TD+ONlx5c+Qhk21x9gsJAMRohWAUMavSOmJgv3JGy9dgPhuBd5Wok0lmMClZDyJNLLZK1JRKiATzCKZNUmoyfw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", + "debug": "^4.3.2" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", + "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1" + } + }, + "@typescript-eslint/types": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", + "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", + "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", + "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "eslint-visitor-keys": "^3.0.0" + } + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "requires": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", + "dev": true + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz", + "integrity": "sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "requires": { + "resolve": "^1.17.0" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz", + "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001274", + "electron-to-chromium": "^1.3.886", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001278", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001278.tgz", + "integrity": "sha512-mpF9KeH8u5cMoEmIic/cr7PNS+F5LWBk0t2ekGT60lFf0Wq+n9LspAj0g3P+o7DQhD3sUdlMln4YFAWhFYn9jg==", + "dev": true + }, + "chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "date-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", + "dev": true + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "domain-browser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.891", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.891.tgz", + "integrity": "sha512-3cpwR82QkIS01CN/dup/4Yr3BiOiRLlZlcAFn/5FbNCunMO9ojqDgEP9JEo1QNLflu3pEnPWve50gHOEKc7r6w==", + "dev": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "engine.io": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.0.1.tgz", + "integrity": "sha512-Y53UaciUh2Rmx5MiogtMxOQcfh7pnemday+Bb4QDg0Wjmnvo/VTvuEyNGQgYmh8L7VOe8Je1QuiqjLNDelMqLA==", + "dev": true, + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.0", + "ws": "~8.2.3" + } + }, + "engine.io-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.1.tgz", + "integrity": "sha512-j4p3WwJrG2k92VISM0op7wiq60vO92MlF3CRGxhKHy9ywG1/Dkc72g0dXeDQ+//hrcDn8gqQzoEkdO9FN0d9AA==", + "dev": true, + "requires": { + "base64-arraybuffer": "~1.0.1" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", + "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", + "dev": true + }, + "eslint-plugin-prettier": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-simple-import-sort": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz", + "integrity": "sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "dev": true + }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "follow-redirects": { + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", + "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dev": true, + "requires": { + "source-map": "~0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", + "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0" + } + }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", + "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "karma": { + "version": "6.3.8", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.8.tgz", + "integrity": "sha512-10wBBU9S0lBHhbCNfmmbWQaY5C1bXlKdnvzN2QKThujCI/+DKaezrI08l6bfTlpJ92VsEboq3zYKpXwK6DOi3A==", + "dev": true, + "requires": { + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "colors": "^1.4.0", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.3.0", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.2.0", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + } + }, + "karma-chai": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/karma-chai/-/karma-chai-0.1.0.tgz", + "integrity": "sha1-vuWtQEAFF4Ea40u5RfdikJEIt5o=", + "dev": true + }, + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "dev": true, + "requires": { + "which": "^1.2.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "karma-firefox-launcher": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.2.tgz", + "integrity": "sha512-VV9xDQU1QIboTrjtGVD4NCfzIH7n01ZXqy/qpBhnOeGVOkG5JYPEm8kuSd7psHE6WouZaQ9Ool92g8LFweSNMA==", + "dev": true, + "requires": { + "is-wsl": "^2.2.0", + "which": "^2.0.1" + } + }, + "karma-mocha": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", + "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", + "dev": true, + "requires": { + "minimist": "^1.2.3" + } + }, + "karma-typescript": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-5.5.2.tgz", + "integrity": "sha512-2rNhiCMrIF+VR8jMuovOLSRjNkjdoE/kQ4XYZU94lMkHNQtnqCaToAnztMj4fuOPRErL7VIkwvJEO7jBd47Q6A==", + "dev": true, + "requires": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2", + "assert": "^2.0.0", + "async": "^3.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.4.3", + "combine-source-map": "^0.8.0", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "convert-source-map": "^1.7.0", + "crypto-browserify": "^3.12.0", + "diff": "^4.0.1", + "domain-browser": "^4.16.0", + "events": "^3.2.0", + "glob": "^7.1.6", + "https-browserify": "^1.0.0", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.19", + "log4js": "^6.3.0", + "minimatch": "^3.0.4", + "os-browserify": "^0.3.0", + "pad": "^3.2.0", + "path-browserify": "^1.0.0", + "process": "^0.11.10", + "punycode": "^2.1.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.1.1", + "source-map": "^0.7.3", + "stream-browserify": "^3.0.0", + "stream-http": "^3.1.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.11", + "tmp": "^0.2.1", + "tty-browserify": "^0.0.1", + "url": "^0.11.0", + "util": "^0.12.1", + "vm-browserify": "^1.1.2" + }, + "dependencies": { + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "log4js": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "dev": true, + "requires": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.4" + }, + "dependencies": { + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + } + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "mime-db": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", + "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", + "dev": true + }, + "mime-types": { + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", + "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "dev": true, + "requires": { + "mime-db": "1.50.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mocha": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "nise": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", + "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "pad": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pad/-/pad-3.2.0.tgz", + "integrity": "sha512-2u0TrjcGbOjBTJpyewEl4hBO3OeX5wWue7eIFPzQTg6wFSvoaHcBTTUY5m+n0hd04gmTCPuY0kCpVIVuw5etwg==", + "dev": true, + "requires": { + "wcwidth": "^1.0.1" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rollup": { + "version": "2.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.59.0.tgz", + "integrity": "sha512-l7s90JQhCQ6JyZjKgo7Lq1dKh2RxatOM+Jr6a9F7WbS9WgKbocyUSeLmZl8evAse7y96Ae98L2k1cBOwWD8nHw==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, "dependencies": { - "@microsoft/kiota-abstractions": "^1.0.23", - "cross-fetch": "^3.1.4", - "web-streams-polyfill": "^3.2.0" + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + } + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sinon": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", + "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" }, - "devDependencies": { - "@types/node": "^16.11.6", - "typescript": "^4.4.4" + "dependencies": { + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "node_modules/@microsoft/kiota-abstractions": { - "version": "1.0.23", - "resolved": "https://npm.pkg.github.com/download/@microsoft/kiota-abstractions/1.0.23/3450041c58e92593fdc865393dda7ac33b2259426b2d2debbb746824f6d25005", - "integrity": "sha512-0GpyWokoq0SVEG3G8qevu2OWx4vd+a4aiAKCn90PLiQAJNwiE+9qNgUcQNhZJoEejAz3Rx5/CgZoWfa8xpJ4xA==", - "license": "MIT", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, "dependencies": { - "uri-template-lite": "^20.5.0", - "uuid": "^8.3.2", - "web-streams-polyfill": "^3.2.0" + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } } }, - "node_modules/@types/node": { - "version": "16.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", - "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==", + "socket.io": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.3.2.tgz", + "integrity": "sha512-6S5tV4jcY6dbZ/lLzD6EkvNWI3s81JO6ABP/EpvOlK1NPOcIj3AS4khi6xXw6JlZCASq82HQV4SapfmVMMl2dg==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.0.0", + "socket.io-adapter": "~2.3.2", + "socket.io-parser": "~4.0.4" + } + }, + "socket.io-adapter": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.2.tgz", + "integrity": "sha512-PBZpxUPYjmoogY0aoaTmo1643JelsaS1CiAwNjRVdrI0X9Seuc19Y2Wife8k88avW6haG8cznvwbubAZwH4Mtg==", + "dev": true + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dev": true, + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, - "node_modules/cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "requires": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "streamroller": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", + "dev": true, + "requires": { + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, "dependencies": { - "node-fetch": "2.6.1" + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + } } }, - "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "engines": { - "node": "4.x || >=6.0.0" + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, - "node_modules/typescript": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", - "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.3.tgz", + "integrity": "sha512-5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.7.1.tgz", + "integrity": "sha512-gPpOObTO1QjbnN1sVMjJcp1TF9nggMfO4MBR5uQl6ZVTOaEPq5i4oq/6R9q2alMMPB3eg53wFv1RuJBLuxf3Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" }, - "engines": { - "node": ">=4.2.0" + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } } }, - "node_modules/uri-template-lite": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/uri-template-lite/-/uri-template-lite-20.5.0.tgz", - "integrity": "sha512-RL6Pnz0DO4XH9WZhZTX6u0SP6afNM9z+u7lXYHO+RkVGzpNcgKc1Y2tcAX/KVIEi2ctfzf+iLcofkwKoYiGH4Q==" + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" } }, - "node_modules/web-streams-polyfill": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz", - "integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==", - "engines": { - "node": ">= 8" + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" } - } - }, - "dependencies": { - "@microsoft/kiota-abstractions": { - "version": "1.0.23", - "resolved": "https://npm.pkg.github.com/download/@microsoft/kiota-abstractions/1.0.23/3450041c58e92593fdc865393dda7ac33b2259426b2d2debbb746824f6d25005", - "integrity": "sha512-0GpyWokoq0SVEG3G8qevu2OWx4vd+a4aiAKCn90PLiQAJNwiE+9qNgUcQNhZJoEejAz3Rx5/CgZoWfa8xpJ4xA==", + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "requires": { - "uri-template-lite": "^20.5.0", - "uuid": "^8.3.2", - "web-streams-polyfill": "^3.2.0" + "is-number": "^7.0.0" } }, - "@types/node": { - "version": "16.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", - "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==", + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true }, - "cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, "requires": { - "node-fetch": "2.6.1" + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } }, "typescript": { "version": "4.4.4", @@ -122,20 +4342,341 @@ "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", "dev": true }, + "ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "uri-template-lite": { "version": "20.5.0", "resolved": "https://registry.npmjs.org/uri-template-lite/-/uri-template-lite-20.5.0.tgz", "integrity": "sha512-RL6Pnz0DO4XH9WZhZTX6u0SP6afNM9z+u7lXYHO+RkVGzpNcgKc1Y2tcAX/KVIEi2ctfzf+iLcofkwKoYiGH4Q==" }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, - "web-streams-polyfill": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz", - "integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==" + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", + "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.7" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index 8134bfa150..36dabd0d2e 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -44,7 +44,7 @@ "test:es": " npm run build:es && mocha 'dist/es/test/common/**/*.js' --require esm && mocha 'dist/es/test/node/**/*.js' --require esm" }, "dependencies": { - "@microsoft/kiota-abstractions": "file:../../../abstractions/typescript", + "@microsoft/kiota-abstractions": "file:microsoft-kiota-abstractions-1.0.21.tgz", "node-fetch": "^2.6.5" }, "devDependencies": { diff --git a/http/typescript/fetch/src/fetchRequestAdapter.ts b/http/typescript/fetch/src/fetchRequestAdapter.ts index a4bd682f44..f716ba269f 100644 --- a/http/typescript/fetch/src/fetchRequestAdapter.ts +++ b/http/typescript/fetch/src/fetchRequestAdapter.ts @@ -3,7 +3,6 @@ import { AuthenticationProvider, BackingStoreFactory, BackingStoreFactorySinglet import { HttpClient } from "./httpClient"; import { MiddlewareContext } from "./middlewares/middlewareContext"; import { FetchRequestInit, FetchResponse } from "./utils/fetchDefinitions"; -import { URLSearchParams } from "./utils/utils"; export class FetchRequestAdapter implements RequestAdapter { public baseUrl = ""; diff --git a/http/typescript/fetch/src/index.ts b/http/typescript/fetch/src/index.ts index 7773376e3f..a280b89f6b 100644 --- a/http/typescript/fetch/src/index.ts +++ b/http/typescript/fetch/src/index.ts @@ -20,4 +20,3 @@ export * from "./middlewares/middlewareContext"; export * from "./middlewares/middlewareFactory"; export * from "./utils/headersUtil"; export * from "./utils/fetchDefinitions"; -export * from "./utils/utils"; diff --git a/http/typescript/fetch/src/utils/browser/utils.ts b/http/typescript/fetch/src/utils/browser/utils.ts deleted file mode 100644 index cbb074dd5d..0000000000 --- a/http/typescript/fetch/src/utils/browser/utils.ts +++ /dev/null @@ -1,3 +0,0 @@ -const browserURLSearchParams = URLSearchParams; - -export { browserURLSearchParams as URLSearchParams }; diff --git a/http/typescript/fetch/src/utils/utils.ts b/http/typescript/fetch/src/utils/utils.ts deleted file mode 100644 index 0f0eda3e5f..0000000000 --- a/http/typescript/fetch/src/utils/utils.ts +++ /dev/null @@ -1 +0,0 @@ -export { URLSearchParams } from "url"; diff --git a/http/typescript/fetch/tsconfig.base.json b/http/typescript/fetch/tsconfig.base.json index bcd34dddb6..2b2d31da57 100644 --- a/http/typescript/fetch/tsconfig.base.json +++ b/http/typescript/fetch/tsconfig.base.json @@ -2,7 +2,6 @@ "compilerOptions": { "importHelpers": true, "noEmitOnError": true, - "noImplicitAny": false, "moduleResolution": "node", "removeComments": false, "sourceMap": true, From 7decd3598549d5323b37832d999ad9313955a778 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Mon, 8 Nov 2021 22:43:33 -0800 Subject: [PATCH 22/34] minor updates --- .../fetch/src/middlewares/redirectHandler.ts | 9 +++------ .../fetch/src/middlewares/retryHandler.ts | 16 ++++------------ 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/http/typescript/fetch/src/middlewares/redirectHandler.ts b/http/typescript/fetch/src/middlewares/redirectHandler.ts index 5bf822b67f..a2ceb7f5e1 100644 --- a/http/typescript/fetch/src/middlewares/redirectHandler.ts +++ b/http/typescript/fetch/src/middlewares/redirectHandler.ts @@ -75,9 +75,7 @@ export class RedirectHandler implements Middleware { * @returns An instance of RedirectHandler */ - public constructor(private options: RedirectHandlerOptions = new RedirectHandlerOptions()) { - this.options = options; - } + public constructor(private options: RedirectHandlerOptions = new RedirectHandlerOptions()) {} /** * @private @@ -189,11 +187,10 @@ export class RedirectHandler implements Middleware { * @param {Context} context - The context object of the request * @returns A Promise that resolves to nothing */ - public async execute(context: MiddlewareContext): Promise { + public execute(context: MiddlewareContext): Promise { const redirectCount = 0; const options: RedirectHandlerOptions = ((context?.requestInformationOptions && context.requestInformationOptions[RedirectHandlerOptionKey]) as RedirectHandlerOptions) || this.options; context.fetchRequestInit.redirect = RedirectHandler.MANUAL_REDIRECT; - const response = await this.executeWithRedirect(context, redirectCount, options); - return response; + return this.executeWithRedirect(context, redirectCount, options); } } diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts index 5cfd3b0059..4590c3edf1 100644 --- a/http/typescript/fetch/src/middlewares/retryHandler.ts +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -54,12 +54,6 @@ export class RetryHandler implements Middleware { */ next: Middleware; - /** - * @private - * A member holding the retry handler options - */ - private options: RetryHandlerOptions; - /** * @public * @constructor @@ -67,9 +61,7 @@ export class RetryHandler implements Middleware { * @param {RetryHandlerOptions} [options = new RetryHandlerOptions()] - The retry handler options value * @returns An instance of RetryHandler */ - public constructor(options: RetryHandlerOptions = new RetryHandlerOptions()) { - this.options = options; - } + public constructor(private options: RetryHandlerOptions = new RetryHandlerOptions()) {} /** * @@ -93,7 +85,7 @@ export class RetryHandler implements Middleware { const method = options.method; const isPutPatchOrPost: boolean = method === HttpMethod.PUT || method === HttpMethod.PATCH || method === HttpMethod.POST; if (isPutPatchOrPost) { - const isStream = getRequestHeader(options, "Content-Type") === "application/octet-stream"; + const isStream = getRequestHeader(options, "content-type") === "application/octet-stream"; if (isStream) { return false; } @@ -179,9 +171,9 @@ export class RetryHandler implements Middleware { * @param {Context} context - The context object of the request * @returns A Promise that resolves to nothing */ - public async execute(context: MiddlewareContext): Promise { + public execute(context: MiddlewareContext): Promise { const retryAttempts = 0; const options: RetryHandlerOptions = ((context?.requestInformationOptions && context.requestInformationOptions[RetryHandlerOptionKey]) as RetryHandlerOptions) || this.options; - return await this.executeWithRetry(context, retryAttempts, options); + return this.executeWithRetry(context, retryAttempts, options); } } From 027494755b853829711f5fbe57b9c3043c714b92 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Tue, 1 Feb 2022 20:38:11 -0800 Subject: [PATCH 23/34] deleting the context --- abstractions/typescript/package.json | 78 ++-- .../typescript/src/requestInformation.ts | 18 +- abstractions/typescript/src/requestOption.ts | 5 +- http/typescript/fetch/package.json | 85 +++-- .../fetch/src/fetchRequestAdapter.ts | 2 +- http/typescript/fetch/src/httpClient.ts | 9 +- .../browser/defaultFetchHandler.ts | 38 -- .../middlewares/browser/middlewareFactory.ts | 2 +- .../src/middlewares/customFetchHandler.ts | 5 +- .../src/middlewares/defaultFetchHandler.ts | 41 --- .../fetch/src/middlewares/middleware.ts | 10 +- .../src/middlewares/middlewareContext.ts | 24 -- .../src/middlewares/middlewareFactory.ts | 4 +- .../fetch/src/middlewares/redirectHandler.ts | 345 +++++++++--------- .../fetch/src/middlewares/retryHandler.ts | 21 +- 15 files changed, 328 insertions(+), 359 deletions(-) delete mode 100644 http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts delete mode 100644 http/typescript/fetch/src/middlewares/defaultFetchHandler.ts delete mode 100644 http/typescript/fetch/src/middlewares/middlewareContext.ts diff --git a/abstractions/typescript/package.json b/abstractions/typescript/package.json index 465b11e46b..06d99d43c7 100644 --- a/abstractions/typescript/package.json +++ b/abstractions/typescript/package.json @@ -1,43 +1,75 @@ { "name": "@microsoft/kiota-abstractions", - "version": "1.0.27", + "version": "1.0.21", "description": "Core abstractions for kiota generated libraries in TypeScript and JavaScript", - "main": "dist/cjs/index.js", - "module": "dist/es/index.js", - "types": "dist/cjs/index.d.ts", - "scripts": { - "build": "npm run build:cjs && npm run build:esm", - "build:cjs": "tsc -p tsconfig.cjs.json", - "build:esm": "tsc -p tsconfig.es.json", - "test": "echo \"Error: no test specified\" && exit 1", - "clean": "rm -r ./dist" - }, - "repository": "git://github.com/microsoft/kiota.git", "keywords": [ "kiota", "openAPI", "Microsoft", "Graph" ], - "author": "Microsoft", - "license": "MIT", + "homepage": "https://github.com/microsoft/kiota#readme", "bugs": { "url": "https://github.com/microsoft/kiota/issues" }, - "homepage": "https://github.com/microsoft/kiota#readme", - "devDependencies": { - "@types/node": "^17.0.13", - "@types/uri-template-lite": "^19.12.1", - "@types/uuid": "^8.3.4", - "typescript": "^4.5.5" + "repository": "git://github.com/microsoft/kiota.git", + "license": "MIT", + "author": "Microsoft", + "main": "dist/cjs/src/index.js", + "module": "dist/es/src/index.js", + "types": "dist/cjs/src/index.d.ts", + "browser": { + "dist/es/src/utils/index.js": "dist/es/src/utils/browser/index.js" }, - "publishConfig": { - "registry": "https://npm.pkg.github.com" + "scripts": { + "build": "npm run build:cjs && npm run build:es", + "build:cjs": "tsc -p tsconfig.cjs.json", + "build:es": "tsc -p tsconfig.es.json", + "clean": "rm -r ./dist", + "karma": "npm run rollup && karma start --single-run --browsers ChromeHeadless karma.conf.js", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", + "rollup": "rollup -c", + "test": "npm run test:cjs && npm run test:es", + "test:cjs": "npm run build:cjs && mocha 'dist/cjs/test/node/**/*.js'", + "test:es": " npm run build:es && mocha 'dist/es/test/node/**/*.js' --require esm" }, "dependencies": { "tinyduration": "^3.2.2", "tslib": "^2.3.1", "uri-template-lite": "^22.1.0", "uuid": "^8.3.2" + }, + "devDependencies": { + "@types/uri-template-lite": "^19.12.1", + "@rollup/plugin-commonjs": "^21.0.0", + "@rollup/plugin-node-resolve": "^13.0.5", + "@types/chai": "^4.2.22", + "@types/mocha": "^9.0.0", + "@types/node": "^17.0.13", + "@types/sinon": "^10.0.4", + "@types/uuid": "^8.3.4", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "chai": "^4.3.4", + "eslint": "^8.0.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-simple-import-sort": "^7.0.0", + "esm": "^3.2.25", + "karma": "^6.3.4", + "karma-chai": "^0.1.0", + "karma-chrome-launcher": "^3.1.0", + "karma-firefox-launcher": "^2.1.1", + "karma-mocha": "^2.0.1", + "karma-typescript": "^5.5.2", + "mocha": "^8.4.0", + "prettier": "^2.4.1", + "rollup": "^2.58.0", + "rollup-plugin-terser": "^7.0.2", + "typescript": "^4.5.5" + }, + "publishConfig": { + "registry": "https://npm.pkg.github.com" } -} +} \ No newline at end of file diff --git a/abstractions/typescript/src/requestInformation.ts b/abstractions/typescript/src/requestInformation.ts index 8ebaafb9ce..c4589be164 100644 --- a/abstractions/typescript/src/requestInformation.ts +++ b/abstractions/typescript/src/requestInformation.ts @@ -65,17 +65,17 @@ export class RequestInformation { private _requestOptions: Record = {}; //TODO: case insensitive /** Gets the request options for the request. */ public getRequestOptions() { return this._requestOptions} - public addRequestOptions(...options: RequestOption[]) { - if (!options || options.length === 0) return; - options.forEach(option => { - this._requestOptions[option.getKey()] = option - }); + public addRequestOptions(options: Record) { + if (!options) return; + for(const key in options){ + this._requestOptions[key] = options[key]; + }; } /** Removes the request options for the request. */ - public removeRequestOptions(...options: RequestOption[]) { - if (!options || options.length === 0) return; - options.forEach(option => { - delete this._requestOptions[option.getKey()]; + public removeRequestOptions(...optionKeys: string[]) { + if (!optionKeys || optionKeys.length === 0) return; + optionKeys.forEach(option => { + delete this._requestOptions[option]; }); } private static binaryContentType = "application/octet-stream"; diff --git a/abstractions/typescript/src/requestOption.ts b/abstractions/typescript/src/requestOption.ts index 9043ccb42e..023f2373f3 100644 --- a/abstractions/typescript/src/requestOption.ts +++ b/abstractions/typescript/src/requestOption.ts @@ -8,7 +8,4 @@ * Interface accepting request options * to be passed in RequestInformaton object */ -export interface RequestOption { - /** Gets the option key for when adding it to a request. Must be unique. */ - getKey(): string; -} +export interface RequestOption {} diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index ef4f532be6..d18b283563 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -2,42 +2,81 @@ "name": "@microsoft/kiota-http-fetchlibrary", "version": "1.0.14", "description": "Kiota request adapter implementation with fetch", - "main": "dist/cjs/index.js", - "module": "dist/es/index.js", - "types": "dist/cjs/index.d.ts", - "scripts": { - "build": "npm run build:cjs && npm run build:esm", - "build:cjs": "tsc -p tsconfig.cjs.json", - "build:esm": "tsc -p tsconfig.es.json", - "test": "echo \"Error: no test specified\" && exit 1", - "clean": "rm -r ./dist" - }, - "repository": { - "type": "git", - "url": "git://github.com/microsoft/kiota.git" - }, "keywords": [ "Kiota", "OpenAPI", "HTTP", "fetch" ], - "author": "Microsoft", - "license": "MIT", + "homepage": "https://github.com/microsoft/kiota#readme", "bugs": { "url": "https://github.com/microsoft/kiota/issues" }, - "homepage": "https://github.com/microsoft/kiota#readme", - "publishConfig": { - "registry": "https://npm.pkg.github.com" + "repository": { + "type": "git", + "url": "git://github.com/microsoft/kiota.git" + }, + "license": "MIT", + "author": "Microsoft", + "main": "dist/cjs/src/index.js", + "browser": { + "./dist/es/src/index.js": "./dist/es/src/browser/index.js", + "./dist/es/src/utils/utils.js": "./dist/es/src/utils/browser/utils.js", + "./dist/es/src/middlewares/defaultFetchHandler.js": "./dist/es/src/middlewares/browser/defaultFetchHandler.js", + "./dist/es/src/middlewares/middlewareFactory.js": "./dist/es/src/middlewares/browser/middlewareFactory.js" + }, + "types": "dist/cjs/src/index.d.ts", + "files": [ + "dist/", + "src/" + ], + "scripts": { + "build": "npm run build:cjs && npm run build:es", + "build:cjs": "tsc -p tsconfig.cjs.json", + "build:es": "tsc -p tsconfig.es.json", + "clean": "rm -r ./dist", + "karma": "npm run rollup && karma start --single-run --browsers ChromeHeadless karma.conf.js", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", + "rollup": "rollup -c", + "test": "npm run test:cjs && npm run test:es && npm run karma", + "test:cjs": "npm run build:cjs && mocha 'dist/cjs/test/common/**/*.js' && mocha 'dist/cjs/test/node/**/*.js'", + "test:es": " npm run build:es && mocha 'dist/es/test/common/**/*.js' --require esm && mocha 'dist/es/test/node/**/*.js' --require esm" }, "dependencies": { - "@microsoft/kiota-abstractions": "^1.0.27", - "cross-fetch": "^3.1.5", - "tslib": "^2.3.1" + "@microsoft/kiota-abstractions": "file:microsoft-kiota-abstractions-1.0.21.tgz", + "node-fetch": "^2.6.5", + "tslib": "2.3.1" }, "devDependencies": { + "@rollup/plugin-commonjs": "^21.0.0", + "@rollup/plugin-node-resolve": "^13.0.5", + "@types/chai": "^4.2.22", "@types/node": "^17.0.13", + "@types/sinon": "^10.0.4", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "chai": "^4.3.4", + "eslint": "^7.32.0", + "eslint-config-prettier": "^7.2.0", + "eslint-plugin-prettier": "^3.4.1", + "eslint-plugin-simple-import-sort": "^7.0.0", + "esm": "^3.2.25", + "karma": "^6.3.4", + "karma-chai": "^0.1.0", + "karma-chrome-launcher": "^3.1.0", + "karma-firefox-launcher": "^2.1.1", + "karma-mocha": "^2.0.1", + "karma-typescript": "^5.5.2", + "mocha": "^8.4.0", + "prettier": "^1.19.1", + "rollup": "^2.58.0", + "rollup-plugin-terser": "^7.0.2", + "sinon": "^11.1.2", + "tslib": "^2.3.1", "typescript": "^4.5.5" + }, + "publishConfig": { + "registry": "https://npm.pkg.github.com" } -} +} \ No newline at end of file diff --git a/http/typescript/fetch/src/fetchRequestAdapter.ts b/http/typescript/fetch/src/fetchRequestAdapter.ts index 5eeae3ff16..b55e62e265 100644 --- a/http/typescript/fetch/src/fetchRequestAdapter.ts +++ b/http/typescript/fetch/src/fetchRequestAdapter.ts @@ -164,7 +164,7 @@ export class FetchRequestAdapter implements RequestAdapter { await this.authenticationProvider.authenticateRequest(requestInfo); const request = this.getRequestFromRequestInformation(requestInfo); - return await this.httpClient.fetch(requestInfo.URL, request); + return await this.httpClient.executeFetch(requestInfo.url, request); } private getRequestFromRequestInformation = (requestInfo: RequestInformation): RequestInit => { requestInfo.pathParameters["baseurl"]= this.baseUrl; diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index fdf3b0c9b9..6b552450dc 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -1,7 +1,6 @@ import { CustomFetchHandler } from "./middlewares/customFetchHandler"; import { DefaultFetchHandler } from "./middlewares/defaultFetchHandler"; import { Middleware } from "./middlewares/middleware"; -import { MiddlewareContext } from "./middlewares/middlewareContext"; import { MiddlewareFactory } from "./middlewares/middlewareFactory"; import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "./utils/fetchDefinitions"; @@ -29,7 +28,7 @@ export class HttpClient { } else { if (middlewares[0] === null) { if (!customFetch) { - this.setMiddleware(new DefaultFetchHandler()); + this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain()); } return; } else { @@ -80,13 +79,13 @@ export class HttpClient { * @param options request options. * @returns the promise resolving the response. */ - public async executeFetch(context: MiddlewareContext): Promise { + public async executeFetch(url: string, requestInit?: FetchRequestInit, requestOptions?: RequestOption[]): Promise { if (this.customFetch && !this.middleware) { - return this.customFetch(context.requestUrl, context.requestInformationOptions); + return this.customFetch(url, requestInit); } if (this.middleware) { - return await this.middleware.execute(context); + return await this.middleware.execute(url, requestInit, requestOptions); } else { throw new Error("Please provide middlewares or a custom fetch function to execute the request"); } diff --git a/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts b/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts deleted file mode 100644 index 966bcdd4b4..0000000000 --- a/http/typescript/fetch/src/middlewares/browser/defaultFetchHandler.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @module DefaultFetchHandler - */ - -import { FetchResponse } from "../../utils/fetchDefinitions"; -import { Middleware } from "../middleware"; -import { MiddlewareContext } from "../middlewareContext"; - -/** - * @class - * @implements Middleware - * Class for DefaultFetchHandler - */ -export class DefaultFetchHandler implements Middleware { - /** - * @private - * The next middleware in the middleware chain - */ - next: Middleware; - - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The request context object - * @returns A promise that resolves to nothing - */ - public async execute(context: MiddlewareContext): Promise { - return (await fetch(context.requestUrl, context.fetchRequestInit as RequestInit)) as FetchResponse; - } -} diff --git a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts index fd368e488c..86ccb17dad 100644 --- a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts @@ -37,7 +37,7 @@ export class MiddlewareFactory { if (customFetch) { middlewareArray.push(new CustomFetchHandler(customFetch)); } else { - middlewareArray.push(new DefaultFetchHandler()); + middlewareArray.push(new CustomFetchHandler(fetch as any)); } return middlewareArray; } diff --git a/http/typescript/fetch/src/middlewares/customFetchHandler.ts b/http/typescript/fetch/src/middlewares/customFetchHandler.ts index 35b1fd12bf..d681e3e9d3 100644 --- a/http/typescript/fetch/src/middlewares/customFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/customFetchHandler.ts @@ -11,7 +11,6 @@ import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; import { Middleware } from "./middleware"; -import { MiddlewareContext } from "./middlewareContext"; /** * @class @@ -35,7 +34,7 @@ export class CustomFetchHandler implements Middleware { * @param {Context} context - The request context object * @returns A promise that resolves to nothing */ - public async execute(context: MiddlewareContext): Promise { - return await this.customFetch(context.requestUrl, context.fetchRequestInit); + public async execute(url: string, requestInit: FetchRequestInit): Promise { + return await this.customFetch(url, requestInit); } } diff --git a/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts b/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts deleted file mode 100644 index ac3db6f0e7..0000000000 --- a/http/typescript/fetch/src/middlewares/defaultFetchHandler.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/** - * @module DefaultFetchHandler - */ - -import fetch from "node-fetch"; - -import { FetchResponse } from "../utils/fetchDefinitions"; -import { Middleware } from "./middleware"; -import { MiddlewareContext } from "./middlewareContext"; - -/** - * @class - * @implements Middleware - * Class for FetchHandler - */ - -export class DefaultFetchHandler implements Middleware { - /** - * @private - * The next middleware in the middleware chain - */ - next: Middleware; - - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The request context object - * @returns A promise that resolves to nothing - */ - public async execute(context: MiddlewareContext): Promise { - return (await fetch(context.requestUrl, context.fetchRequestInit)) as FetchResponse; - } -} diff --git a/http/typescript/fetch/src/middlewares/middleware.ts b/http/typescript/fetch/src/middlewares/middleware.ts index 18b83bace4..7b8bf1eeda 100644 --- a/http/typescript/fetch/src/middlewares/middleware.ts +++ b/http/typescript/fetch/src/middlewares/middleware.ts @@ -4,9 +4,9 @@ * See License in the project root for license information. * ------------------------------------------------------------------------------------------- */ -import { FetchResponse } from "../utils/fetchDefinitions"; -import { MiddlewareContext } from "./middlewareContext"; - +import {RequestOption} from "@microsoft/kiota-abstractions" +import { FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; +// use import types /** Defines the contract for a middleware in the request execution pipeline. */ export interface Middleware { /** Next middleware to be executed. The current middleware must execute it in its implementation. */ @@ -14,9 +14,9 @@ export interface Middleware { /** * Main method of the middleware. - * @param req The request object. + * @param requestInit The Fetch RequestInit object. * @param url The URL of the request. * @return A promise that resolves to the response object. */ - execute(middlewareContext: MiddlewareContext): Promise; + execute(url: string, requestInit: FetchRequestInit, requestOptions?: Record): Promise; } diff --git a/http/typescript/fetch/src/middlewares/middlewareContext.ts b/http/typescript/fetch/src/middlewares/middlewareContext.ts deleted file mode 100644 index 4ba826783b..0000000000 --- a/http/typescript/fetch/src/middlewares/middlewareContext.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -import { RequestOption } from "@microsoft/kiota-abstractions"; - -import { FetchRequestInfo, FetchRequestInit } from "../utils/fetchDefinitions"; - -/** - * @interface - * @property {RequestInfo} request - The request url string or the Request instance - * @property {RequestInit} [options] - The options for the request - * @property {Response} [response] - The response content - * - */ - -export interface MiddlewareContext { - requestUrl: FetchRequestInfo; - fetchRequestInit?: FetchRequestInit; - requestInformationOptions?: Record; // this can get updated depending on the use of request options -} diff --git a/http/typescript/fetch/src/middlewares/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/middlewareFactory.ts index 56b1c95d54..ed83f4e0c8 100644 --- a/http/typescript/fetch/src/middlewares/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/middlewareFactory.ts @@ -9,9 +9,9 @@ * @module MiddlewareFactory */ + import fetch from "node-fetch"; import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; import { CustomFetchHandler } from "./customFetchHandler"; -import { DefaultFetchHandler } from "./defaultFetchHandler"; import { Middleware } from "./middleware"; import { RedirectHandlerOptions } from "./options/redirectHandlerOptions"; import { RetryHandlerOptions } from "./options/retryHandlerOptions"; @@ -39,7 +39,7 @@ export class MiddlewareFactory { if (customFetch) { middlewareArray.push(new CustomFetchHandler(customFetch)); } else { - middlewareArray.push(new DefaultFetchHandler()); + middlewareArray.push(new CustomFetchHandler(fetch)); } return middlewareArray; diff --git a/http/typescript/fetch/src/middlewares/redirectHandler.ts b/http/typescript/fetch/src/middlewares/redirectHandler.ts index a2ceb7f5e1..d54c5e00cd 100644 --- a/http/typescript/fetch/src/middlewares/redirectHandler.ts +++ b/http/typescript/fetch/src/middlewares/redirectHandler.ts @@ -11,7 +11,7 @@ import { HttpMethod } from "@microsoft/kiota-abstractions"; -import { FetchResponse } from "../utils/fetchDefinitions"; +import { FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; import { Middleware } from "./middleware"; import { MiddlewareContext } from "./middlewareContext"; import { RedirectHandlerOptionKey, RedirectHandlerOptions } from "./options/redirectHandlerOptions"; @@ -23,174 +23,177 @@ import { RedirectHandlerOptionKey, RedirectHandlerOptions } from "./options/redi * Class representing RedirectHandler */ export class RedirectHandler implements Middleware { - /** - * @private - * @static - * A member holding the array of redirect status codes - */ - private static REDIRECT_STATUS_CODES: Set = new Set([ - 301, // Moved Permanently - 302, // Found - 303, // See Other - 307, // Temporary Permanently - 308, // Moved Permanently - ]); - - /** - * @private - * @static - * A member holding SeeOther status code - */ - private static STATUS_CODE_SEE_OTHER = 303; - - /** - * @private - * @static - * A member holding the name of the location header - */ - private static LOCATION_HEADER = "Location"; - - /** - * @private - * @static - * A member representing the authorization header name - */ - private static AUTHORIZATION_HEADER = "Authorization"; - - /** - * @private - * @static - * A member holding the manual redirect value - */ - private static MANUAL_REDIRECT = "manual"; - - /** Next middleware to be executed*/ - next: Middleware | undefined; - /** - * - * @public - * @constructor - * To create an instance of RedirectHandler - * @param {RedirectHandlerOptions} [options = new RedirectHandlerOptions()] - The redirect handler options instance - * @returns An instance of RedirectHandler - */ - - public constructor(private options: RedirectHandlerOptions = new RedirectHandlerOptions()) {} - - /** - * @private - * To check whether the response has the redirect status code or not - * @param {Response} response - The response object - * @returns A boolean representing whether the response contains the redirect status code or not - */ - private isRedirect(response: FetchResponse): boolean { - return RedirectHandler.REDIRECT_STATUS_CODES.has(response.status); - } - - /** - * @private - * To check whether the response has location header or not - * @param {Response} response - The response object - * @returns A boolean representing the whether the response has location header or not - */ - private hasLocationHeader(response: FetchResponse): boolean { - return response.headers.has(RedirectHandler.LOCATION_HEADER); - } - - /** - * @private - * To get the redirect url from location header in response object - * @param {Response} response - The response object - * @returns A redirect url from location header - */ - private getLocationHeader(response: FetchResponse): string { - return response.headers.get(RedirectHandler.LOCATION_HEADER); - } - - /** - * @private - * To check whether the given url is a relative url or not - * @param {string} url - The url string value - * @returns A boolean representing whether the given url is a relative url or not - */ - private isRelativeURL(url: string): boolean { - return url.indexOf("://") === -1; - } - - /** - * @private - * To check whether the authorization header in the request should be dropped for consequent redirected requests - * @param {string} requestUrl - The request url value - * @param {string} redirectUrl - The redirect url value - * @returns A boolean representing whether the authorization header in the request should be dropped for consequent redirected requests - */ - private shouldDropAuthorizationHeader(requestUrl: string, redirectUrl: string): boolean { - const schemeHostRegex = /^[A-Za-z].+?:\/\/.+?(?=\/|$)/; - const requestMatches: string[] = schemeHostRegex.exec(requestUrl); - let requestAuthority: string; - let redirectAuthority: string; - if (requestMatches !== null) { - requestAuthority = requestMatches[0]; - } - const redirectMatches: string[] = schemeHostRegex.exec(redirectUrl); - if (redirectMatches !== null) { - redirectAuthority = redirectMatches[0]; - } - return typeof requestAuthority !== "undefined" && typeof redirectAuthority !== "undefined" && requestAuthority !== redirectAuthority; - } - - /** - * @private - * @async - * To update a request url with the redirect url - * @param {string} redirectUrl - The redirect url value - * @param {Context} context - The context object value - * @returns Nothing - */ - private updateRequestUrl(redirectUrl: string, context: MiddlewareContext) { - context.requestUrl = redirectUrl; - } - - /** - * @private - * @async - * To execute the next middleware and to handle in case of redirect response returned by the server - * @param {Context} context - The context object - * @param {number} redirectCount - The redirect count value - * @param {RedirectHandlerOptions} options - The redirect handler options instance - * @returns A promise that resolves to nothing - */ - private async executeWithRedirect(context: MiddlewareContext, redirectCount: number, options: RedirectHandlerOptions): Promise { - const response = await this.next.execute(context); - if (redirectCount < options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && options.shouldRedirect(response)) { - ++redirectCount; - if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { - context.fetchRequestInit["method"] = HttpMethod.GET; - delete context.fetchRequestInit.body; - } else { - const redirectUrl: string = this.getLocationHeader(response); - if (context.fetchRequestInit.headers && !this.isRelativeURL(redirectUrl) && this.shouldDropAuthorizationHeader(context.requestUrl, redirectUrl)) { - delete context.fetchRequestInit.headers[RedirectHandler.AUTHORIZATION_HEADER]; - } - this.updateRequestUrl(redirectUrl, context); - } - return await this.executeWithRedirect(context, redirectCount, options); - } else { - return response; - } - } - - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The context object of the request - * @returns A Promise that resolves to nothing - */ - public execute(context: MiddlewareContext): Promise { - const redirectCount = 0; - const options: RedirectHandlerOptions = ((context?.requestInformationOptions && context.requestInformationOptions[RedirectHandlerOptionKey]) as RedirectHandlerOptions) || this.options; - context.fetchRequestInit.redirect = RedirectHandler.MANUAL_REDIRECT; - return this.executeWithRedirect(context, redirectCount, options); - } + /** + * @private + * @static + * A member holding the array of redirect status codes + */ + private static REDIRECT_STATUS_CODES: Set = new Set([ + 301, // Moved Permanently + 302, // Found + 303, // See Other + 307, // Temporary Permanently + 308, // Moved Permanently + ]); + + /** + * @private + * @static + * A member holding SeeOther status code + */ + private static STATUS_CODE_SEE_OTHER = 303; + + /** + * @private + * @static + * A member holding the name of the location header + */ + private static LOCATION_HEADER = "Location"; + + /** + * @private + * @static + * A member representing the authorization header name + */ + private static AUTHORIZATION_HEADER = "Authorization"; + + /** + * @private + * @static + * A member holding the manual redirect value + */ + private static MANUAL_REDIRECT = "manual"; + + /** Next middleware to be executed*/ + next: Middleware | undefined; + /** + * + * @public + * @constructor + * To create an instance of RedirectHandler + * @param {RedirectHandlerOptions} [options = new RedirectHandlerOptions()] - The redirect handler options instance + * @returns An instance of RedirectHandler + */ + + public constructor(private options: RedirectHandlerOptions = new RedirectHandlerOptions()) { } + + /** + * @private + * To check whether the response has the redirect status code or not + * @param {Response} response - The response object + * @returns A boolean representing whether the response contains the redirect status code or not + */ + private isRedirect(response: FetchResponse): boolean { + return RedirectHandler.REDIRECT_STATUS_CODES.has(response.status); + } + + /** + * @private + * To check whether the response has location header or not + * @param {Response} response - The response object + * @returns A boolean representing the whether the response has location header or not + */ + private hasLocationHeader(response: FetchResponse): boolean { + return response.headers.has(RedirectHandler.LOCATION_HEADER); + } + + /** + * @private + * To get the redirect url from location header in response object + * @param {Response} response - The response object + * @returns A redirect url from location header + */ + private getLocationHeader(response: FetchResponse): string { + return response.headers.get(RedirectHandler.LOCATION_HEADER); + } + + /** + * @private + * To check whether the given url is a relative url or not + * @param {string} url - The url string value + * @returns A boolean representing whether the given url is a relative url or not + */ + private isRelativeURL(url: string): boolean { + return url.indexOf("://") === -1; + } + + /** + * @private + * To check whether the authorization header in the request should be dropped for consequent redirected requests + * @param {string} requestUrl - The request url value + * @param {string} redirectUrl - The redirect url value + * @returns A boolean representing whether the authorization header in the request should be dropped for consequent redirected requests + */ + private shouldDropAuthorizationHeader(requestUrl: string, redirectUrl: string): boolean { + const schemeHostRegex = /^[A-Za-z].+?:\/\/.+?(?=\/|$)/; + const requestMatches: string[] = schemeHostRegex.exec(requestUrl); + let requestAuthority: string; + let redirectAuthority: string; + if (requestMatches !== null) { + requestAuthority = requestMatches[0]; + } + const redirectMatches: string[] = schemeHostRegex.exec(redirectUrl); + if (redirectMatches !== null) { + redirectAuthority = redirectMatches[0]; + } + return typeof requestAuthority !== "undefined" && typeof redirectAuthority !== "undefined" && requestAuthority !== redirectAuthority; + } + + /** + * @private + * @async + * To update a request url with the redirect url + * @param {string} redirectUrl - The redirect url value + * @param {Context} context - The context object value + * @returns Nothing + */ + private updateRequestUrl(redirectUrl: string, context: MiddlewareContext) { + context.requestUrl = redirectUrl; + } + + /** + * @private + * @async + * To execute the next middleware and to handle in case of redirect response returned by the server + * @param {Context} context - The context object + * @param {number} redirectCount - The redirect count value + * @param {RedirectHandlerOptions} options - The redirect handler options instance + * @returns A promise that resolves to nothing + */ + private async executeWithRedirect(url: string, fetchRequestInit: FetchRequestInit, redirectCount: number, requestOptions?: Record): Promise { + const response = await this.next.execute(url, fetchRequestInit, requestOptions); + if (redirectCount < this.options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && this.options.shouldRedirect(response)) { + ++redirectCount; + if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { + fetchRequestInit["method"] = HttpMethod.GET; + delete fetchRequestInit.body; + } else { + const redirectUrl: string = this.getLocationHeader(response); + if (fetchRequestInit.headers && !this.isRelativeURL(redirectUrl) && this.shouldDropAuthorizationHeader(url, redirectUrl)) { + delete fetchRequestInit.headers[RedirectHandler.AUTHORIZATION_HEADER]; + } + url = redirectUrl; // check how to maintain url + } + return await this.executeWithRedirect(url, requestOptions, redirectCount, requestOptions); + } else { + return response; + } + } + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The context object of the request + * @returns A Promise that resolves to nothing + */ + public execute(url: string, requestInit: FetchRequestInit, requestOptions?: Record): Promise { + const redirectCount = 0; + if (requestOptions && requestOptions[RedirectHandlerOptionKey])) + { + this.options = requestOptions[RedirectHandlerOptionKey] as RedirectHandlerOptions; + } + requestInit.redirect = RedirectHandler.MANUAL_REDIRECT; + return this.executeWithRedirect(url, requestInit, redirectCount, requestOptions); + } } diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts index 4590c3edf1..cd559208b1 100644 --- a/http/typescript/fetch/src/middlewares/retryHandler.ts +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -151,14 +151,14 @@ export class RetryHandler implements Middleware { * @param {RetryHandlerOptions} options - The retry middleware options instance * @returns A Promise that resolves to nothing */ - private async executeWithRetry(context: MiddlewareContext, retryAttempts: number, options: RetryHandlerOptions): Promise { - const response = await this.next.execute(context); - if (retryAttempts < options.maxRetries && this.isRetry(response) && this.isBuffered(context.requestUrl, context.fetchRequestInit) && options.shouldRetry(options.delay, retryAttempts, context.requestUrl, context.fetchRequestInit, response)) { + private async executeWithRetry(url: string, requestInit: FetchRequestInit, retryAttempts:number, requestOptions?: Record): Promise { + const response = await this.next.execute(url, requestInit, requestOptions); + if (retryAttempts < this.options.maxRetries && this.isRetry(response) && this.isBuffered(url, requestInit) && this.options.shouldRetry(this.options.delay, retryAttempts, url, requestInit as FetchRequestInit, response)) { ++retryAttempts; - setRequestHeader(context.fetchRequestInit, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); - const delay = this.getDelay(response, retryAttempts, options.delay); + setRequestHeader(requestInit, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); + const delay = this.getDelay(response, retryAttempts, this.options.delay); await this.sleep(delay); - return await this.executeWithRetry(context, retryAttempts, options); + return await this.executeWithRetry(url, requestInit, retryAttempts, requestOptions); } else { return response; } @@ -171,9 +171,12 @@ export class RetryHandler implements Middleware { * @param {Context} context - The context object of the request * @returns A Promise that resolves to nothing */ - public execute(context: MiddlewareContext): Promise { + public execute(url: string, requestInit: FetchRequestInit, requestOptions?: Record): Promise { const retryAttempts = 0; - const options: RetryHandlerOptions = ((context?.requestInformationOptions && context.requestInformationOptions[RetryHandlerOptionKey]) as RetryHandlerOptions) || this.options; - return this.executeWithRetry(context, retryAttempts, options); + + if((requestOptions && requestOptions[RetryHandlerOptionKey])){ + this.options = requestOptions[RetryHandlerOptionKey] as RetryHandlerOptions; + } + return this.executeWithRetry(url, requestInit, retryAttempts, requestOptions); } } From 142b70fdaf0911005073d4ab2ec0273490b44aba Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Mon, 14 Mar 2022 22:22:55 -0700 Subject: [PATCH 24/34] removing url util abstractions --- .../typescript/src/readableStreamContent.ts | 15 -- .../typescript/src/requestInformation.ts | 243 +++++++++--------- abstractions/typescript/src/requestOption.ts | 15 +- .../typescript/src/utils/browser/index.ts | 2 - .../typescript/src/utils/browser/urlUtil.ts | 3 - abstractions/typescript/src/utils/index.ts | 1 - abstractions/typescript/src/utils/urlUtil.ts | 1 - .../fetch/src/fetchRequestAdapter.ts | 2 +- 8 files changed, 127 insertions(+), 155 deletions(-) delete mode 100644 abstractions/typescript/src/readableStreamContent.ts delete mode 100644 abstractions/typescript/src/utils/browser/index.ts delete mode 100644 abstractions/typescript/src/utils/browser/urlUtil.ts delete mode 100644 abstractions/typescript/src/utils/urlUtil.ts diff --git a/abstractions/typescript/src/readableStreamContent.ts b/abstractions/typescript/src/readableStreamContent.ts deleted file mode 100644 index cb27ea0b5d..0000000000 --- a/abstractions/typescript/src/readableStreamContent.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -/* eslint-disable @typescript-eslint/no-empty-interface*/ - -/** - * Empty interface expecting the type of NodeJS.ReadableStream or dom ReadableStream - * Node example: import {Readable} from "stream"; const readableStream = new Readable(); - * Browser example: const readableStream = new ReadableStream(); - */ -export interface ReadableStreamContent {} diff --git a/abstractions/typescript/src/requestInformation.ts b/abstractions/typescript/src/requestInformation.ts index bd84db33ca..694d6d2511 100644 --- a/abstractions/typescript/src/requestInformation.ts +++ b/abstractions/typescript/src/requestInformation.ts @@ -7,131 +7,132 @@ import { Parsable } from "./serialization"; /** This class represents an abstract HTTP request. */ export class RequestInformation { - /** The URI of the request. */ - private uri?: string; - /** The path parameters for the request. */ - public pathParameters: Record = {}; - /** The URL template for the request */ - public urlTemplate?: string; - /** Gets the URL of the request */ - public get URL(): string { - const rawUrl = this.pathParameters[ - RequestInformation.raw_url_key - ] as string; - if (this.uri) { - return this.uri; - } else if (rawUrl) { - this.URL = rawUrl; - return rawUrl; - } else if (!this.queryParameters) { - throw new Error("queryParameters cannot be undefined"); - } else if (!this.pathParameters) { - throw new Error("pathParameters cannot be undefined"); - } else if (!this.urlTemplate) { - throw new Error("urlTemplate cannot be undefined"); - } else { - const template = new urlTpl.URI.Template(this.urlTemplate); - const data = {} as { [key: string]: unknown }; - for (const key in this.queryParameters) { - if (this.queryParameters[key]) { - data[key] = this.queryParameters[key]; + /** The URI of the request. */ + private uri?: string; + /** The path parameters for the request. */ + public pathParameters: Record = {}; + /** The URL template for the request */ + public urlTemplate?: string; + /** Gets the URL of the request */ + public get URL(): string { + const rawUrl = this.pathParameters[ + RequestInformation.raw_url_key + ] as string; + if (this.uri) { + return this.uri; + } else if (rawUrl) { + this.URL = rawUrl; + return rawUrl; + } else if (!this.queryParameters) { + throw new Error("queryParameters cannot be undefined"); + } else if (!this.pathParameters) { + throw new Error("pathParameters cannot be undefined"); + } else if (!this.urlTemplate) { + throw new Error("urlTemplate cannot be undefined"); + } else { + const template = new urlTpl.URI.Template(this.urlTemplate); + const data = {} as { [key: string]: unknown }; + for (const key in this.queryParameters) { + if (this.queryParameters[key]) { + data[key] = this.queryParameters[key]; + } + } + for (const key in this.pathParameters) { + if (this.pathParameters[key]) { + data[key] = this.pathParameters[key]; + } + } + return template.expand(data); } - } - for (const key in this.pathParameters) { - if (this.pathParameters[key]) { - data[key] = this.pathParameters[key]; - } - } - return template.expand(data); } - } - /** Sets the URL of the request */ - public set URL(url: string) { - if (!url) throw new Error("URL cannot be undefined"); - this.uri = url; - this.queryParameters = {}; - this.pathParameters = {}; - } - public static raw_url_key = "request-raw-url"; - /** The HTTP method for the request */ - public httpMethod?: HttpMethod; - /** The Request Body. */ - public content?: ArrayBuffer; - /** The Query Parameters of the request. */ - public queryParameters: Record< - string, - string | number | boolean | undefined - > = {}; //TODO: case insensitive - /** The Request Headers. */ - public headers: Record = {}; //TODO: case insensitive - private _requestOptions: Record = {}; //TODO: case insensitive - /** Gets the request options for the request. */ - public getRequestOptions() { - return this._requestOptions; - } - public addRequestOptions(...options: RequestOption[]) { - if (!options || options.length === 0) return; - options.forEach((option) => { - this._requestOptions[option.getKey()] = option; - }); - } - /** Removes the request options for the request. */ - public removeRequestOptions(...options: RequestOption[]) { - if (!options || options.length === 0) return; - options.forEach((option) => { - delete this._requestOptions[option.getKey()]; - }); - } - private static binaryContentType = "application/octet-stream"; - private static contentTypeHeader = "Content-Type"; - /** - * Sets the request body from a model with the specified content type. - * @param values the models. - * @param contentType the content type. - * @param requestAdapter The adapter service to get the serialization writer from. - * @typeParam T the model type. - */ - public setContentFromParsable = ( - requestAdapter?: RequestAdapter | undefined, - contentType?: string | undefined, - ...values: T[] - ): void => { - if (!requestAdapter) throw new Error("httpCore cannot be undefined"); - if (!contentType) throw new Error("contentType cannot be undefined"); - if (!values || values.length === 0) { - throw new Error("values cannot be undefined or empty"); + /** Sets the URL of the request */ + public set URL(url: string) { + if (!url) throw new Error("URL cannot be undefined"); + this.uri = url; + this.queryParameters = {}; + this.pathParameters = {}; + } + public static raw_url_key = "request-raw-url"; + /** The HTTP method for the request */ + public httpMethod?: HttpMethod; + /** The Request Body. */ + public content?: ArrayBuffer; + /** The Query Parameters of the request. */ + public queryParameters: Record< + string, + string | number | boolean | undefined + > = {}; //TODO: case insensitive + /** The Request Headers. */ + public headers: Record = {}; //TODO: case insensitive + private _requestOptions: Record = {}; //TODO: case insensitive + /** Gets the request options for the request. */ + public getRequestOptions() { + return this._requestOptions; } - const writer = requestAdapter - .getSerializationWriterFactory() - .getSerializationWriter(contentType); - if (!this.headers) { - this.headers = {}; + public addRequestOptions(...options: RequestOption[]) { + if (!options || options.length === 0) return; + options.forEach((option) => { + this._requestOptions[option.getKey()] = option; + }); } - this.headers[RequestInformation.contentTypeHeader] = contentType; - if (values.length === 1) { - writer.writeObjectValue(undefined, values[0]); - } else { - writer.writeCollectionOfObjectValues(undefined, values); + /** Removes the request options for the request. */ + public removeRequestOptions(...options: RequestOption[]) { + if (!options || options.length === 0) return; + options.forEach((option) => { + delete this._requestOptions[option.getKey()]; + }); } - this.content = writer.getSerializedContent(); - }; - /** - * Sets the request body to be a binary stream. - * @param value the binary stream - */ - public setStreamContent = (value: ArrayBuffer): void => { - this.headers[RequestInformation.contentTypeHeader] = - RequestInformation.binaryContentType; - this.content = value; - }; - /** - * Sets the query string parameters from a raw object. - * @param parameters the parameters. - */ - public setQueryStringParametersFromRawObject = (q: object): void => { - Object.entries(q).forEach(([k, v]) => { - this.queryParameters[k] = v; - }); - }; + private static binaryContentType = "application/octet-stream"; + private static contentTypeHeader = "Content-Type"; + /** + * Sets the request body from a model with the specified content type. + * @param values the models. + * @param contentType the content type. + * @param requestAdapter The adapter service to get the serialization writer from. + * @typeParam T the model type. + */ + public setContentFromParsable = ( + requestAdapter?: RequestAdapter | undefined, + contentType?: string | undefined, + ...values: T[] + ): void => { + if (!requestAdapter) throw new Error("httpCore cannot be undefined"); + if (!contentType) throw new Error("contentType cannot be undefined"); + if (!values || values.length === 0) { + throw new Error("values cannot be undefined or empty"); + } + + const writer = requestAdapter + .getSerializationWriterFactory() + .getSerializationWriter(contentType); + if (!this.headers) { + this.headers = {}; + } + this.headers[RequestInformation.contentTypeHeader] = contentType; + if (values.length === 1) { + writer.writeObjectValue(undefined, values[0]); + } else { + writer.writeCollectionOfObjectValues(undefined, values); + } + this.content = writer.getSerializedContent(); + }; + /** + * Sets the request body to be a binary stream. + * @param value the binary stream + */ + public setStreamContent = (value: ArrayBuffer): void => { + this.headers[RequestInformation.contentTypeHeader] = + RequestInformation.binaryContentType; + this.content = value; + }; + /** + * Sets the query string parameters from a raw object. + * @param parameters the parameters. + */ + public setQueryStringParametersFromRawObject = (q: object): void => { + Object.entries(q).forEach(([k, v]) => { + this.queryParameters[k] = v; + }); + }; } diff --git a/abstractions/typescript/src/requestOption.ts b/abstractions/typescript/src/requestOption.ts index 023f2373f3..0507f72677 100644 --- a/abstractions/typescript/src/requestOption.ts +++ b/abstractions/typescript/src/requestOption.ts @@ -1,11 +1,4 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ -/** - * Interface accepting request options - * to be passed in RequestInformaton object - */ -export interface RequestOption {} +/** Represents a request option. */ +export interface RequestOption { + getKey(): string; +} diff --git a/abstractions/typescript/src/utils/browser/index.ts b/abstractions/typescript/src/utils/browser/index.ts deleted file mode 100644 index 8cd300ad4f..0000000000 --- a/abstractions/typescript/src/utils/browser/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "../stringUtils"; -export * from "./urlUtil"; diff --git a/abstractions/typescript/src/utils/browser/urlUtil.ts b/abstractions/typescript/src/utils/browser/urlUtil.ts deleted file mode 100644 index ed992431bd..0000000000 --- a/abstractions/typescript/src/utils/browser/urlUtil.ts +++ /dev/null @@ -1,3 +0,0 @@ -const url = URL; - -export { url as URL }; diff --git a/abstractions/typescript/src/utils/index.ts b/abstractions/typescript/src/utils/index.ts index e282167450..33622931e5 100644 --- a/abstractions/typescript/src/utils/index.ts +++ b/abstractions/typescript/src/utils/index.ts @@ -1,2 +1 @@ export * from "./stringUtils"; -export * from "./urlUtil"; diff --git a/abstractions/typescript/src/utils/urlUtil.ts b/abstractions/typescript/src/utils/urlUtil.ts deleted file mode 100644 index 81ef55e6ea..0000000000 --- a/abstractions/typescript/src/utils/urlUtil.ts +++ /dev/null @@ -1 +0,0 @@ -export { URL } from "url"; diff --git a/http/typescript/fetch/src/fetchRequestAdapter.ts b/http/typescript/fetch/src/fetchRequestAdapter.ts index d4c475a5b8..e9fedce1f6 100644 --- a/http/typescript/fetch/src/fetchRequestAdapter.ts +++ b/http/typescript/fetch/src/fetchRequestAdapter.ts @@ -172,7 +172,7 @@ export class FetchRequestAdapter implements RequestAdapter { await this.authenticationProvider.authenticateRequest(requestInfo); const request = this.getRequestFromRequestInformation(requestInfo); - return await this.httpClient.fetch(requestInfo.URL, request); + return await this.httpClient.executeFetch(requestInfo.URL, request); }; private setBaseUrlForRequestInformation = (requestInfo: RequestInformation): void => { requestInfo.pathParameters["baseurl"] = this.baseUrl; From e0992a8cc50de04b9e999f06ebe1d01091b3707d Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Mon, 14 Mar 2022 23:47:11 -0700 Subject: [PATCH 25/34] using fetch definitions only when required --- http/typescript/fetch/package-lock.json | 9464 +++++++++++++++-- http/typescript/fetch/package.json | 17 +- http/typescript/fetch/src/browser/index.ts | 5 +- .../fetch/src/fetchRequestAdapter.ts | 2 +- http/typescript/fetch/src/httpClient.ts | 25 +- http/typescript/fetch/src/index.ts | 5 +- http/typescript/fetch/src/middleware.ts | 14 - .../middlewares/browser/middlewareFactory.ts | 6 +- .../src/middlewares/customFetchHandler.ts | 5 +- .../fetch/src/middlewares/middleware.ts | 5 +- .../src/middlewares/middlewareFactory.ts | 5 +- .../options/RetryHandlerOptions.ts | 4 +- .../options/telemetryHandlerOptions.ts | 6 + .../fetch/src/middlewares/redirectHandler.ts | 24 +- .../fetch/src/middlewares/retryHandler.ts | 24 +- .../fetch/src/middlewares/telemetryHandler.ts | 20 + .../fetch/src/utils/fetchDefinitions.ts | 74 +- .../typescript/fetch/src/utils/headersUtil.ts | 8 +- 18 files changed, 8658 insertions(+), 1055 deletions(-) delete mode 100644 http/typescript/fetch/src/middleware.ts create mode 100644 http/typescript/fetch/src/middlewares/options/telemetryHandlerOptions.ts create mode 100644 http/typescript/fetch/src/middlewares/telemetryHandler.ts diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index 0d658e84ca..87d0ea9f22 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -9,22 +9,464 @@ "version": "1.0.17", "license": "MIT", "dependencies": { - "@microsoft/kiota-abstractions": "^1.0.30", - "cross-fetch": "^3.1.5", - "tslib": "^2.3.1" + "@microsoft/kiota-abstractions": "1.0.31", + "node-fetch": "^2.6.5", + "tslib": "2.3.1" }, "devDependencies": { - "@types/node": "^17.0.21", + "@microsoft/kiota-abstractions": "^1.0.30", + "@rollup/plugin-commonjs": "^21.0.0", + "@rollup/plugin-node-resolve": "^13.0.5", + "@types/chai": "^4.2.22", + "@types/mocha": "^9.0.0", + "@types/node": "^17.0.13", + "@types/sinon": "^10.0.4", "@typescript-eslint/eslint-plugin": "^5.14.0", "@typescript-eslint/parser": "^5.14.0", + "chai": "^4.3.4", + "cross-fetch": "^3.1.5", "eslint": "^8.11.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-simple-import-sort": "^7.0.0", + "esm": "^3.2.25", + "karma": "^6.3.4", + "karma-chai": "^0.1.0", + "karma-chrome-launcher": "^3.1.0", + "karma-firefox-launcher": "^2.1.1", + "karma-mocha": "^2.0.1", + "karma-typescript": "^5.5.2", + "mocha": "^8.4.0", "prettier": "^2.5.1", + "rollup": "^2.58.0", + "rollup-plugin-terser": "^7.0.2", + "sinon": "^11.1.2", + "tslib": "^2.3.1", "typescript": "^4.6.2" } }, + "node_modules/@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.7.tgz", + "integrity": "sha512-djHlEfFHnSnTAcPb7dATbiM5HxGOP98+3JLBZtjRb5I7RXrw7kFRoG2dXM8cm3H+o11A8IFH/uprmJpwFynRNQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.7", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.7", + "@babel/parser": "^7.17.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.7.tgz", + "integrity": "sha512-TKsj9NkjJfTBxM7Phfy7kv6yYc4ZcOo+AaWGqQOKTPDOmcGkIFb5xNA746eKisQkm4yavUYh4InYM9S+VnO01w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.7.tgz", + "integrity": "sha512-bm3AQf45vR4gKggRfvJdYJ0gFLoCbsPxiFLSH6hTVYABptNHY6l9NrhnucVjQ/X+SPtLANT9lc0fFhikj+VBRA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", @@ -65,10 +507,44 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@microsoft/kiota-abstractions": { - "version": "1.0.30", - "resolved": "https://npm.pkg.github.com/download/@microsoft/kiota-abstractions/1.0.30/4c12c9fd49bb612df77e3f769c9d3f69f8d888335939c199d87c9df2219126e8", - "integrity": "sha512-DXWe4ELyj8ZtU3ZfuR7DxXXuzW69cjLaie8aie4VM5/pRYtXCZNGu63/3ecBBGjFsnWo9P9qY1ZynsBtvwBtkw==", + "version": "1.0.31", + "resolved": "https://npm.pkg.github.com/download/@microsoft/kiota-abstractions/1.0.31/6aef85a104537da5cb69afc2946a63368872399a4cfc21c15e219aa3521a5909", + "integrity": "sha512-2OtzhuEkkxSNurlwL3CyjqsTskSWKvJKhkQDC/RJ7QwJnVUSMOh2lSFiubvsF7jmqN+u0e67p7wi4y7cdUY6wA==", "license": "MIT", "dependencies": { "tinyduration": "^3.2.2", @@ -112,54 +588,222 @@ "node": ">= 8" } }, - "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", - "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", + "node_modules/@rollup/plugin-commonjs": { + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.2.tgz", + "integrity": "sha512-d/OmjaLVO4j/aQX69bwpWPpbvI3TJkQuxoAk7BH8ew1PyoMBLTOuvJTjzG8oEoW7drIIqB0KCJtfFLu/2GClWg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/type-utils": "5.14.0", - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">= 8.0.0" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "rollup": "^2.38.3" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", + "node_modules/@rollup/plugin-node-resolve": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.3.tgz", + "integrity": "sha512-BdxNk+LtmElRo5d06MGY4zoepyrXX1tkzX2hrnPEZ53k78GuOMWLqmJDGIIOPwVRIFZrLQOo+Yr6KtCuLIA0AQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^2.42.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", + "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "node_modules/@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/@types/chai": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz", + "integrity": "sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==", + "dev": true + }, + "node_modules/@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.0.tgz", + "integrity": "sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==", + "dev": true + }, + "node_modules/@types/node": { + "version": "17.0.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", + "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "dev": true + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/sinon": { + "version": "10.0.11", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.11.tgz", + "integrity": "sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g==", + "dev": true, + "dependencies": { + "@types/sinonjs__fake-timers": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", + "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.14.0", + "@typescript-eslint/type-utils": "5.14.0", + "@typescript-eslint/utils": "5.14.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", "dev": true, "dependencies": { @@ -308,6 +952,25 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.7.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", @@ -329,6 +992,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -345,6 +1017,15 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -369,6 +1050,19 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -384,12 +1078,149 @@ "node": ">=8" } }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -412,128 +1243,232 @@ "node": ">=8" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "node_modules/browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "resolve": "^1.17.0" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, "dependencies": { - "node-fetch": "2.6.7" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" } }, - "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "dev": true, "dependencies": { - "ms": "2.1.2" + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", + "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001313", + "electron-to-chromium": "^1.4.76", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=6.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/doctrine": { + "node_modules/builtin-status-codes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "dependencies": { - "esutils": "^2.0.2" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "engines": { - "node": ">=6.0.0" + "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "engines": { "node": ">=10" @@ -542,1103 +1477,4817 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", - "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", + "node_modules/caniuse-lite": { + "version": "1.0.30001317", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001317.tgz", + "integrity": "sha512-xIZLh8gBm4dqNX0gkzrBeyI86J2eCjWzYAs40q88smG844YIrN4tVQl/RhquHvKEKImWWFIVh1Lxe5n1G/N+GQ==", "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.2.1", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/browserslist" } }, - "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "node_modules/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" }, - "peerDependencies": { - "eslint": ">=7.0.0" + "engines": { + "node": ">=4" } }, - "node_modules/eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint-plugin-simple-import-sort": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz", - "integrity": "sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==", + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true, - "peerDependencies": { - "eslint": ">=5.0.0" + "engines": { + "node": "*" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=8.0.0" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", "dev": true, "engines": { - "node": ">=4.0" + "node": ">=0.8" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "color-name": "~1.1.4" }, "engines": { - "node": ">=10.13.0" + "node": ">=7.0.0" } }, - "node_modules/espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", "dev": true, "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" - }, + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "node_modules/combine-source-map/node_modules/convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, + "node_modules/combine-source-map/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, "dependencies": { - "estraverse": "^5.1.0" + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" }, "engines": { - "node": ">=0.10" + "node": ">= 0.10.0" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">= 0.6" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" + "safe-buffer": "~5.1.1" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">= 0.6" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, "engines": { - "node": ">=4.0" + "node": ">= 0.10" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, - "node_modules/fast-diff": { + "node_modules/create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "dependencies": { - "reusify": "^1.0.4" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "node-fetch": "2.6.7" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { - "to-regex-range": "^5.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "*" } }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/functional-red-black-tree": { + "node_modules/custom-event": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/date-format": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.5.tgz", + "integrity": "sha512-zBhRiN/M0gDxUoM2xRtzTjJzSg0XEi1ofYpF84PfXeS3hN2PsGxmc7jw3DNQtFlimRbMmob5FC3G0cJq6jQQpw==", "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=4.0" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "ms": "2.1.2" }, "engines": { - "node": ">= 6" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "type-detect": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.12" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "dev": true, - "engines": { - "node": ">= 4" + "dependencies": { + "clone": "^1.0.2" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "object-keys": "^1.0.12" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true, "engines": { - "node": ">=0.8.19" + "node": ">= 0.6" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dev": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", "dev": true }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.3.1" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "dependencies": { - "is-extglob": "^2.1.1" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, "engines": { - "node": ">=0.12.0" + "node": ">=6.0.0" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", "dev": true, "dependencies": { - "argparse": "^2.0.1" + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/domain-browser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "dev": true, + "engines": { + "node": ">=10" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "url": "https://bevry.me/fund" } }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "node_modules/electron-to-chromium": { + "version": "1.4.84", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.84.tgz", + "integrity": "sha512-b+DdcyOiZtLXHdgEG8lncYJdxbdJWJvclPNMg0eLUDcSOSO876WA/pYjdSblUTd7eJdIs4YdIxHWGazx7UPSJw==", "dev": true }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true, "engines": { - "node": ">= 8" + "node": ">= 0.8" } }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "node_modules/engine.io": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", + "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" }, "engines": { - "node": ">=8.6" + "node": ">=10.0.0" } }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "node_modules/engine.io-parser": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "@socket.io/base64-arraybuffer": "~1.0.2" }, "engines": { - "node": "*" + "node": ">=10.0.0" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", "dev": true }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, "dependencies": { - "whatwg-url": "^5.0.0" + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" }, "engines": { - "node": "4.x || >=6.0.0" + "node": ">= 0.4" }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" + "node": ">= 0.4" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", + "dev": true }, - "node_modules/path-key": { + "node_modules/escalade": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { - "node": ">=8.6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "node_modules/eslint": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", + "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, + "dependencies": { + "@eslint/eslintrc": "^1.2.1", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-simple-import-sort": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz", + "integrity": "sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==", + "dev": true, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/espree": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "dev": true, + "dependencies": { + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "node_modules/fs-extra": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", + "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dev": true, + "dependencies": { + "source-map": "~0.5.3" + } + }, + "node_modules/inline-source-map/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", + "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "node_modules/karma": { + "version": "6.3.17", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.17.tgz", + "integrity": "sha512-2TfjHwrRExC8yHoWlPBULyaLwAFmXmxQrcuFImt/JsAsSZu1uOWTZ1ZsWjqQtWpHLiatJOHL5jFjXSJIgCd01g==", + "dev": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.2.0", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chai": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/karma-chai/-/karma-chai-0.1.0.tgz", + "integrity": "sha1-vuWtQEAFF4Ea40u5RfdikJEIt5o=", + "dev": true, + "peerDependencies": { + "chai": "*", + "karma": ">=0.10.9" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", + "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", + "dev": true, + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/karma-firefox-launcher": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.2.tgz", + "integrity": "sha512-VV9xDQU1QIboTrjtGVD4NCfzIH7n01ZXqy/qpBhnOeGVOkG5JYPEm8kuSd7psHE6WouZaQ9Ool92g8LFweSNMA==", + "dev": true, + "dependencies": { + "is-wsl": "^2.2.0", + "which": "^2.0.1" + } + }, + "node_modules/karma-mocha": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", + "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.3" + } + }, + "node_modules/karma-typescript": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-5.5.3.tgz", + "integrity": "sha512-l1FHurolXEBIzRa9ExpNtjzysAhsi/vLpTazpwLHWWK86mknvVpqor6pRZ5Nid7jvOPrTBqAq0JRuLgiCdRkFw==", + "dev": true, + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2", + "assert": "^2.0.0", + "async": "^3.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.4.3", + "combine-source-map": "^0.8.0", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "convert-source-map": "^1.7.0", + "crypto-browserify": "^3.12.0", + "diff": "^4.0.1", + "domain-browser": "^4.16.0", + "events": "^3.2.0", + "glob": "^7.1.6", + "https-browserify": "^1.0.0", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.19", + "log4js": "^6.3.0", + "minimatch": "^3.0.4", + "os-browserify": "^0.3.0", + "pad": "^3.2.0", + "path-browserify": "^1.0.0", + "process": "^0.11.10", + "punycode": "^2.1.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.1.1", + "source-map": "^0.7.3", + "stream-browserify": "^3.0.0", + "stream-http": "^3.1.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.11", + "tmp": "^0.2.1", + "tty-browserify": "^0.0.1", + "url": "^0.11.0", + "util": "^0.12.1", + "vm-browserify": "^1.1.2" + }, + "peerDependencies": { + "karma": "1 || 2 || 3 || 4 || 5 || 6", + "typescript": "1 || 2 || 3 || 4" + } + }, + "node_modules/karma-typescript/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/log4js": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.2.tgz", + "integrity": "sha512-k80cggS2sZQLBwllpT1p06GtfvzMmSdUCkW96f0Hj83rKGJDAu2vZjt9B9ag2vx8Zz1IXzxoLgqvRJCdMKybGg==", + "dev": true, + "dependencies": { + "date-format": "^4.0.4", + "debug": "^4.3.3", + "flatted": "^3.2.5", + "rfdc": "^1.3.0", + "streamroller": "^3.0.4" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 10.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mocha/node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nise": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", + "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pad": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pad/-/pad-3.2.0.tgz", + "integrity": "sha512-2u0TrjcGbOjBTJpyewEl4hBO3OeX5wWue7eIFPzQTg6wFSvoaHcBTTUY5m+n0hd04gmTCPuY0kCpVIVuw5etwg==", + "dev": true, + "dependencies": { + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "dev": true, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rollup": { + "version": "2.70.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", + "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sinon": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", + "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/socket.io": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", + "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "dev": true + }, + "node_modules/socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dev": true, + "dependencies": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/streamroller": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.5.tgz", + "integrity": "sha512-5uzTEUIi4OB5zy/H30kbUN/zpDNJsFUA+Z47ZL8EfrP93lcZvRLEqdbhdunEPa7CouuAzXXsHpCJ9dg90Umw7g==", + "dev": true, + "dependencies": { + "date-format": "^4.0.5", + "debug": "^4.3.3", + "fs-extra": "^10.0.1" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/terser": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "dev": true, + "dependencies": { + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tinyduration": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/tinyduration/-/tinyduration-3.2.2.tgz", + "integrity": "sha512-eH6D0KIA4Xxje3ZRUnbsWfN28pAgTx3ZFQvgb0w9u8p9lxSX0eloxi4w165gv03GnvduR9m5JhToPxXvADHe+w==" + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, "engines": { - "node": ">=10.13.0" + "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" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "dependencies": { - "fast-diff": "^1.1.2" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.8.0" } }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", + "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "paypal", + "url": "https://paypal.me/faisalman" } - ] + ], + "engines": { + "node": "*" + } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-template-lite": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/uri-template-lite/-/uri-template-lite-22.1.0.tgz", + "integrity": "sha512-KJvWlYkFgeHxFt2Y0c6E/MM6X1mgw1PZ/PfhLKI/S/dPqnr6RXZ6AFE7uEE3T5RxZ8+8uHwONsmBZ/CUPfNaRg==" + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", + "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10.0.0" }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=0.4" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "dependencies": { - "queue-microtask": "^1.2.2" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, - "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, "engines": { "node": ">=10" } }, - "node_modules/shebang-command": { + "node_modules/yargs-unparser": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, "dependencies": { - "shebang-regex": "^3.0.0" + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/slash": { + "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.0" + } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "requires": { + "@babel/highlight": "^7.16.7" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "@babel/compat-data": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", "dev": true }, - "node_modules/tinyduration": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/tinyduration/-/tinyduration-3.2.2.tgz", - "integrity": "sha512-eH6D0KIA4Xxje3ZRUnbsWfN28pAgTx3ZFQvgb0w9u8p9lxSX0eloxi4w165gv03GnvduR9m5JhToPxXvADHe+w==" + "@babel/core": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.7.tgz", + "integrity": "sha512-djHlEfFHnSnTAcPb7dATbiM5HxGOP98+3JLBZtjRb5I7RXrw7kFRoG2dXM8cm3H+o11A8IFH/uprmJpwFynRNQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.7", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.7", + "@babel/parser": "^7.17.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "@babel/generator": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", "dev": true, + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, "dependencies": { - "is-number": "^7.0.0" + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" }, - "engines": { - "node": ">=8.0" + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } }, - "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + } }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "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" + "requires": { + "@babel/types": "^7.16.7" } }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" + "requires": { + "@babel/types": "^7.16.7" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "@babel/helper-module-transforms": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" } }, - "node_modules/typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", + "@babel/helper-simple-access": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" + "requires": { + "@babel/types": "^7.17.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dev": true, - "dependencies": { - "punycode": "^2.1.0" + "requires": { + "@babel/types": "^7.16.7" } }, - "node_modules/uri-template-lite": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/uri-template-lite/-/uri-template-lite-22.1.0.tgz", - "integrity": "sha512-KJvWlYkFgeHxFt2Y0c6E/MM6X1mgw1PZ/PfhLKI/S/dPqnr6RXZ6AFE7uEE3T5RxZ8+8uHwONsmBZ/CUPfNaRg==" + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true + }, + "@babel/helpers": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.7.tgz", + "integrity": "sha512-TKsj9NkjJfTBxM7Phfy7kv6yYc4ZcOo+AaWGqQOKTPDOmcGkIFb5xNA746eKisQkm4yavUYh4InYM9S+VnO01w==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + } + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "@babel/parser": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.7.tgz", + "integrity": "sha512-bm3AQf45vR4gKggRfvJdYJ0gFLoCbsPxiFLSH6hTVYABptNHY6l9NrhnucVjQ/X+SPtLANT9lc0fFhikj+VBRA==", "dev": true }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" }, - "engines": { - "node": ">= 8" + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - }, - "dependencies": { "@eslint/eslintrc": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", @@ -1673,10 +6322,38 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@microsoft/kiota-abstractions": { - "version": "1.0.30", - "resolved": "https://npm.pkg.github.com/download/@microsoft/kiota-abstractions/1.0.30/4c12c9fd49bb612df77e3f769c9d3f69f8d888335939c199d87c9df2219126e8", - "integrity": "sha512-DXWe4ELyj8ZtU3ZfuR7DxXXuzW69cjLaie8aie4VM5/pRYtXCZNGu63/3ecBBGjFsnWo9P9qY1ZynsBtvwBtkw==", + "version": "1.0.31", + "resolved": "https://npm.pkg.github.com/download/@microsoft/kiota-abstractions/1.0.31/6aef85a104537da5cb69afc2946a63368872399a4cfc21c15e219aa3521a5909", + "integrity": "sha512-2OtzhuEkkxSNurlwL3CyjqsTskSWKvJKhkQDC/RJ7QwJnVUSMOh2lSFiubvsF7jmqN+u0e67p7wi4y7cdUY6wA==", "requires": { "tinyduration": "^3.2.2", "tslib": "^2.3.1", @@ -1710,18 +6387,167 @@ "fastq": "^1.6.0" } }, + "@rollup/plugin-commonjs": { + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.2.tgz", + "integrity": "sha512-d/OmjaLVO4j/aQX69bwpWPpbvI3TJkQuxoAk7BH8ew1PyoMBLTOuvJTjzG8oEoW7drIIqB0KCJtfFLu/2GClWg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.3.tgz", + "integrity": "sha512-BdxNk+LtmElRo5d06MGY4zoepyrXX1tkzX2hrnPEZ53k78GuOMWLqmJDGIIOPwVRIFZrLQOo+Yr6KtCuLIA0AQ==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + } + } + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/samsam": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", + "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "dev": true + }, + "@types/chai": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz", + "integrity": "sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==", + "dev": true + }, + "@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, "@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, + "@types/mocha": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.0.tgz", + "integrity": "sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==", + "dev": true + }, "@types/node": { "version": "17.0.21", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", "dev": true }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/sinon": { + "version": "10.0.11", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.11.tgz", + "integrity": "sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g==", + "dev": true, + "requires": { + "@types/sinonjs__fake-timers": "*" + } + }, + "@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, "@typescript-eslint/eslint-plugin": { "version": "5.14.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", @@ -1817,6 +6643,22 @@ "eslint-visitor-keys": "^3.0.0" } }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, "acorn": { "version": "8.7.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", @@ -1830,6 +6672,12 @@ "dev": true, "requires": {} }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1842,6 +6690,12 @@ "uri-js": "^4.2.2" } }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1857,6 +6711,16 @@ "color-convert": "^2.0.1" } }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1869,12 +6733,121 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "requires": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "dev": true + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1891,7 +6864,172 @@ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "requires": { + "resolve": "^1.17.0" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", + "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001313", + "electron-to-chromium": "^1.4.76", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" } }, "callsites": { @@ -1900,6 +7038,33 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001317", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001317.tgz", + "integrity": "sha512-xIZLh8gBm4dqNX0gkzrBeyI86J2eCjWzYAs40q88smG844YIrN4tVQl/RhquHvKEKImWWFIVh1Lxe5n1G/N+GQ==", + "dev": true + }, + "chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1910,6 +7075,74 @@ "supports-color": "^7.1.0" } }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1925,16 +7158,178 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, "cross-fetch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dev": true, "requires": { "node-fetch": "2.6.7" } @@ -1950,6 +7345,37 @@ "which": "^2.0.1" } }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "date-format": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.5.tgz", + "integrity": "sha512-zBhRiN/M0gDxUoM2xRtzTjJzSg0XEi1ofYpF84PfXeS3hN2PsGxmc7jw3DNQtFlimRbMmob5FC3G0cJq6jQQpw==", + "dev": true + }, "debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -1959,12 +7385,98 @@ "ms": "2.1.2" } }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1983,6 +7495,161 @@ "esutils": "^2.0.2" } }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "domain-browser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.84", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.84.tgz", + "integrity": "sha512-b+DdcyOiZtLXHdgEG8lncYJdxbdJWJvclPNMg0eLUDcSOSO876WA/pYjdSblUTd7eJdIs4YdIxHWGazx7UPSJw==", + "dev": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "engine.io": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", + "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", + "dev": true, + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + } + }, + "engine.io-parser": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "dev": true, + "requires": { + "@socket.io/base64-arraybuffer": "~1.0.2" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2115,6 +7782,12 @@ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true + }, "espree": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", @@ -2166,12 +7839,46 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2236,6 +7943,54 @@ "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -2252,18 +8007,93 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, + "follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "fs-extra": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -2310,12 +8140,151 @@ "slash": "^3.0.0" } }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -2354,12 +8323,123 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dev": true, + "requires": { + "source-map": "~0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2369,18 +8449,216 @@ "is-extglob": "^2.1.1" } }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", + "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2390,17 +8668,191 @@ "argparse": "^2.0.1" } }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "karma": { + "version": "6.3.17", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.17.tgz", + "integrity": "sha512-2TfjHwrRExC8yHoWlPBULyaLwAFmXmxQrcuFImt/JsAsSZu1uOWTZ1ZsWjqQtWpHLiatJOHL5jFjXSJIgCd01g==", + "dev": true, + "requires": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.2.0", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + } + }, + "karma-chai": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/karma-chai/-/karma-chai-0.1.0.tgz", + "integrity": "sha1-vuWtQEAFF4Ea40u5RfdikJEIt5o=", + "dev": true, + "requires": {} + }, + "karma-chrome-launcher": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", + "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", + "dev": true, + "requires": { + "which": "^1.2.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "karma-firefox-launcher": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.2.tgz", + "integrity": "sha512-VV9xDQU1QIboTrjtGVD4NCfzIH7n01ZXqy/qpBhnOeGVOkG5JYPEm8kuSd7psHE6WouZaQ9Ool92g8LFweSNMA==", + "dev": true, + "requires": { + "is-wsl": "^2.2.0", + "which": "^2.0.1" + } + }, + "karma-mocha": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", + "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", + "dev": true, + "requires": { + "minimist": "^1.2.3" + } + }, + "karma-typescript": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-5.5.3.tgz", + "integrity": "sha512-l1FHurolXEBIzRa9ExpNtjzysAhsi/vLpTazpwLHWWK86mknvVpqor6pRZ5Nid7jvOPrTBqAq0JRuLgiCdRkFw==", + "dev": true, + "requires": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2", + "assert": "^2.0.0", + "async": "^3.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.4.3", + "combine-source-map": "^0.8.0", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "convert-source-map": "^1.7.0", + "crypto-browserify": "^3.12.0", + "diff": "^4.0.1", + "domain-browser": "^4.16.0", + "events": "^3.2.0", + "glob": "^7.1.6", + "https-browserify": "^1.0.0", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.19", + "log4js": "^6.3.0", + "minimatch": "^3.0.4", + "os-browserify": "^0.3.0", + "pad": "^3.2.0", + "path-browserify": "^1.0.0", + "process": "^0.11.10", + "punycode": "^2.1.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.1.1", + "source-map": "^0.7.3", + "stream-browserify": "^3.0.0", + "stream-http": "^3.1.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.11", + "tmp": "^0.2.1", + "tty-browserify": "^0.0.1", + "url": "^0.11.0", + "util": "^0.12.1", + "vm-browserify": "^1.1.2" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } }, "levn": { "version": "0.4.1", @@ -2412,12 +8864,70 @@ "type-check": "~0.4.0" } }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "log4js": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.2.tgz", + "integrity": "sha512-k80cggS2sZQLBwllpT1p06GtfvzMmSdUCkW96f0Hj83rKGJDAu2vZjt9B9ag2vx8Zz1IXzxoLgqvRJCdMKybGg==", + "dev": true, + "requires": { + "date-format": "^4.0.4", + "debug": "^4.3.3", + "flatted": "^3.2.5", + "rfdc": "^1.3.0", + "streamroller": "^3.0.4" + } + }, + "loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2427,6 +8937,55 @@ "yallist": "^4.0.0" } }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2443,6 +9002,57 @@ "picomatch": "^2.2.3" } }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -2452,18 +9062,179 @@ "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "nise": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", + "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, "node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -2472,6 +9243,67 @@ "whatwg-url": "^5.0.0" } }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2495,6 +9327,45 @@ "word-wrap": "^1.2.3" } }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "pad": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pad/-/pad-3.2.0.tgz", + "integrity": "sha512-2u0TrjcGbOjBTJpyewEl4hBO3OeX5wWue7eIFPzQTg6wFSvoaHcBTTUY5m+n0hd04gmTCPuY0kCpVIVuw5etwg==", + "dev": true, + "requires": { + "wcwidth": "^1.0.1" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -2504,6 +9375,37 @@ "callsites": "^3.0.0" } }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -2516,12 +9418,52 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -2549,24 +9491,156 @@ "fast-diff": "^1.1.2" } }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2579,6 +9653,12 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -2588,6 +9668,48 @@ "glob": "^7.1.3" } }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rollup": { + "version": "2.70.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", + "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "dependencies": { + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + } + } + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -2597,6 +9719,18 @@ "queue-microtask": "^1.2.2" } }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -2606,6 +9740,37 @@ "lru-cache": "^6.0.0" } }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2621,12 +9786,201 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sinon": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", + "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + }, + "dependencies": { + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + } + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "socket.io": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", + "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" + } + }, + "socket.io-adapter": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "dev": true + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dev": true, + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "requires": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "streamroller": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.5.tgz", + "integrity": "sha512-5uzTEUIi4OB5zy/H30kbUN/zpDNJsFUA+Z47ZL8EfrP93lcZvRLEqdbhdunEPa7CouuAzXXsHpCJ9dg90Umw7g==", + "dev": true, + "requires": { + "date-format": "^4.0.5", + "debug": "^4.3.3", + "fs-extra": "^10.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -2651,17 +10005,67 @@ "has-flag": "^4.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "terser": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "dev": true, + "requires": { + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, "tinyduration": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/tinyduration/-/tinyduration-3.2.2.tgz", "integrity": "sha512-eH6D0KIA4Xxje3ZRUnbsWfN28pAgTx3ZFQvgb0w9u8p9lxSX0eloxi4w165gv03GnvduR9m5JhToPxXvADHe+w==" }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2671,6 +10075,12 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -2698,6 +10108,12 @@ } } }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -2707,18 +10123,64 @@ "prelude-ls": "^1.2.1" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typescript": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", "dev": true }, + "ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -2733,6 +10195,50 @@ "resolved": "https://registry.npmjs.org/uri-template-lite/-/uri-template-lite-22.1.0.tgz", "integrity": "sha512-KJvWlYkFgeHxFt2Y0c6E/MM6X1mgw1PZ/PfhLKI/S/dPqnr6RXZ6AFE7uEE3T5RxZ8+8uHwONsmBZ/CUPfNaRg==" }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -2744,6 +10250,33 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -2767,23 +10300,172 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", + "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.7" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true, + "requires": {} + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index 3329cafd7e..44696c1219 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -44,22 +44,22 @@ "test:es": " npm run build:es && mocha 'dist/es/test/common/**/*.js' --require esm && mocha 'dist/es/test/node/**/*.js' --require esm" }, "dependencies": { - "@microsoft/kiota-abstractions": "file:microsoft-kiota-abstractions-1.0.21.tgz", + "@microsoft/kiota-abstractions": "1.0.31", "node-fetch": "^2.6.5", "tslib": "2.3.1" }, "devDependencies": { + "@microsoft/kiota-abstractions": "^1.0.30", "@rollup/plugin-commonjs": "^21.0.0", "@rollup/plugin-node-resolve": "^13.0.5", "@types/chai": "^4.2.22", + "@types/mocha": "^9.0.0", "@types/node": "^17.0.13", "@types/sinon": "^10.0.4", - "chai": "^4.3.4", - "@microsoft/kiota-abstractions": "^1.0.30", - "cross-fetch": "^3.1.5", - "typescript": "^4.6.2", "@typescript-eslint/eslint-plugin": "^5.14.0", "@typescript-eslint/parser": "^5.14.0", + "chai": "^4.3.4", + "cross-fetch": "^3.1.5", "eslint": "^8.11.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.0.0", @@ -72,13 +72,14 @@ "karma-mocha": "^2.0.1", "karma-typescript": "^5.5.2", "mocha": "^8.4.0", - "prettier": "^1.19.1", + "prettier": "^2.5.1", "rollup": "^2.58.0", "rollup-plugin-terser": "^7.0.2", "sinon": "^11.1.2", - "tslib": "^2.3.1" + "tslib": "^2.3.1", + "typescript": "^4.6.2" }, "publishConfig": { "registry": "https://npm.pkg.github.com" } -} \ No newline at end of file +} diff --git a/http/typescript/fetch/src/browser/index.ts b/http/typescript/fetch/src/browser/index.ts index 1c97e19eee..5afc4061b5 100644 --- a/http/typescript/fetch/src/browser/index.ts +++ b/http/typescript/fetch/src/browser/index.ts @@ -11,10 +11,11 @@ export * from "../fetchRequestAdapter"; export * from "../httpClient"; export * from "../middlewares/middleware"; -export * from "../middlewares/browser/defaultFetchHandler"; export * from "../middlewares/customFetchHandler"; export * from "../middlewares/retryHandler"; export * from "../middlewares/options/retryHandlerOptions"; -export * from "../middlewares/middlewareContext"; export * from "../middlewares/browser/middlewareFactory"; + +export * from "../middlewares/telemetryHandler"; + export * from "../utils/headersUtil"; diff --git a/http/typescript/fetch/src/fetchRequestAdapter.ts b/http/typescript/fetch/src/fetchRequestAdapter.ts index e9fedce1f6..f7f0962547 100644 --- a/http/typescript/fetch/src/fetchRequestAdapter.ts +++ b/http/typescript/fetch/src/fetchRequestAdapter.ts @@ -172,7 +172,7 @@ export class FetchRequestAdapter implements RequestAdapter { await this.authenticationProvider.authenticateRequest(requestInfo); const request = this.getRequestFromRequestInformation(requestInfo); - return await this.httpClient.executeFetch(requestInfo.URL, request); + return await this.httpClient.executeFetch(requestInfo.URL, request, requestInfo.getRequestOptions()); }; private setBaseUrlForRequestInformation = (requestInfo: RequestInformation): void => { requestInfo.pathParameters["baseurl"] = this.baseUrl; diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index 6b552450dc..47c6bb4ec4 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -1,8 +1,8 @@ +import { type RequestOption } from "@microsoft/kiota-abstractions"; + import { CustomFetchHandler } from "./middlewares/customFetchHandler"; -import { DefaultFetchHandler } from "./middlewares/defaultFetchHandler"; import { Middleware } from "./middlewares/middleware"; import { MiddlewareFactory } from "./middlewares/middlewareFactory"; -import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "./utils/fetchDefinitions"; export class HttpClient { private middleware: Middleware; @@ -14,29 +14,22 @@ export class HttpClient { * If middlewares param is undefined, the httpClient instance will use the default array of middlewares. * Set middlewares to `null` if you do not wish to use middlewares. * If custom fetch is undefined, the httpClient instance uses the `DefaultFetchHandler` - * @param {(request: FetchRequestInfo, init?: FetchRequestInit) => Promise < FetchResponse >} custom fetch function - a Fetch API implementation + * @param {(request: string, init?: RequestInit) => Promise < Response >} custom fetch function - a Fetch API implementation * */ - public constructor(private customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise, ...middlewares: Middleware[]) { + public constructor(private customFetch?: (request: string, init?: RequestInit) => Promise, ...middlewares: Middleware[]) { // Use default middleware chain if middlewares and custom fetch function are undefined - if (!middlewares.length) { + if (!middlewares.length || middlewares[0] === null) { if (this.customFetch) { this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain(customFetch)); } else { this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain()); } } else { - if (middlewares[0] === null) { - if (!customFetch) { - this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain()); - } - return; + if (this.customFetch) { + this.setMiddleware(...middlewares, new CustomFetchHandler(customFetch)); } else { - if (this.customFetch) { - this.setMiddleware(...middlewares, new CustomFetchHandler(customFetch)); - } else { - this.setMiddleware(...middlewares); - } + this.setMiddleware(...middlewares); } } } @@ -79,7 +72,7 @@ export class HttpClient { * @param options request options. * @returns the promise resolving the response. */ - public async executeFetch(url: string, requestInit?: FetchRequestInit, requestOptions?: RequestOption[]): Promise { + public async executeFetch(url: string, requestInit?: RequestInit, requestOptions?: Record): Promise { if (this.customFetch && !this.middleware) { return this.customFetch(url, requestInit); } diff --git a/http/typescript/fetch/src/index.ts b/http/typescript/fetch/src/index.ts index a280b89f6b..ad24d4d562 100644 --- a/http/typescript/fetch/src/index.ts +++ b/http/typescript/fetch/src/index.ts @@ -10,13 +10,14 @@ export * from "./fetchRequestAdapter"; export * from "./httpClient"; export * from "./middlewares/middleware"; -export * from "./middlewares/defaultFetchHandler"; export * from "./middlewares/customFetchHandler"; export * from "./middlewares/redirectHandler"; export * from "./middlewares/retryHandler"; export * from "./middlewares/options/redirectHandlerOptions"; export * from "./middlewares/options/retryHandlerOptions"; -export * from "./middlewares/middlewareContext"; +export * from "./middlewares/options/telemetryHandlerOptions"; +export * from "./middlewares/telemetryHandler"; + export * from "./middlewares/middlewareFactory"; export * from "./utils/headersUtil"; export * from "./utils/fetchDefinitions"; diff --git a/http/typescript/fetch/src/middleware.ts b/http/typescript/fetch/src/middleware.ts deleted file mode 100644 index aa298104e1..0000000000 --- a/http/typescript/fetch/src/middleware.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { RequestOption } from "@microsoft/kiota-abstractions"; - -/** Defines the contract for a middleware in the request execution pipeline. */ -export interface Middleware { - /** Next middleware to be executed. The current middleware must execute it in its implementation. */ - next: Middleware | undefined; - /** - * Main method of the middleware. - * @param req The request object. - * @param url The URL of the request. - * @return A promise that resolves to the response object. - */ - execute(url: string, req: RequestInit, requestOptions?: RequestOption[]): Promise; -} diff --git a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts index 86ccb17dad..ce82c94c4d 100644 --- a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts @@ -9,12 +9,10 @@ * @module MiddlewareFactory */ -import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../../utils/fetchDefinitions"; import { CustomFetchHandler } from "../customFetchHandler"; import { Middleware } from "../middleware"; import { RetryHandlerOptions } from "../options/retryHandlerOptions"; import { RetryHandler } from "../retryHandler"; -import { DefaultFetchHandler } from "./defaultFetchHandler"; /** * @class @@ -28,7 +26,7 @@ export class MiddlewareFactory { * @param {AuthenticationProvider} authProvider - The authentication provider instance * @returns an array of the middleware handlers of the default middleware chain */ - public static getDefaultMiddlewareChain(customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise): Middleware[] { + public static getDefaultMiddlewareChain(customFetch?: (request: string, init?: RequestInit) => Promise): Middleware[] { // Browsers handles redirection automatically and do not require the redirectionHandler const middlewareArray: Middleware[] = []; @@ -37,7 +35,7 @@ export class MiddlewareFactory { if (customFetch) { middlewareArray.push(new CustomFetchHandler(customFetch)); } else { - middlewareArray.push(new CustomFetchHandler(fetch as any)); + middlewareArray.push(new CustomFetchHandler(fetch)); } return middlewareArray; } diff --git a/http/typescript/fetch/src/middlewares/customFetchHandler.ts b/http/typescript/fetch/src/middlewares/customFetchHandler.ts index d681e3e9d3..93cd7c6d96 100644 --- a/http/typescript/fetch/src/middlewares/customFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/customFetchHandler.ts @@ -9,7 +9,6 @@ * @module FetchHandler */ -import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; import { Middleware } from "./middleware"; /** @@ -25,7 +24,7 @@ export class CustomFetchHandler implements Middleware { */ next: Middleware; - constructor(private customFetch?: (input: FetchRequestInfo, init: FetchRequestInit) => Promise) {} + constructor(private customFetch?: (input: string, init: RequestInit) => Promise) {} /** * @public @@ -34,7 +33,7 @@ export class CustomFetchHandler implements Middleware { * @param {Context} context - The request context object * @returns A promise that resolves to nothing */ - public async execute(url: string, requestInit: FetchRequestInit): Promise { + public async execute(url: string, requestInit: RequestInit): Promise { return await this.customFetch(url, requestInit); } } diff --git a/http/typescript/fetch/src/middlewares/middleware.ts b/http/typescript/fetch/src/middlewares/middleware.ts index 7b8bf1eeda..d443e7b13e 100644 --- a/http/typescript/fetch/src/middlewares/middleware.ts +++ b/http/typescript/fetch/src/middlewares/middleware.ts @@ -4,8 +4,7 @@ * See License in the project root for license information. * ------------------------------------------------------------------------------------------- */ -import {RequestOption} from "@microsoft/kiota-abstractions" -import { FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; +import {RequestOption} from "@microsoft/kiota-abstractions"; // use import types /** Defines the contract for a middleware in the request execution pipeline. */ export interface Middleware { @@ -18,5 +17,5 @@ export interface Middleware { * @param url The URL of the request. * @return A promise that resolves to the response object. */ - execute(url: string, requestInit: FetchRequestInit, requestOptions?: Record): Promise; + execute(url: string, requestInit: RequestInit, requestOptions?: Record): Promise; } diff --git a/http/typescript/fetch/src/middlewares/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/middlewareFactory.ts index ed83f4e0c8..25ab61d53a 100644 --- a/http/typescript/fetch/src/middlewares/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/middlewareFactory.ts @@ -8,9 +8,8 @@ /** * @module MiddlewareFactory */ +import fetch from "node-fetch"; - import fetch from "node-fetch"; -import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; import { CustomFetchHandler } from "./customFetchHandler"; import { Middleware } from "./middleware"; import { RedirectHandlerOptions } from "./options/redirectHandlerOptions"; @@ -30,7 +29,7 @@ export class MiddlewareFactory { * @param {AuthenticationProvider} authProvider - The authentication provider instance * @returns an array of the middleware handlers of the default middleware chain */ - public static getDefaultMiddlewareChain(customFetch?: (request: FetchRequestInfo, init?: FetchRequestInit) => Promise): Middleware[] { + public static getDefaultMiddlewareChain(customFetch?: (request: string, init?: RequestInit) => Promise): Middleware[] { const middlewareArray: Middleware[] = []; const retryHandler = new RetryHandler(new RetryHandlerOptions()); middlewareArray.push(retryHandler); diff --git a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts index c30a8ec636..f84803395f 100644 --- a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts +++ b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts @@ -11,13 +11,13 @@ import { RequestOption } from "@microsoft/kiota-abstractions"; -import { FetchRequestInit, FetchResponse } from "../../utils/fetchDefinitions"; +import { FetchResponse } from "../../utils/fetchDefinitions"; /** * @type * A type declaration for shouldRetry callback */ -export type ShouldRetry = (delay: number, attempt: number, request: string, options: FetchRequestInit | undefined, response: FetchResponse) => boolean; +export type ShouldRetry = (delay: number, attempt: number, request: string, options: RequestInit | undefined, response: FetchResponse) => boolean; export const RetryHandlerOptionKey = "RetryHandlerOptionKey"; diff --git a/http/typescript/fetch/src/middlewares/options/telemetryHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/telemetryHandlerOptions.ts new file mode 100644 index 0000000000..f823784e06 --- /dev/null +++ b/http/typescript/fetch/src/middlewares/options/telemetryHandlerOptions.ts @@ -0,0 +1,6 @@ +import { RequestOption } from "@microsoft/kiota-abstractions"; + +export interface TelemetryHandlerOptions extends RequestOption { + telemetryConfigurator: (url: string, requestInit: RequestInit, requestOptions?: Record, telemetryInfomation?: unknown) => void; + telemetryInfomation: unknown; +} diff --git a/http/typescript/fetch/src/middlewares/redirectHandler.ts b/http/typescript/fetch/src/middlewares/redirectHandler.ts index d54c5e00cd..1fa6ad2633 100644 --- a/http/typescript/fetch/src/middlewares/redirectHandler.ts +++ b/http/typescript/fetch/src/middlewares/redirectHandler.ts @@ -9,11 +9,10 @@ * @module RedirectHandler */ -import { HttpMethod } from "@microsoft/kiota-abstractions"; +import { type RequestOption, HttpMethod } from "@microsoft/kiota-abstractions"; import { FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; import { Middleware } from "./middleware"; -import { MiddlewareContext } from "./middlewareContext"; import { RedirectHandlerOptionKey, RedirectHandlerOptions } from "./options/redirectHandlerOptions"; /** @@ -139,17 +138,6 @@ export class RedirectHandler implements Middleware { return typeof requestAuthority !== "undefined" && typeof redirectAuthority !== "undefined" && requestAuthority !== redirectAuthority; } - /** - * @private - * @async - * To update a request url with the redirect url - * @param {string} redirectUrl - The redirect url value - * @param {Context} context - The context object value - * @returns Nothing - */ - private updateRequestUrl(redirectUrl: string, context: MiddlewareContext) { - context.requestUrl = redirectUrl; - } /** * @private @@ -161,7 +149,7 @@ export class RedirectHandler implements Middleware { * @returns A promise that resolves to nothing */ private async executeWithRedirect(url: string, fetchRequestInit: FetchRequestInit, redirectCount: number, requestOptions?: Record): Promise { - const response = await this.next.execute(url, fetchRequestInit, requestOptions); + const response = await this.next.execute(url, fetchRequestInit as RequestInit, requestOptions); if (redirectCount < this.options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && this.options.shouldRedirect(response)) { ++redirectCount; if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { @@ -187,13 +175,13 @@ export class RedirectHandler implements Middleware { * @param {Context} context - The context object of the request * @returns A Promise that resolves to nothing */ - public execute(url: string, requestInit: FetchRequestInit, requestOptions?: Record): Promise { + public execute(url: string, requestInit: RequestInit, requestOptions?: Record): Promise { const redirectCount = 0; - if (requestOptions && requestOptions[RedirectHandlerOptionKey])) + if (requestOptions && requestOptions[RedirectHandlerOptionKey]) { this.options = requestOptions[RedirectHandlerOptionKey] as RedirectHandlerOptions; } - requestInit.redirect = RedirectHandler.MANUAL_REDIRECT; - return this.executeWithRedirect(url, requestInit, redirectCount, requestOptions); + (requestInit as FetchRequestInit).redirect = RedirectHandler.MANUAL_REDIRECT; + return this.executeWithRedirect(url, requestInit as FetchRequestInit, redirectCount, requestOptions); } } diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts index cd559208b1..44123bb389 100644 --- a/http/typescript/fetch/src/middlewares/retryHandler.ts +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -9,12 +9,11 @@ * @module RetryHandler */ -import { HttpMethod } from "@microsoft/kiota-abstractions"; +import { HttpMethod, RequestOption } from "@microsoft/kiota-abstractions"; -import { FetchRequestInfo, FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; +import { FetchRequestInit, FetchResponse } from "../utils/fetchDefinitions"; import { getRequestHeader, setRequestHeader } from "../utils/headersUtil"; import { Middleware } from "./middleware"; -import { MiddlewareContext } from "./middlewareContext"; import { RetryHandlerOptionKey, RetryHandlerOptions } from "./options/retryHandlerOptions"; /** @@ -77,15 +76,14 @@ export class RetryHandler implements Middleware { /** * @private * To check whether the payload is buffered or not - * @param {RequestInfo} request - The url string or the request object value * @param {RequestInit} options - The options of a request * @returns Whether the payload is buffered or not */ - private isBuffered(request: FetchRequestInfo, options: FetchRequestInit | undefined): boolean { + private isBuffered(options: FetchRequestInit | undefined): boolean { const method = options.method; const isPutPatchOrPost: boolean = method === HttpMethod.PUT || method === HttpMethod.PATCH || method === HttpMethod.POST; if (isPutPatchOrPost) { - const isStream = getRequestHeader(options, "content-type") === "application/octet-stream"; + const isStream = getRequestHeader(options as RequestInit, "content-type") === "application/octet-stream"; if (isStream) { return false; } @@ -151,14 +149,14 @@ export class RetryHandler implements Middleware { * @param {RetryHandlerOptions} options - The retry middleware options instance * @returns A Promise that resolves to nothing */ - private async executeWithRetry(url: string, requestInit: FetchRequestInit, retryAttempts:number, requestOptions?: Record): Promise { - const response = await this.next.execute(url, requestInit, requestOptions); - if (retryAttempts < this.options.maxRetries && this.isRetry(response) && this.isBuffered(url, requestInit) && this.options.shouldRetry(this.options.delay, retryAttempts, url, requestInit as FetchRequestInit, response)) { + private async executeWithRetry(url: string, fetchRequestInit: FetchRequestInit, retryAttempts:number, requestOptions?: Record): Promise { + const response = await this.next.execute(url, fetchRequestInit as RequestInit, requestOptions); + if (retryAttempts < this.options.maxRetries && this.isRetry(response) && this.isBuffered(fetchRequestInit) && this.options.shouldRetry(this.options.delay, retryAttempts, url, fetchRequestInit as RequestInit, response)) { ++retryAttempts; - setRequestHeader(requestInit, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); + setRequestHeader(fetchRequestInit as RequestInit, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); const delay = this.getDelay(response, retryAttempts, this.options.delay); await this.sleep(delay); - return await this.executeWithRetry(url, requestInit, retryAttempts, requestOptions); + return await this.executeWithRetry(url, fetchRequestInit, retryAttempts, requestOptions); } else { return response; } @@ -171,12 +169,12 @@ export class RetryHandler implements Middleware { * @param {Context} context - The context object of the request * @returns A Promise that resolves to nothing */ - public execute(url: string, requestInit: FetchRequestInit, requestOptions?: Record): Promise { + public execute(url: string, requestInit: RequestInit, requestOptions?: Record): Promise { const retryAttempts = 0; if((requestOptions && requestOptions[RetryHandlerOptionKey])){ this.options = requestOptions[RetryHandlerOptionKey] as RetryHandlerOptions; } - return this.executeWithRetry(url, requestInit, retryAttempts, requestOptions); + return this.executeWithRetry(url, requestInit as FetchRequestInit, retryAttempts, requestOptions); } } diff --git a/http/typescript/fetch/src/middlewares/telemetryHandler.ts b/http/typescript/fetch/src/middlewares/telemetryHandler.ts new file mode 100644 index 0000000000..b37cd6292d --- /dev/null +++ b/http/typescript/fetch/src/middlewares/telemetryHandler.ts @@ -0,0 +1,20 @@ +import { RequestOption } from "@microsoft/kiota-abstractions"; +import { TelemetryHandlerOptions } from "./options/telemetryHandlerOptions"; +import { Middleware } from "./middleware"; + +export const TelemetryHandlerOptionsKey = "TelemetryHandlerOptionsKey"; +export class TelemetryHandler implements Middleware { + constructor(private telemetryHandlerOptions: TelemetryHandlerOptions) { }; + next: Middleware; + execute(url: string, requestInit: RequestInit, requestOptions?: Record): Promise { + + if (this.telemetryHandlerOptions && this.telemetryHandlerOptions.telemetryConfigurator) { + console.log("tell tell"); + this.telemetryHandlerOptions.telemetryConfigurator(url, requestInit, requestOptions, this.telemetryHandlerOptions.telemetryInfomation); + } + else if (requestOptions[TelemetryHandlerOptionsKey]){ + (requestOptions[TelemetryHandlerOptionsKey] as TelemetryHandlerOptions).telemetryConfigurator(url, requestInit, requestOptions); + } + return this.next.execute(url, requestInit, requestOptions); + } +}; \ No newline at end of file diff --git a/http/typescript/fetch/src/utils/fetchDefinitions.ts b/http/typescript/fetch/src/utils/fetchDefinitions.ts index 8799dd4f2d..a55f061a33 100644 --- a/http/typescript/fetch/src/utils/fetchDefinitions.ts +++ b/http/typescript/fetch/src/utils/fetchDefinitions.ts @@ -15,16 +15,6 @@ export type FetchRequestInfo = string; */ export type FetchHeadersInit = Record; -interface FetchBody { - readonly body: ReadableStream | null; - readonly bodyUsed: boolean; - arrayBuffer(): Promise; - blob(): Promise; - formData(): Promise; - json(): Promise; - text(): Promise; -} - export type FetchHeaders = Headers & { append?(name: string, value: string): void; delete?(name: string): void; @@ -50,83 +40,27 @@ export type FetchHeaders = Headers & { raw?(): Record; }; -export type FetchResponse = Response & - FetchBody & { - readonly headers: FetchHeaders; - readonly ok: boolean; - readonly redirected: boolean; - readonly status: number; - readonly statusText: string; - readonly type: unknown; - readonly url: string; - clone(): Response; - }; +export type FetchResponse = Omit & { + headers: FetchHeaders; +}; -export type FetchRequestInit = Omit & { +export type FetchRequestInit = Omit & { /** * Request's body * Expected type in case of dom - ReadableStream | XMLHttpRequestBodyInit|null * Expected type in case of node-fetch - | Blob | Buffer | URLSearchParams | NodeJS.ReadableStream | string|null */ body?: unknown; - /** - * A string indicating how the request will interact with the browser's cache to set request's cache. - */ - cache?: unknown; - /** - * A string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. Sets request's credentials. - */ - credentials?: unknown; /** * A Headers object, an object literal, or an array of two-item arrays to set request's headers. */ headers?: FetchHeadersInit; - /** - * A cryptographic hash of the resource to be fetched by request. Sets request's integrity. - */ - integrity?: string; - /** - * A boolean to set request's keepalive. - */ - keepalive?: boolean; /** * A string to set request's method. */ method?: string; - /** - * A string to indicate whether the request will use CORS, or will be restricted to same-origin URLs. Sets request's mode. - */ - mode?: unknown; /** * A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect. */ redirect?: unknown; - /** - * A string whose value is a same-origin URL, "about:client", or the empty string, to set request's referrer. - */ - referrer?: string; - /** - * A referrer policy to set request's referrerPolicy. - */ - referrerPolicy?: unknown; - /** - * An AbortSignal to set request's signal. - */ - signal?: unknown; - /** - * Can only be null. Used to disassociate request from any Window. - */ - window?: any; - - //Node-Fetch - agent?: unknown; - compress?: boolean; - counter?: number; - follow?: number; - hostname?: string; - port?: number; - protocol?: string; - size?: number; - highWaterMark?: number; - insecureHTTPParser?: boolean; }; diff --git a/http/typescript/fetch/src/utils/headersUtil.ts b/http/typescript/fetch/src/utils/headersUtil.ts index 3a3dbadaa8..4b26a1436f 100644 --- a/http/typescript/fetch/src/utils/headersUtil.ts +++ b/http/typescript/fetch/src/utils/headersUtil.ts @@ -5,8 +5,6 @@ * ------------------------------------------------------------------------------------------- */ -import { FetchRequestInit } from "./fetchDefinitions"; - /** * @module MiddlewareUtil */ @@ -19,7 +17,7 @@ import { FetchRequestInit } from "./fetchDefinitions"; * @param {string} key - The header key string * @returns A header value for the given key from the request */ -export const getRequestHeader = (options: FetchRequestInit | undefined, key: string): string | null => { +export const getRequestHeader = (options: RequestInit | undefined, key: string): string | null => { if (typeof options !== "undefined" && options.headers !== undefined) { return options.headers[key]; } @@ -35,7 +33,7 @@ export const getRequestHeader = (options: FetchRequestInit | undefined, key: str * @param {string } value - The header value string * @returns Nothing */ -export const setRequestHeader = (options: FetchRequestInit | undefined, key: string, value: string): void => { +export const setRequestHeader = (options: RequestInit | undefined, key: string, value: string): void => { if (typeof options !== "undefined") { if (!options.headers) { options.headers = {}; @@ -53,7 +51,7 @@ export const setRequestHeader = (options: FetchRequestInit | undefined, key: str * @param {string } value - The header value string * @returns Nothing */ -export const appendRequestHeader = (options: FetchRequestInit | undefined, key: string, value: string): void => { +export const appendRequestHeader = (options: RequestInit | undefined, key: string, value: string): void => { if (typeof options !== "undefined") { if (!options.headers) { options.headers = {}; From 970f6f66bfd18cda44f8d7e80a0c11921ad50d35 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Thu, 17 Mar 2022 00:08:07 -0700 Subject: [PATCH 26/34] splitting test src tsconfigs, adding null checks --- abstractions/typescript/.eslintrc.json | 2 +- http/typescript/fetch/package-lock.json | 94 +++++ http/typescript/fetch/package.json | 6 +- http/typescript/fetch/src/httpClient.ts | 10 +- .../middlewares/browser/middlewareFactory.ts | 10 +- .../src/middlewares/customFetchHandler.ts | 4 +- .../src/middlewares/middlewareFactory.ts | 9 +- .../fetch/src/middlewares/redirectHandler.ts | 327 +++++++++--------- .../fetch/src/middlewares/retryHandler.ts | 31 +- .../fetch/src/middlewares/telemetryHandler.ts | 31 +- .../typescript/fetch/src/utils/headersUtil.ts | 8 +- http/typescript/fetch/tsconfig.cjs.json | 5 +- http/typescript/fetch/tsconfig.cjs.test.json | 16 + http/typescript/fetch/tsconfig.es.json | 5 +- http/typescript/fetch/tsconfig.es.test.json | 15 + 15 files changed, 354 insertions(+), 219 deletions(-) create mode 100644 http/typescript/fetch/tsconfig.cjs.test.json create mode 100644 http/typescript/fetch/tsconfig.es.test.json diff --git a/abstractions/typescript/.eslintrc.json b/abstractions/typescript/.eslintrc.json index e73e74ab49..f41e06fd5e 100644 --- a/abstractions/typescript/.eslintrc.json +++ b/abstractions/typescript/.eslintrc.json @@ -25,7 +25,7 @@ } ], "@typescript-eslint/no-var-requires": "error", - "@typescript-eslint/no-non-null-assertion": "error", + "@typescript-eslint/no-non-null-assertion": "off", "@typescript-eslint/naming-convention": [ "error", { diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index 87d0ea9f22..0557fd5d4b 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -20,6 +20,7 @@ "@types/chai": "^4.2.22", "@types/mocha": "^9.0.0", "@types/node": "^17.0.13", + "@types/node-fetch": "^2.6.1", "@types/sinon": "^10.0.4", "@typescript-eslint/eslint-plugin": "^5.14.0", "@typescript-eslint/parser": "^5.14.0", @@ -744,6 +745,16 @@ "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", "dev": true }, + "node_modules/@types/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -1123,6 +1134,12 @@ "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", "dev": true }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -1655,6 +1672,18 @@ "node": ">=0.10.0" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -1941,6 +1970,15 @@ "node": ">= 0.4" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -2684,6 +2722,20 @@ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", "dev": true }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fs-extra": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", @@ -6524,6 +6576,16 @@ "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", "dev": true }, + "@types/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", + "dev": true, + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -6777,6 +6839,12 @@ "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", "dev": true }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -7184,6 +7252,15 @@ } } }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -7430,6 +7507,12 @@ "object-keys": "^1.0.12" } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -8019,6 +8102,17 @@ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", "dev": true }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "fs-extra": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index 44696c1219..20478480a0 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -34,14 +34,15 @@ "build": "npm run build:cjs && npm run build:es", "build:cjs": "tsc -p tsconfig.cjs.json", "build:es": "tsc -p tsconfig.es.json", + "build:test": "tsc -b tsconfig.cjs.test.json && tsc -b tsconfig.es.test.json", "clean": "rm -r ./dist", "karma": "npm run rollup && karma start --single-run --browsers ChromeHeadless karma.conf.js", "lint": "eslint . --ext .ts", "lint:fix": "eslint . --ext .ts --fix", "rollup": "rollup -c", "test": "npm run test:cjs && npm run test:es && npm run karma", - "test:cjs": "npm run build:cjs && mocha 'dist/cjs/test/common/**/*.js' && mocha 'dist/cjs/test/node/**/*.js'", - "test:es": " npm run build:es && mocha 'dist/es/test/common/**/*.js' --require esm && mocha 'dist/es/test/node/**/*.js' --require esm" + "test:cjs": "tsc -b tsconfig.cjs.test.json && mocha 'dist/cjs/test/common/**/*.js' && mocha 'dist/cjs/test/node/**/*.js'", + "test:es": "tsc -b tsconfig.es.test.json && mocha 'dist/es/test/common/**/*.js' --require esm && mocha 'dist/es/test/node/**/*.js' --require esm" }, "dependencies": { "@microsoft/kiota-abstractions": "1.0.31", @@ -55,6 +56,7 @@ "@types/chai": "^4.2.22", "@types/mocha": "^9.0.0", "@types/node": "^17.0.13", + "@types/node-fetch": "^2.6.1", "@types/sinon": "^10.0.4", "@typescript-eslint/eslint-plugin": "^5.14.0", "@typescript-eslint/parser": "^5.14.0", diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index 47c6bb4ec4..8dfc460c52 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -5,7 +5,7 @@ import { Middleware } from "./middlewares/middleware"; import { MiddlewareFactory } from "./middlewares/middlewareFactory"; export class HttpClient { - private middleware: Middleware; + private middleware: Middleware | undefined; /** * @public * @constructor @@ -17,17 +17,17 @@ export class HttpClient { * @param {(request: string, init?: RequestInit) => Promise < Response >} custom fetch function - a Fetch API implementation * */ - public constructor(private customFetch?: (request: string, init?: RequestInit) => Promise, ...middlewares: Middleware[]) { + public constructor(private customFetch?: (request: string, init: RequestInit) => Promise, ...middlewares: Middleware[]) { // Use default middleware chain if middlewares and custom fetch function are undefined if (!middlewares.length || middlewares[0] === null) { - if (this.customFetch) { + if (this.customFetch !== undefined) { this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain(customFetch)); } else { this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain()); } } else { if (this.customFetch) { - this.setMiddleware(...middlewares, new CustomFetchHandler(customFetch)); + this.setMiddleware(...middlewares, new CustomFetchHandler(customFetch! as any)); } else { this.setMiddleware(...middlewares); } @@ -72,7 +72,7 @@ export class HttpClient { * @param options request options. * @returns the promise resolving the response. */ - public async executeFetch(url: string, requestInit?: RequestInit, requestOptions?: Record): Promise { + public async executeFetch(url: string, requestInit: RequestInit, requestOptions?: Record): Promise { if (this.customFetch && !this.middleware) { return this.customFetch(url, requestInit); } diff --git a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts index ce82c94c4d..1a9d86baab 100644 --- a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts @@ -26,17 +26,15 @@ export class MiddlewareFactory { * @param {AuthenticationProvider} authProvider - The authentication provider instance * @returns an array of the middleware handlers of the default middleware chain */ - public static getDefaultMiddlewareChain(customFetch?: (request: string, init?: RequestInit) => Promise): Middleware[] { + public static getDefaultMiddlewareChain(customFetch: (request: string, init: RequestInit) => Promise = fetch as any): Middleware[] { // Browsers handles redirection automatically and do not require the redirectionHandler const middlewareArray: Middleware[] = []; const retryHandler = new RetryHandler(new RetryHandlerOptions()); middlewareArray.push(retryHandler); - if (customFetch) { - middlewareArray.push(new CustomFetchHandler(customFetch)); - } else { - middlewareArray.push(new CustomFetchHandler(fetch)); - } + + middlewareArray.push(new CustomFetchHandler(customFetch)); + return middlewareArray; } } diff --git a/http/typescript/fetch/src/middlewares/customFetchHandler.ts b/http/typescript/fetch/src/middlewares/customFetchHandler.ts index 93cd7c6d96..4141d704e9 100644 --- a/http/typescript/fetch/src/middlewares/customFetchHandler.ts +++ b/http/typescript/fetch/src/middlewares/customFetchHandler.ts @@ -22,9 +22,9 @@ export class CustomFetchHandler implements Middleware { * @private * The next middleware in the middleware chain */ - next: Middleware; + next: Middleware | undefined; - constructor(private customFetch?: (input: string, init: RequestInit) => Promise) {} + constructor(private customFetch: (input: string, init: RequestInit) => Promise) {} /** * @public diff --git a/http/typescript/fetch/src/middlewares/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/middlewareFactory.ts index 25ab61d53a..5ba6f653b9 100644 --- a/http/typescript/fetch/src/middlewares/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/middlewareFactory.ts @@ -29,18 +29,15 @@ export class MiddlewareFactory { * @param {AuthenticationProvider} authProvider - The authentication provider instance * @returns an array of the middleware handlers of the default middleware chain */ - public static getDefaultMiddlewareChain(customFetch?: (request: string, init?: RequestInit) => Promise): Middleware[] { + public static getDefaultMiddlewareChain(customFetch: (request: string, init: RequestInit) => Promise = fetch as any): Middleware[] { const middlewareArray: Middleware[] = []; const retryHandler = new RetryHandler(new RetryHandlerOptions()); middlewareArray.push(retryHandler); const redirectHandler = new RedirectHandler(new RedirectHandlerOptions()); middlewareArray.push(redirectHandler); - if (customFetch) { - middlewareArray.push(new CustomFetchHandler(customFetch)); - } else { - middlewareArray.push(new CustomFetchHandler(fetch)); - } + middlewareArray.push(new CustomFetchHandler(customFetch)); return middlewareArray; } } + diff --git a/http/typescript/fetch/src/middlewares/redirectHandler.ts b/http/typescript/fetch/src/middlewares/redirectHandler.ts index 1fa6ad2633..23c784f3df 100644 --- a/http/typescript/fetch/src/middlewares/redirectHandler.ts +++ b/http/typescript/fetch/src/middlewares/redirectHandler.ts @@ -22,166 +22,169 @@ import { RedirectHandlerOptionKey, RedirectHandlerOptions } from "./options/redi * Class representing RedirectHandler */ export class RedirectHandler implements Middleware { - /** - * @private - * @static - * A member holding the array of redirect status codes - */ - private static REDIRECT_STATUS_CODES: Set = new Set([ - 301, // Moved Permanently - 302, // Found - 303, // See Other - 307, // Temporary Permanently - 308, // Moved Permanently - ]); - - /** - * @private - * @static - * A member holding SeeOther status code - */ - private static STATUS_CODE_SEE_OTHER = 303; - - /** - * @private - * @static - * A member holding the name of the location header - */ - private static LOCATION_HEADER = "Location"; - - /** - * @private - * @static - * A member representing the authorization header name - */ - private static AUTHORIZATION_HEADER = "Authorization"; - - /** - * @private - * @static - * A member holding the manual redirect value - */ - private static MANUAL_REDIRECT = "manual"; - - /** Next middleware to be executed*/ - next: Middleware | undefined; - /** - * - * @public - * @constructor - * To create an instance of RedirectHandler - * @param {RedirectHandlerOptions} [options = new RedirectHandlerOptions()] - The redirect handler options instance - * @returns An instance of RedirectHandler - */ - - public constructor(private options: RedirectHandlerOptions = new RedirectHandlerOptions()) { } - - /** - * @private - * To check whether the response has the redirect status code or not - * @param {Response} response - The response object - * @returns A boolean representing whether the response contains the redirect status code or not - */ - private isRedirect(response: FetchResponse): boolean { - return RedirectHandler.REDIRECT_STATUS_CODES.has(response.status); - } - - /** - * @private - * To check whether the response has location header or not - * @param {Response} response - The response object - * @returns A boolean representing the whether the response has location header or not - */ - private hasLocationHeader(response: FetchResponse): boolean { - return response.headers.has(RedirectHandler.LOCATION_HEADER); - } - - /** - * @private - * To get the redirect url from location header in response object - * @param {Response} response - The response object - * @returns A redirect url from location header - */ - private getLocationHeader(response: FetchResponse): string { - return response.headers.get(RedirectHandler.LOCATION_HEADER); - } - - /** - * @private - * To check whether the given url is a relative url or not - * @param {string} url - The url string value - * @returns A boolean representing whether the given url is a relative url or not - */ - private isRelativeURL(url: string): boolean { - return url.indexOf("://") === -1; - } - - /** - * @private - * To check whether the authorization header in the request should be dropped for consequent redirected requests - * @param {string} requestUrl - The request url value - * @param {string} redirectUrl - The redirect url value - * @returns A boolean representing whether the authorization header in the request should be dropped for consequent redirected requests - */ - private shouldDropAuthorizationHeader(requestUrl: string, redirectUrl: string): boolean { - const schemeHostRegex = /^[A-Za-z].+?:\/\/.+?(?=\/|$)/; - const requestMatches: string[] = schemeHostRegex.exec(requestUrl); - let requestAuthority: string; - let redirectAuthority: string; - if (requestMatches !== null) { - requestAuthority = requestMatches[0]; - } - const redirectMatches: string[] = schemeHostRegex.exec(redirectUrl); - if (redirectMatches !== null) { - redirectAuthority = redirectMatches[0]; - } - return typeof requestAuthority !== "undefined" && typeof redirectAuthority !== "undefined" && requestAuthority !== redirectAuthority; - } - - - /** - * @private - * @async - * To execute the next middleware and to handle in case of redirect response returned by the server - * @param {Context} context - The context object - * @param {number} redirectCount - The redirect count value - * @param {RedirectHandlerOptions} options - The redirect handler options instance - * @returns A promise that resolves to nothing - */ - private async executeWithRedirect(url: string, fetchRequestInit: FetchRequestInit, redirectCount: number, requestOptions?: Record): Promise { - const response = await this.next.execute(url, fetchRequestInit as RequestInit, requestOptions); - if (redirectCount < this.options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && this.options.shouldRedirect(response)) { - ++redirectCount; - if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { - fetchRequestInit["method"] = HttpMethod.GET; - delete fetchRequestInit.body; - } else { - const redirectUrl: string = this.getLocationHeader(response); - if (fetchRequestInit.headers && !this.isRelativeURL(redirectUrl) && this.shouldDropAuthorizationHeader(url, redirectUrl)) { - delete fetchRequestInit.headers[RedirectHandler.AUTHORIZATION_HEADER]; - } - url = redirectUrl; // check how to maintain url - } - return await this.executeWithRedirect(url, requestOptions, redirectCount, requestOptions); - } else { - return response; - } - } - - /** - * @public - * @async - * To execute the current middleware - * @param {Context} context - The context object of the request - * @returns A Promise that resolves to nothing - */ - public execute(url: string, requestInit: RequestInit, requestOptions?: Record): Promise { - const redirectCount = 0; - if (requestOptions && requestOptions[RedirectHandlerOptionKey]) - { - this.options = requestOptions[RedirectHandlerOptionKey] as RedirectHandlerOptions; - } - (requestInit as FetchRequestInit).redirect = RedirectHandler.MANUAL_REDIRECT; - return this.executeWithRedirect(url, requestInit as FetchRequestInit, redirectCount, requestOptions); - } + /** + * @private + * @static + * A member holding the array of redirect status codes + */ + private static REDIRECT_STATUS_CODES: Set = new Set([ + 301, // Moved Permanently + 302, // Found + 303, // See Other + 307, // Temporary Permanently + 308, // Moved Permanently + ]); + + /** + * @private + * @static + * A member holding SeeOther status code + */ + private static STATUS_CODE_SEE_OTHER = 303; + + /** + * @private + * @static + * A member holding the name of the location header + */ + private static LOCATION_HEADER = "Location"; + + /** + * @private + * @static + * A member representing the authorization header name + */ + private static AUTHORIZATION_HEADER = "Authorization"; + + /** + * @private + * @static + * A member holding the manual redirect value + */ + private static MANUAL_REDIRECT = "manual"; + + /** Next middleware to be executed*/ + next: Middleware | undefined; + /** + * + * @public + * @constructor + * To create an instance of RedirectHandler + * @param {RedirectHandlerOptions} [options = new RedirectHandlerOptions()] - The redirect handler options instance + * @returns An instance of RedirectHandler + */ + + public constructor(private options: RedirectHandlerOptions = new RedirectHandlerOptions()) {} + + /** + * @private + * To check whether the response has the redirect status code or not + * @param {Response} response - The response object + * @returns A boolean representing whether the response contains the redirect status code or not + */ + private isRedirect(response: FetchResponse): boolean { + return RedirectHandler.REDIRECT_STATUS_CODES.has(response.status); + } + + /** + * @private + * To check whether the response has location header or not + * @param {Response} response - The response object + * @returns A boolean representing the whether the response has location header or not + */ + private hasLocationHeader(response: FetchResponse): boolean { + return response.headers.has(RedirectHandler.LOCATION_HEADER); + } + + /** + * @private + * To get the redirect url from location header in response object + * @param {Response} response - The response object + * @returns A redirect url from location header + */ + private getLocationHeader(response: FetchResponse): string | null { + return response.headers.get(RedirectHandler.LOCATION_HEADER); + } + + /** + * @private + * To check whether the given url is a relative url or not + * @param {string} url - The url string value + * @returns A boolean representing whether the given url is a relative url or not + */ + private isRelativeURL(url: string): boolean { + return url.indexOf("://") === -1; + } + + /** + * @private + * To check whether the authorization header in the request should be dropped for consequent redirected requests + * @param {string} requestUrl - The request url value + * @param {string} redirectUrl - The redirect url value + * @returns A boolean representing whether the authorization header in the request should be dropped for consequent redirected requests + */ + private shouldDropAuthorizationHeader(requestUrl: string, redirectUrl: string): boolean { + const schemeHostRegex = /^[A-Za-z].+?:\/\/.+?(?=\/|$)/; + const requestMatches: string[] = schemeHostRegex.exec(requestUrl) as string[]; + let requestAuthority: string | undefined; + let redirectAuthority: string | undefined; + if (requestMatches !== null) { + requestAuthority = requestMatches[0]; + } + const redirectMatches: string[] = schemeHostRegex.exec(redirectUrl) as string[]; + if (redirectMatches !== null) { + redirectAuthority = redirectMatches[0]; + } + return typeof requestAuthority !== "undefined" && typeof redirectAuthority !== "undefined" && requestAuthority !== redirectAuthority; + } + + /** + * @private + * @async + * To execute the next middleware and to handle in case of redirect response returned by the server + * @param {Context} context - The context object + * @param {number} redirectCount - The redirect count value + * @param {RedirectHandlerOptions} options - The redirect handler options instance + * @returns A promise that resolves to nothing + */ + private async executeWithRedirect(url: string, fetchRequestInit: FetchRequestInit, redirectCount: number, requestOptions?: Record): Promise { + const response = await this.next?.execute(url, fetchRequestInit as RequestInit, requestOptions); + if (!response) { + throw new Error("Response is undefined"); + } + if (redirectCount < this.options.maxRedirects && this.isRedirect(response) && this.hasLocationHeader(response) && this.options.shouldRedirect(response)) { + ++redirectCount; + if (response.status === RedirectHandler.STATUS_CODE_SEE_OTHER) { + fetchRequestInit["method"] = HttpMethod.GET; + delete fetchRequestInit.body; + } else { + const redirectUrl = this.getLocationHeader(response); + if (redirectUrl) { + if (fetchRequestInit.headers && !this.isRelativeURL(redirectUrl) && this.shouldDropAuthorizationHeader(url, redirectUrl)) { + delete fetchRequestInit.headers[RedirectHandler.AUTHORIZATION_HEADER]; + } + url = redirectUrl; + } + } + return await this.executeWithRedirect(url, requestOptions as FetchRequestInit, redirectCount, requestOptions); + } else { + return response; + } + } + + /** + * @public + * @async + * To execute the current middleware + * @param {Context} context - The context object of the request + * @returns A Promise that resolves to nothing + */ + public execute(url: string, requestInit: RequestInit, requestOptions?: Record): Promise { + const redirectCount = 0; + if (requestOptions && requestOptions[RedirectHandlerOptionKey]) { + this.options = requestOptions[RedirectHandlerOptionKey] as RedirectHandlerOptions; + } + (requestInit as FetchRequestInit).redirect = RedirectHandler.MANUAL_REDIRECT; + return this.executeWithRedirect(url, requestInit as FetchRequestInit, redirectCount, requestOptions); + } } diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts index 44123bb389..dc2b018823 100644 --- a/http/typescript/fetch/src/middlewares/retryHandler.ts +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -51,7 +51,7 @@ export class RetryHandler implements Middleware { * @private * The next middleware in the middleware chain */ - next: Middleware; + next: Middleware | undefined; /** * @public @@ -79,11 +79,11 @@ export class RetryHandler implements Middleware { * @param {RequestInit} options - The options of a request * @returns Whether the payload is buffered or not */ - private isBuffered(options: FetchRequestInit | undefined): boolean { + private isBuffered(options: FetchRequestInit): boolean { const method = options.method; const isPutPatchOrPost: boolean = method === HttpMethod.PUT || method === HttpMethod.PATCH || method === HttpMethod.POST; if (isPutPatchOrPost) { - const isStream = getRequestHeader(options as RequestInit, "content-type") === "application/octet-stream"; + const isStream = getRequestHeader(options, "content-type") === "application/octet-stream"; if (isStream) { return false; } @@ -149,13 +149,18 @@ export class RetryHandler implements Middleware { * @param {RetryHandlerOptions} options - The retry middleware options instance * @returns A Promise that resolves to nothing */ - private async executeWithRetry(url: string, fetchRequestInit: FetchRequestInit, retryAttempts:number, requestOptions?: Record): Promise { - const response = await this.next.execute(url, fetchRequestInit as RequestInit, requestOptions); - if (retryAttempts < this.options.maxRetries && this.isRetry(response) && this.isBuffered(fetchRequestInit) && this.options.shouldRetry(this.options.delay, retryAttempts, url, fetchRequestInit as RequestInit, response)) { + private async executeWithRetry(url: string, fetchRequestInit: FetchRequestInit, retryAttempts: number, requestOptions?: Record): Promise { + const response = await this.next?.execute(url, fetchRequestInit as RequestInit, requestOptions); + if (!response) { + throw new Error("Response is undefined"); + } + if (retryAttempts < this.options.maxRetries && this.isRetry(response!) && this.isBuffered(fetchRequestInit) && this.options.shouldRetry(this.options.delay, retryAttempts, url, fetchRequestInit! as RequestInit, response)) { ++retryAttempts; - setRequestHeader(fetchRequestInit as RequestInit, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); - const delay = this.getDelay(response, retryAttempts, this.options.delay); - await this.sleep(delay); + setRequestHeader(fetchRequestInit, RetryHandler.RETRY_ATTEMPT_HEADER, retryAttempts.toString()); + if (response) { + const delay = this.getDelay(response!, retryAttempts, this.options.delay); + await this.sleep(delay); + } return await this.executeWithRetry(url, fetchRequestInit, retryAttempts, requestOptions); } else { return response; @@ -172,9 +177,9 @@ export class RetryHandler implements Middleware { public execute(url: string, requestInit: RequestInit, requestOptions?: Record): Promise { const retryAttempts = 0; - if((requestOptions && requestOptions[RetryHandlerOptionKey])){ - this.options = requestOptions[RetryHandlerOptionKey] as RetryHandlerOptions; - } - return this.executeWithRetry(url, requestInit as FetchRequestInit, retryAttempts, requestOptions); + if (requestOptions && requestOptions[RetryHandlerOptionKey]) { + this.options = requestOptions[RetryHandlerOptionKey] as RetryHandlerOptions; + } + return this.executeWithRetry(url, requestInit as FetchRequestInit, retryAttempts, requestOptions); } } diff --git a/http/typescript/fetch/src/middlewares/telemetryHandler.ts b/http/typescript/fetch/src/middlewares/telemetryHandler.ts index b37cd6292d..a429f9423b 100644 --- a/http/typescript/fetch/src/middlewares/telemetryHandler.ts +++ b/http/typescript/fetch/src/middlewares/telemetryHandler.ts @@ -1,20 +1,21 @@ import { RequestOption } from "@microsoft/kiota-abstractions"; -import { TelemetryHandlerOptions } from "./options/telemetryHandlerOptions"; + import { Middleware } from "./middleware"; +import { TelemetryHandlerOptions } from "./options/telemetryHandlerOptions"; export const TelemetryHandlerOptionsKey = "TelemetryHandlerOptionsKey"; export class TelemetryHandler implements Middleware { - constructor(private telemetryHandlerOptions: TelemetryHandlerOptions) { }; - next: Middleware; - execute(url: string, requestInit: RequestInit, requestOptions?: Record): Promise { - - if (this.telemetryHandlerOptions && this.telemetryHandlerOptions.telemetryConfigurator) { - console.log("tell tell"); - this.telemetryHandlerOptions.telemetryConfigurator(url, requestInit, requestOptions, this.telemetryHandlerOptions.telemetryInfomation); - } - else if (requestOptions[TelemetryHandlerOptionsKey]){ - (requestOptions[TelemetryHandlerOptionsKey] as TelemetryHandlerOptions).telemetryConfigurator(url, requestInit, requestOptions); - } - return this.next.execute(url, requestInit, requestOptions); - } -}; \ No newline at end of file + constructor(private telemetryHandlerOptions: TelemetryHandlerOptions) {} + next: Middleware | undefined; + execute(url: string, requestInit: RequestInit, requestOptions?: Record): Promise { + if (this.telemetryHandlerOptions && this.telemetryHandlerOptions.telemetryConfigurator) { + this.telemetryHandlerOptions.telemetryConfigurator(url, requestInit, requestOptions, this.telemetryHandlerOptions.telemetryInfomation); + } else if (requestOptions && requestOptions[TelemetryHandlerOptionsKey]) { + (requestOptions[TelemetryHandlerOptionsKey] as TelemetryHandlerOptions).telemetryConfigurator(url, requestInit, requestOptions); + } + if (!this.next) { + throw new Error("Please set the next middleware to continue the request"); + } + return this.next.execute(url, requestInit, requestOptions); + } +} diff --git a/http/typescript/fetch/src/utils/headersUtil.ts b/http/typescript/fetch/src/utils/headersUtil.ts index 4b26a1436f..547fb1dd25 100644 --- a/http/typescript/fetch/src/utils/headersUtil.ts +++ b/http/typescript/fetch/src/utils/headersUtil.ts @@ -5,6 +5,8 @@ * ------------------------------------------------------------------------------------------- */ +import { FetchRequestInit } from "./fetchDefinitions"; + /** * @module MiddlewareUtil */ @@ -17,7 +19,7 @@ * @param {string} key - The header key string * @returns A header value for the given key from the request */ -export const getRequestHeader = (options: RequestInit | undefined, key: string): string | null => { +export const getRequestHeader = (options: FetchRequestInit | undefined, key: string): string | undefined => { if (typeof options !== "undefined" && options.headers !== undefined) { return options.headers[key]; } @@ -33,7 +35,7 @@ export const getRequestHeader = (options: RequestInit | undefined, key: string): * @param {string } value - The header value string * @returns Nothing */ -export const setRequestHeader = (options: RequestInit | undefined, key: string, value: string): void => { +export const setRequestHeader = (options: FetchRequestInit | undefined, key: string, value: string): void => { if (typeof options !== "undefined") { if (!options.headers) { options.headers = {}; @@ -51,7 +53,7 @@ export const setRequestHeader = (options: RequestInit | undefined, key: string, * @param {string } value - The header value string * @returns Nothing */ -export const appendRequestHeader = (options: RequestInit | undefined, key: string, value: string): void => { +export const appendRequestHeader = (options: FetchRequestInit | undefined, key: string, value: string): void => { if (typeof options !== "undefined") { if (!options.headers) { options.headers = {}; diff --git a/http/typescript/fetch/tsconfig.cjs.json b/http/typescript/fetch/tsconfig.cjs.json index 3e9c607571..97f6483833 100644 --- a/http/typescript/fetch/tsconfig.cjs.json +++ b/http/typescript/fetch/tsconfig.cjs.json @@ -3,8 +3,9 @@ "compilerOptions":{ "target": "ES2015", "module": "commonjs", - "outDir": "./dist/cjs" + "outDir": "./dist/cjs", + "composite": true }, "exclude": ["node_modules", "dist"], - "include": ["./src/**/*.ts", "./test"] + "include": ["./src/**/*.ts"] } \ No newline at end of file diff --git a/http/typescript/fetch/tsconfig.cjs.test.json b/http/typescript/fetch/tsconfig.cjs.test.json new file mode 100644 index 0000000000..7aa1c47a47 --- /dev/null +++ b/http/typescript/fetch/tsconfig.cjs.test.json @@ -0,0 +1,16 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions":{ + "target": "ES2015", + "module": "commonjs", + "outDir": "./dist/cjs", + }, + "exclude": ["node_modules", "dist"], + "include": ["./test"], + "references": [ + { + "path": "./tsconfig.cjs.json" + } + ] + +} \ No newline at end of file diff --git a/http/typescript/fetch/tsconfig.es.json b/http/typescript/fetch/tsconfig.es.json index f21fce86d0..92771c721c 100644 --- a/http/typescript/fetch/tsconfig.es.json +++ b/http/typescript/fetch/tsconfig.es.json @@ -3,8 +3,9 @@ "compilerOptions": { "module": "ES2015", "target": "ES2017", - "outDir": "dist/es/" + "outDir": "dist/es/", + "composite": true }, "exclude": ["node_modules", "dist"], - "include": ["./src/**/*.ts", "./test/**/*.ts"] + "include": ["./src/**/*.ts"] } diff --git a/http/typescript/fetch/tsconfig.es.test.json b/http/typescript/fetch/tsconfig.es.test.json new file mode 100644 index 0000000000..f7c132f0c4 --- /dev/null +++ b/http/typescript/fetch/tsconfig.es.test.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "ES2015", + "target": "ES2017", + "outDir": "dist/es/" + }, + "exclude": ["node_modules", "dist","src"], + "include": [ "./test/**/*.ts"], + "references": [ + { + "path": "./tsconfig.cjs.json" + } + ] +} From f4fc00833f0fa8ef759b2d1092160209a6d31589 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Thu, 17 Mar 2022 19:13:41 -0700 Subject: [PATCH 27/34] update tests --- http/typescript/fetch/package-lock.json | 5 +- http/typescript/fetch/package.json | 6 +- http/typescript/fetch/src/httpClient.ts | 8 +- .../middlewares/browser/middlewareFactory.ts | 6 +- .../fetch/src/middlewares/redirectHandler.ts | 2 +- .../fetch/test/browser/MiddlewareFactory.ts | 4 +- .../fetch/test/browser/httpClient.ts | 11 +- .../test/common/middleware/RetryHandler.ts | 85 ++++---- .../common/middleware/RetryHandlerOptions.ts | 12 +- .../common/middleware/dummyFetchHandler.ts | 4 +- .../fetch/test/node/MiddlewareFactory.ts | 4 +- .../fetch/test/node/RedirectHandler.ts | 181 +++++++++--------- .../fetch/test/node/RedirectHandlerOptions.ts | 4 +- http/typescript/fetch/test/node/httpClient.ts | 8 +- http/typescript/fetch/tsconfig.cjs.test.json | 12 +- http/typescript/fetch/tsconfig.es.test.json | 13 +- 16 files changed, 187 insertions(+), 178 deletions(-) diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index 0557fd5d4b..616e1c7759 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -11,14 +11,14 @@ "dependencies": { "@microsoft/kiota-abstractions": "1.0.31", "node-fetch": "^2.6.5", - "tslib": "2.3.1" + "tslib": "^2.3.1" }, "devDependencies": { "@microsoft/kiota-abstractions": "^1.0.30", "@rollup/plugin-commonjs": "^21.0.0", "@rollup/plugin-node-resolve": "^13.0.5", "@types/chai": "^4.2.22", - "@types/mocha": "^9.0.0", + "@types/mocha": "^9.1.0", "@types/node": "^17.0.13", "@types/node-fetch": "^2.6.1", "@types/sinon": "^10.0.4", @@ -4153,6 +4153,7 @@ "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", "dev": true, + "license": "MIT", "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index 20478480a0..38b1d8253d 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -21,8 +21,6 @@ "main": "dist/cjs/src/index.js", "browser": { "./dist/es/src/index.js": "./dist/es/src/browser/index.js", - "./dist/es/src/utils/utils.js": "./dist/es/src/utils/browser/utils.js", - "./dist/es/src/middlewares/defaultFetchHandler.js": "./dist/es/src/middlewares/browser/defaultFetchHandler.js", "./dist/es/src/middlewares/middlewareFactory.js": "./dist/es/src/middlewares/browser/middlewareFactory.js" }, "types": "dist/cjs/src/index.d.ts", @@ -47,14 +45,14 @@ "dependencies": { "@microsoft/kiota-abstractions": "1.0.31", "node-fetch": "^2.6.5", - "tslib": "2.3.1" + "tslib": "^2.3.1" }, "devDependencies": { "@microsoft/kiota-abstractions": "^1.0.30", "@rollup/plugin-commonjs": "^21.0.0", "@rollup/plugin-node-resolve": "^13.0.5", "@types/chai": "^4.2.22", - "@types/mocha": "^9.0.0", + "@types/mocha": "^9.1.0", "@types/node": "^17.0.13", "@types/node-fetch": "^2.6.1", "@types/sinon": "^10.0.4", diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index 8dfc460c52..9539831cc4 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -19,12 +19,8 @@ export class HttpClient { */ public constructor(private customFetch?: (request: string, init: RequestInit) => Promise, ...middlewares: Middleware[]) { // Use default middleware chain if middlewares and custom fetch function are undefined - if (!middlewares.length || middlewares[0] === null) { - if (this.customFetch !== undefined) { - this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain(customFetch)); - } else { - this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain()); - } + if (!middlewares.length || !middlewares[0]) { + this.setMiddleware(...MiddlewareFactory.getDefaultMiddlewareChain(customFetch)); } else { if (this.customFetch) { this.setMiddleware(...middlewares, new CustomFetchHandler(customFetch! as any)); diff --git a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts index 1a9d86baab..78c9199080 100644 --- a/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts +++ b/http/typescript/fetch/src/middlewares/browser/middlewareFactory.ts @@ -32,9 +32,9 @@ export class MiddlewareFactory { const middlewareArray: Middleware[] = []; const retryHandler = new RetryHandler(new RetryHandlerOptions()); middlewareArray.push(retryHandler); - - middlewareArray.push(new CustomFetchHandler(customFetch)); - + + middlewareArray.push(new CustomFetchHandler(customFetch)); + return middlewareArray; } } diff --git a/http/typescript/fetch/src/middlewares/redirectHandler.ts b/http/typescript/fetch/src/middlewares/redirectHandler.ts index 23c784f3df..c8d12fe46d 100644 --- a/http/typescript/fetch/src/middlewares/redirectHandler.ts +++ b/http/typescript/fetch/src/middlewares/redirectHandler.ts @@ -166,7 +166,7 @@ export class RedirectHandler implements Middleware { url = redirectUrl; } } - return await this.executeWithRedirect(url, requestOptions as FetchRequestInit, redirectCount, requestOptions); + return await this.executeWithRedirect(url, fetchRequestInit, redirectCount, requestOptions); } else { return response; } diff --git a/http/typescript/fetch/test/browser/MiddlewareFactory.ts b/http/typescript/fetch/test/browser/MiddlewareFactory.ts index cb13986f7f..f8ef8c12e7 100644 --- a/http/typescript/fetch/test/browser/MiddlewareFactory.ts +++ b/http/typescript/fetch/test/browser/MiddlewareFactory.ts @@ -7,7 +7,7 @@ import { assert } from "chai"; -import { DefaultFetchHandler, MiddlewareFactory, RetryHandler } from "../../src/browser"; +import { CustomFetchHandler, MiddlewareFactory, RetryHandler } from "../../src/browser"; describe("MiddlewareFactory", () => { it("Should return the default pipeline", () => { @@ -15,6 +15,6 @@ describe("MiddlewareFactory", () => { assert.equal(defaultMiddleWareArray.length, 2); assert.isTrue(defaultMiddleWareArray[0] instanceof RetryHandler); - assert.isTrue(defaultMiddleWareArray[1] instanceof DefaultFetchHandler); + assert.isTrue(defaultMiddleWareArray[1] instanceof CustomFetchHandler); }); }); diff --git a/http/typescript/fetch/test/browser/httpClient.ts b/http/typescript/fetch/test/browser/httpClient.ts index f71d6a37ad..6ffafbe381 100644 --- a/http/typescript/fetch/test/browser/httpClient.ts +++ b/http/typescript/fetch/test/browser/httpClient.ts @@ -7,7 +7,7 @@ import { assert } from "chai"; -import { CustomFetchHandler, DefaultFetchHandler, HttpClient, RetryHandler } from "../../src"; +import { CustomFetchHandler, HttpClient, RetryHandler } from "../../src"; import { DummyFetchHandler } from "../common/middleware/dummyFetchHandler"; describe("HTTPClient.ts", () => { @@ -36,7 +36,7 @@ describe("HTTPClient.ts", () => { const next = client["middleware"].next; assert.isTrue(client["middleware"] instanceof RetryHandler); - assert.isTrue(next instanceof DefaultFetchHandler); + assert.isTrue(next instanceof CustomFetchHandler); }); it("Should set default middleware array with customFetchHandler if middleware parameter is undefined && customFetch is defined", () => { @@ -56,14 +56,15 @@ describe("HTTPClient.ts", () => { assert.isNotNull(client["middleware"]); - assert.isTrue(client["middleware"] instanceof DefaultFetchHandler); + assert.isTrue(client["middleware"] instanceof RetryHandler); }); - it("Should only set custom fetch if middleware parameter is null && customFetch is defined", () => { + it("Should set to custom fetch with default middleware chain if middleware parameter is null && customFetch is defined", () => { const client = new HttpClient(dummyCustomFetch, null); - assert.isUndefined(client["middleware"]); + assert.isDefined(client["middleware"]); assert.equal(client["customFetch"], dummyCustomFetch); + assert.isTrue(client["middleware"].next instanceof CustomFetchHandler); }); }); }); diff --git a/http/typescript/fetch/test/common/middleware/RetryHandler.ts b/http/typescript/fetch/test/common/middleware/RetryHandler.ts index 5078a928f0..b604043587 100644 --- a/http/typescript/fetch/test/common/middleware/RetryHandler.ts +++ b/http/typescript/fetch/test/common/middleware/RetryHandler.ts @@ -6,7 +6,6 @@ */ import { assert } from "chai"; -import { MiddlewareContext } from "../../../src/middlewares/middlewareContext"; import { RetryHandlerOptionKey, RetryHandlerOptions, ShouldRetry } from "../../../src/middlewares/options/retryHandlerOptions"; import { RetryHandler } from "../../../src/middlewares/retryHandler"; import { FetchRequestInit } from "../../../src/utils/fetchDefinitions"; @@ -18,7 +17,7 @@ var Response = Response; if (typeof Response !== "object") { Response = getResponse(); } -describe("RetryHandler.ts", function() { +describe("RetryHandler.ts", function () { this.timeout(20 * 1000); const retryHandler = new RetryHandler(); const retryHandlerOptions = new RetryHandlerOptions(); @@ -80,12 +79,11 @@ describe("RetryHandler.ts", function() { }); describe("isBuffered", () => { - const url = "dummy_url"; it("Should succeed for non post, patch, put requests", () => { const options: FetchRequestInit = { method: "GET", }; - assert.isTrue(retryHandler["isBuffered"](url, options)); + assert.isTrue(retryHandler["isBuffered"](options)); }); it("Should succeed for post request with non stream request", () => { @@ -93,17 +91,17 @@ describe("RetryHandler.ts", function() { method: "POST", body: "test", }; - assert.isTrue(retryHandler["isBuffered"](url, options)); + assert.isTrue(retryHandler["isBuffered"](options)); }); it("Should fail for stream request", () => { const options: FetchRequestInit = { method: "PUT", headers: { - "Content-Type": "application/octet-stream", + "content-type": "application/octet-stream", }, }; - assert.isFalse(retryHandler["isBuffered"](url, options)); + assert.isFalse(retryHandler["isBuffered"](options)); }); }); @@ -165,85 +163,86 @@ describe("RetryHandler.ts", function() { const maxRetries = 2; const shouldRetry: ShouldRetry = () => false; const options = new RetryHandlerOptions(delay, maxRetries, shouldRetry); - const cxt: MiddlewareContext = { - requestUrl: "url", - fetchRequestInit: { - method: "PUT", - headers: { - "Content-Type": "application/octet-stream", - }, - }, - requestInformationOptions: { - [RetryHandlerOptionKey]: options, + + const requestUrl = "url"; + const fetchRequestInit = { + method: "PUT", + headers: { + "content-type": "application/octet-stream", }, }; + const requestInformationOptions = { + [RetryHandlerOptionKey]: options, + }; + dummyFetchHandler.setResponses([new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); - const response = await handler["execute"](cxt); + const response = await handler["execute"](requestUrl, fetchRequestInit, requestInformationOptions); assert.equal(response.status, 429); }); it("Should use the default set of options", async () => { - const cxt: MiddlewareContext = { - requestUrl: "url", - fetchRequestInit: { - method: "PUT", - headers: { - "Content-Type": "application/octet-stream", - }, + const requestUrl = "url"; + const fetchRequestInit = { + method: "PUT", + headers: { + "content-type": "application/octet-stream", }, }; + dummyFetchHandler.setResponses([new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); - const response = await handler["execute"](cxt); + const response = await handler["execute"](requestUrl, fetchRequestInit); assert.equal(response.status, 429); }); }); describe("executeWithRetry", async () => { handler.next = dummyFetchHandler; - const cxt: MiddlewareContext = { - requestUrl: "url", - fetchRequestInit: { - method: "GET", - }, + const requestUrl = "url"; + const fetchRequestInit = { + method: "GET", }; + it("Should return non retried response incase of maxRetries busted out", async () => { dummyFetchHandler.setResponses([new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); - const response = await handler["executeWithRetry"](cxt, RetryHandlerOptions["MAX_MAX_RETRIES"], options); + const response = await handler["executeWithRetry"](requestUrl, fetchRequestInit, RetryHandlerOptions["MAX_MAX_RETRIES"]); assert.equal(response.status, 429); }); it("Should return succeeded response for non retry response", async () => { dummyFetchHandler.setResponses([new Response("ok", { status: 200 })]); - const response = await handler["executeWithRetry"](cxt, 0, options); + const response = await handler["executeWithRetry"](requestUrl, fetchRequestInit, 0); assert.equal(response.status, 200); }); it("Should return non retried response for streaming request", async () => { - const c: MiddlewareContext = { - requestUrl: "url", - fetchRequestInit: { - method: "POST", - headers: { - "Content-Type": "application/octet-stream", - }, + const requestUrl = "url"; + const fetchRequestInit = { + method: "POST", + headers: { + "content-type": "application/octet-stream", }, }; + dummyFetchHandler.setResponses([new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); - const response = await handler["executeWithRetry"](c, 0, options); + const response = await handler["executeWithRetry"](requestUrl, fetchRequestInit, 0); assert.equal(response.status, 429); }); it("Should successfully retry and return ok response", async () => { const opts = new RetryHandlerOptions(1); + const handler = new RetryHandler(opts); + handler.next = dummyFetchHandler; dummyFetchHandler.setResponses([new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); - const response = await handler["executeWithRetry"](cxt, 0, opts); + const response = await handler["executeWithRetry"](requestUrl, fetchRequestInit, 0); assert.equal(response.status, 200); }); it("Should fail by exceeding max retries", async () => { const opts = new RetryHandlerOptions(1, 2); + const handler = new RetryHandler(opts); + handler.next = dummyFetchHandler; dummyFetchHandler.setResponses([new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response(null, { status: 429 }), new Response("ok", { status: 200 })]); - const response = await handler["executeWithRetry"](cxt, 0, opts); + const response = await handler["executeWithRetry"](requestUrl, fetchRequestInit, 0); assert.equal(response.status, 429); }); }); diff --git a/http/typescript/fetch/test/common/middleware/RetryHandlerOptions.ts b/http/typescript/fetch/test/common/middleware/RetryHandlerOptions.ts index a1596531eb..28162e6faa 100644 --- a/http/typescript/fetch/test/common/middleware/RetryHandlerOptions.ts +++ b/http/typescript/fetch/test/common/middleware/RetryHandlerOptions.ts @@ -23,7 +23,7 @@ describe("RetryHandlerOptions.ts", () => { const options = new RetryHandlerOptions(1000, 1000); throw new Error("Test Failed - Something wrong with the delay and maxRetries max limit validation"); } catch (error) { - assert.equal(error.name, "MaxLimitExceeded"); + assert.equal((error as Error).name, "MaxLimitExceeded"); } }); @@ -32,7 +32,7 @@ describe("RetryHandlerOptions.ts", () => { const options = new RetryHandlerOptions(1000, 2); throw new Error("Test Failed - Test Failed - Something wrong with the delay max limit validation"); } catch (error) { - assert.equal(error.name, "MaxLimitExceeded"); + assert.equal((error as Error).name, "MaxLimitExceeded"); } }); @@ -41,7 +41,7 @@ describe("RetryHandlerOptions.ts", () => { const options = new RetryHandlerOptions(1, 2000); throw new Error("Test Failed - Something wrong with the maxRetries max limit validation"); } catch (error) { - assert.equal(error.name, "MaxLimitExceeded"); + assert.equal((error as Error).name, "MaxLimitExceeded"); } }); @@ -50,7 +50,7 @@ describe("RetryHandlerOptions.ts", () => { const options = new RetryHandlerOptions(-1, -100); throw new Error("Test Failed - Something wrong with the delay and maxRetries max limit validation"); } catch (error) { - assert.equal(error.name, "MinExpectationNotMet"); + assert.equal((error as Error).name, "MinExpectationNotMet"); } }); @@ -60,7 +60,7 @@ describe("RetryHandlerOptions.ts", () => { const options = new RetryHandlerOptions(-5, 2); throw new Error("Test Failed - Something wrong with the delay max limit validation"); } catch (error) { - assert.equal(error.name, "MinExpectationNotMet"); + assert.equal((error as Error).name, "MinExpectationNotMet"); } }); @@ -69,7 +69,7 @@ describe("RetryHandlerOptions.ts", () => { const options = new RetryHandlerOptions(1, -10); throw new Error("Test Failed - Something wrong with the maxRetries max limit validation"); } catch (error) { - assert.equal(error.name, "MinExpectationNotMet"); + assert.equal((error as Error).name, "MinExpectationNotMet"); } }); diff --git a/http/typescript/fetch/test/common/middleware/dummyFetchHandler.ts b/http/typescript/fetch/test/common/middleware/dummyFetchHandler.ts index 91f1d16157..fa5ee08946 100644 --- a/http/typescript/fetch/test/common/middleware/dummyFetchHandler.ts +++ b/http/typescript/fetch/test/common/middleware/dummyFetchHandler.ts @@ -9,8 +9,8 @@ * @module DummyHTTPMessageHandler */ +import { RequestOption } from "@microsoft/kiota-abstractions"; import { Middleware } from "../../../src/middlewares/middleware"; -import { MiddlewareContext } from "../../../src/middlewares/middlewareContext"; /** * @class @@ -55,7 +55,7 @@ export class DummyFetchHandler implements Middleware { * @returns A promise that resolves to nothing */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public async execute(context: MiddlewareContext) { + public async execute(url: string, requestInit: RequestInit, requestOptions?: Record) { return this.responses.shift(); } } diff --git a/http/typescript/fetch/test/node/MiddlewareFactory.ts b/http/typescript/fetch/test/node/MiddlewareFactory.ts index ce1b0cfcf4..7210db7849 100644 --- a/http/typescript/fetch/test/node/MiddlewareFactory.ts +++ b/http/typescript/fetch/test/node/MiddlewareFactory.ts @@ -7,7 +7,7 @@ import { assert } from "chai"; -import { DefaultFetchHandler, MiddlewareFactory, RedirectHandler, RetryHandler } from "../../src"; +import { CustomFetchHandler, MiddlewareFactory, RedirectHandler, RetryHandler } from "../../src"; describe("MiddlewareFactory", () => { it("Should return the default pipeline", () => { @@ -16,6 +16,6 @@ describe("MiddlewareFactory", () => { assert.isTrue(defaultMiddleWareArray[0] instanceof RetryHandler); assert.isTrue(defaultMiddleWareArray[1] instanceof RedirectHandler); - assert.isTrue(defaultMiddleWareArray[2] instanceof DefaultFetchHandler); + assert.isTrue(defaultMiddleWareArray[2] instanceof CustomFetchHandler); }); }); diff --git a/http/typescript/fetch/test/node/RedirectHandler.ts b/http/typescript/fetch/test/node/RedirectHandler.ts index 21d1001bb1..5643c726a9 100644 --- a/http/typescript/fetch/test/node/RedirectHandler.ts +++ b/http/typescript/fetch/test/node/RedirectHandler.ts @@ -8,7 +8,6 @@ import { assert } from "chai"; import { Response } from "node-fetch"; -import { MiddlewareContext } from "../../src/middlewares/middlewareContext"; import { RedirectHandlerOptionKey, RedirectHandlerOptions } from "../../src/middlewares/options/redirectHandlerOptions"; import { RedirectHandler } from "../../src/middlewares/redirectHandler"; import { DummyFetchHandler } from "../common/middleware/dummyFetchHandler"; @@ -33,42 +32,42 @@ describe("RedirectHandler.ts", () => { const response = new Response("Dummy", { status: 301, }); - assert.isTrue(redirectHandler["isRedirect"](response)); + assert.isTrue(redirectHandler["isRedirect"](response as any)); }); it("Should return true for response having 302 status code", () => { const response = new Response("Dummy", { status: 302, }); - assert.isTrue(redirectHandler["isRedirect"](response)); + assert.isTrue(redirectHandler["isRedirect"](response as any)); }); it("Should return true for response having 303 status code", () => { const response = new Response("Dummy", { status: 303, }); - assert.isTrue(redirectHandler["isRedirect"](response)); + assert.isTrue(redirectHandler["isRedirect"](response as any)); }); it("Should return true for response having 307 status code", () => { const response = new Response("Dummy", { status: 307, }); - assert.isTrue(redirectHandler["isRedirect"](response)); + assert.isTrue(redirectHandler["isRedirect"](response as any)); }); it("Should return true for response having 308 status code", () => { const response = new Response("Dummy", { status: 308, }); - assert.isTrue(redirectHandler["isRedirect"](response)); + assert.isTrue(redirectHandler["isRedirect"](response as any)); }); it("Should return false for non redirect status codes", () => { const response = new Response("Dummy", { status: 200, }); - assert.isFalse(redirectHandler["isRedirect"](response)); + assert.isFalse(redirectHandler["isRedirect"](response as any)); }); }); @@ -87,7 +86,7 @@ describe("RedirectHandler.ts", () => { const res = new Response("Dummy", { status: 301, }); - assert.isFalse(redirectHandler["hasLocationHeader"](res)); + assert.isFalse(redirectHandler["hasLocationHeader"](res as any)); }); }); @@ -100,14 +99,14 @@ describe("RedirectHandler.ts", () => { location, }, }); - assert.equal(redirectHandler["getLocationHeader"](res), location); + assert.equal(redirectHandler["getLocationHeader"](res as any), location); }); it("Should return null for response without location header", () => { const res = new Response("Dummy", { status: 301, }); - assert.equal(redirectHandler["getLocationHeader"](res), null); + assert.equal(redirectHandler["getLocationHeader"](res as any), null); }); }); @@ -170,18 +169,17 @@ describe("RedirectHandler.ts", () => { const maxRedirects = 2; const shouldRedirect = () => true; const options = new RedirectHandlerOptions(maxRedirects, shouldRedirect); - const cxt: MiddlewareContext = { - requestUrl: "url", - fetchRequestInit: { - method: "PUT", - headers: { - "Content-Type": "application/octet-stream", - }, - }, - requestInformationOptions: { - [RedirectHandlerOptionKey]: options, + + const requestUrl = "url"; + const fetchRequestInit = { + method: "PUT", + headers: { + "Content-Type": "application/octet-stream", }, }; + const requestInformationOptions = { + [RedirectHandlerOptionKey]: options, + }; dummyFetchHandler.setResponses([ new Response(null, { @@ -198,8 +196,8 @@ describe("RedirectHandler.ts", () => { }), new Response("RETURNED", { status: 301 }), new Response("ok", { status: 200 }), - ]); - const response = await handler["execute"](cxt); + ] as any); + const response = await handler["execute"](requestUrl, fetchRequestInit, requestInformationOptions); assert.equal(response.status, 301); assert.isDefined(response.body); }); @@ -208,15 +206,15 @@ describe("RedirectHandler.ts", () => { const handler = new RedirectHandler(); const dummyFetchHandler = new DummyFetchHandler(); handler.next = dummyFetchHandler; - const cxt: MiddlewareContext = { - requestUrl: "url", - fetchRequestInit: { - method: "PUT", - headers: { - "Content-Type": "application/octet-stream", - }, + + const requestUrl = "url"; + const fetchRequestInit = { + method: "PUT", + headers: { + "Content-Type": "application/octet-stream", }, }; + const responseBody = { test: "TEST", }; @@ -229,55 +227,59 @@ describe("RedirectHandler.ts", () => { }, }); } - dummyFetchHandler.setResponses([...arr, new Response(responseBody, { status: 301 })]); + dummyFetchHandler.setResponses([...arr, new Response(responseBody as any, { status: 301 })]); - const response = await handler["execute"](cxt); + const response = await handler["execute"](requestUrl, fetchRequestInit); assert.equal(response.status, 301); assert.isNotNull(response.body); }); }); describe("executeWithRedirect", async () => { - const context: MiddlewareContext = { - requestUrl: "/me", - fetchRequestInit: { - method: "GET", - }, + const requestUrl = "/me"; + const fetchRequestInit = { + method: "GET", }; - const dummyFetchHandler = new DummyFetchHandler(); + const handler = new RedirectHandler(); + const dummyFetchHandler = new DummyFetchHandler(); handler.next = dummyFetchHandler; + it("Should not redirect for the redirect count equal to maxRedirects", async () => { const maxRedirect = 1; const options = new RedirectHandlerOptions(maxRedirect); - dummyFetchHandler.setResponses([new Response("", { status: 301 }), new Response("ok", { status: 200 })]); - const response = await handler["executeWithRedirect"](context, maxRedirect, options); + const handler = new RedirectHandler(options); + handler.next = dummyFetchHandler; + dummyFetchHandler.setResponses([new Response("", { status: 301 }), new Response("ok", { status: 200 }) as any]); + const response = await handler["executeWithRedirect"](requestUrl, fetchRequestInit, maxRedirect); assert.equal(response.status, 301); }); it("Should not redirect for the non redirect response", async () => { const options = new RedirectHandlerOptions(); - dummyFetchHandler.setResponses([new Response("", { status: 200 })]); - const response = await handler["executeWithRedirect"](context, 0, options); + const handler = new RedirectHandler(options); + handler.next = dummyFetchHandler; + dummyFetchHandler.setResponses([new Response("", { status: 200 })] as any); + const response = await handler["executeWithRedirect"](requestUrl, fetchRequestInit, 0); assert.equal(response.status, 200); }); it("Should not redirect for the redirect response without location header", async () => { - const options = new RedirectHandlerOptions(); - dummyFetchHandler.setResponses([new Response("", { status: 301 }), new Response("ok", { status: 200 })]); - const response = await handler["executeWithRedirect"](context, 0, options); + dummyFetchHandler.setResponses([new Response("", { status: 301 }), new Response("ok", { status: 200 }) as any]); + const response = await handler["executeWithRedirect"](requestUrl, fetchRequestInit, 0); assert.equal(response.status, 301); }); it("Should not redirect for shouldRedirect callback returning false", async () => { const options = new RedirectHandlerOptions(undefined, () => false); - dummyFetchHandler.setResponses([new Response("", { status: 301 }), new Response("ok", { status: 200 })]); - const response = await handler["executeWithRedirect"](context, 0, options); + const handler = new RedirectHandler(options); + handler.next = dummyFetchHandler; + dummyFetchHandler.setResponses([new Response("", { status: 301 }), new Response("ok", { status: 200 }) as any]); + const response = await handler["executeWithRedirect"](requestUrl, fetchRequestInit, 0); assert.equal(response.status, 301); }); it("Should drop body and change method to get for SEE_OTHER status code", async () => { - const options = new RedirectHandlerOptions(); dummyFetchHandler.setResponses([ new Response("", { status: 303, @@ -286,25 +288,23 @@ describe("RedirectHandler.ts", () => { }, }), new Response("ok", { status: 200 }), - ]); - const response = await handler["executeWithRedirect"](context, 0, options); - assert.isUndefined(context.fetchRequestInit.body); - assert.equal(context.fetchRequestInit.method, "GET"); + ] as any); + const response = await handler["executeWithRedirect"](requestUrl, fetchRequestInit, 0); + assert.isUndefined(fetchRequestInit["body"]); + assert.equal(fetchRequestInit.method, "GET"); assert.equal(response.status, 200); }); it("Should not drop Authorization header for relative url redirect", async () => { - const options = new RedirectHandlerOptions(); - const cxt: MiddlewareContext = { - requestUrl: "/me", - fetchRequestInit: { - method: "POST", - body: "dummy body", - headers: { - [RedirectHandler["AUTHORIZATION_HEADER"]]: "Bearer TEST", - }, + const requestUrl = "/me"; + const fetchRequestInit = { + method: "POST", + body: "dummy body", + headers: { + [RedirectHandler["AUTHORIZATION_HEADER"]]: "Bearer TEST", }, }; + dummyFetchHandler.setResponses([ new Response("", { status: 301, @@ -312,27 +312,25 @@ describe("RedirectHandler.ts", () => { [RedirectHandler["LOCATION_HEADER"]]: "/location", }, }), - new Response("ok", { status: 200 }), + new Response("ok", { status: 200 }) as any, ]); - const response = await handler["executeWithRedirect"](cxt, 0, options); - assert.isDefined(cxt.fetchRequestInit.headers[RedirectHandler["AUTHORIZATION_HEADER"]]); - assert.equal(cxt.fetchRequestInit.headers[RedirectHandler["AUTHORIZATION_HEADER"]], "Bearer TEST"); + const response = await handler["executeWithRedirect"](requestUrl, fetchRequestInit, 0); + assert.isDefined(fetchRequestInit.headers[RedirectHandler["AUTHORIZATION_HEADER"]]); + assert.equal(fetchRequestInit.headers[RedirectHandler["AUTHORIZATION_HEADER"]], "Bearer TEST"); assert.equal(response.status, 200); }); it("Should not drop Authorization header for same authority redirect url", async () => { - const options = new RedirectHandlerOptions(); - const cxt: MiddlewareContext = { - requestUrl: "https://graph.microsoft.com/v1.0/me", - fetchRequestInit: { - method: "POST", - body: "dummy body", - headers: { - [RedirectHandler["AUTHORIZATION_HEADER"]]: "Bearer TEST", - }, + const requestUrl = "https://graph.microsoft.com/v1.0/me"; + const fetchRequestInit = { + method: "POST", + body: "dummy body", + headers: { + [RedirectHandler["AUTHORIZATION_HEADER"]]: "Bearer TEST", }, }; + dummyFetchHandler.setResponses([ new Response("", { status: 301, @@ -341,21 +339,19 @@ describe("RedirectHandler.ts", () => { }, }), new Response("ok", { status: 200 }), - ]); - const response = await handler["executeWithRedirect"](cxt, 0, options); - assert.isDefined(cxt.fetchRequestInit.headers[RedirectHandler["AUTHORIZATION_HEADER"]]); + ] as any); + const response = await handler["executeWithRedirect"](requestUrl, fetchRequestInit, 0); + assert.isDefined(fetchRequestInit.headers[RedirectHandler["AUTHORIZATION_HEADER"]]); assert.equal(response.status, 200); }); it("Should return success response after successful redirect", async () => { - const options = new RedirectHandlerOptions(); - const cxt: MiddlewareContext = { - requestUrl: "https://graph.microsoft.com/v1.0/me", - fetchRequestInit: { - method: "POST", - body: "dummy body", - }, + const requestUrl = "https://graph.microsoft.com/v1.0/me"; + const fetchRequestInit = { + method: "POST", + body: "dummy body", }; + dummyFetchHandler.setResponses([ new Response(null, { status: 301, @@ -364,26 +360,25 @@ describe("RedirectHandler.ts", () => { }, }), new Response("ok", { status: 200 }), - ]); - const response = await handler["executeWithRedirect"](cxt, 0, options); + ] as any); + const response = await handler["executeWithRedirect"](requestUrl, fetchRequestInit, 0); assert.equal(response.status, 200); }); }); describe("execute", async () => { it("Should set the redirect value in options to manual", async () => { - const context: MiddlewareContext = { - requestUrl: "/me", - fetchRequestInit: { - method: "GET", - }, + const requestUrl = "/me"; + const fetchRequestInit: RequestInit = { + method: "GET", }; + const dummyFetchHandler = new DummyFetchHandler(); const handler = new RedirectHandler(); handler.next = dummyFetchHandler; - dummyFetchHandler.setResponses([new Response("", { status: 200 })]); - await handler.execute(context); - assert.equal(context.fetchRequestInit.redirect, RedirectHandler["MANUAL_REDIRECT"]); + dummyFetchHandler.setResponses([new Response("", { status: 200 })] as any); + await handler.execute(requestUrl, fetchRequestInit); + assert.equal(fetchRequestInit.redirect, RedirectHandler["MANUAL_REDIRECT"]); }); }); }); diff --git a/http/typescript/fetch/test/node/RedirectHandlerOptions.ts b/http/typescript/fetch/test/node/RedirectHandlerOptions.ts index d93e24bf58..a8970f7467 100644 --- a/http/typescript/fetch/test/node/RedirectHandlerOptions.ts +++ b/http/typescript/fetch/test/node/RedirectHandlerOptions.ts @@ -30,7 +30,7 @@ describe("RedirectHandlerOptions.ts", () => { const options = new RedirectHandlerOptions(100); throw new Error("Test Failed - Something wrong with the max redirects value redirection"); } catch (error) { - assert.equal(error.name, "MaxLimitExceeded"); + assert.equal((error as Error).name, "MaxLimitExceeded"); } }); it("Should throw error for setting max redirects to negative", () => { @@ -39,7 +39,7 @@ describe("RedirectHandlerOptions.ts", () => { const options = new RedirectHandlerOptions(-10); throw new Error(" Test Failed - Something wrong with the max redirects value redirection"); } catch (error) { - assert.equal(error.name, "MinExpectationNotMet"); + assert.equal((error as Error).name, "MinExpectationNotMet"); } }); diff --git a/http/typescript/fetch/test/node/httpClient.ts b/http/typescript/fetch/test/node/httpClient.ts index 1a02904929..dd8a9cc7fc 100644 --- a/http/typescript/fetch/test/node/httpClient.ts +++ b/http/typescript/fetch/test/node/httpClient.ts @@ -7,7 +7,7 @@ import { assert } from "chai"; -import { CustomFetchHandler, DefaultFetchHandler, HttpClient, RedirectHandler, RetryHandler } from "../../src"; +import { CustomFetchHandler, HttpClient, RedirectHandler, RetryHandler } from "../../src"; import { DummyFetchHandler } from "../common/middleware/dummyFetchHandler"; describe("HTTPClient.ts", () => { @@ -37,7 +37,7 @@ describe("HTTPClient.ts", () => { assert.isTrue(client["middleware"] instanceof RetryHandler); assert.isTrue(next instanceof RedirectHandler); - assert.isTrue(next.next instanceof DefaultFetchHandler); + assert.isTrue(next.next instanceof CustomFetchHandler); }); it("Should set default middleware array with customFetchHandler if middleware parameter is undefined && customFetch is defined", () => { @@ -58,13 +58,13 @@ describe("HTTPClient.ts", () => { assert.isNotNull(client["middleware"]); - assert.isTrue(client["middleware"] instanceof DefaultFetchHandler); + assert.isTrue(client["middleware"] instanceof RetryHandler); }); it("Should only set custom fetch if middleware parameter is null && customFetch is defined", () => { const client = new HttpClient(dummyCustomFetch, null); - assert.isUndefined(client["middleware"]); + assert.isDefined(client["middleware"]); assert.equal(client["customFetch"], dummyCustomFetch); }); }); diff --git a/http/typescript/fetch/tsconfig.cjs.test.json b/http/typescript/fetch/tsconfig.cjs.test.json index 7aa1c47a47..0bb0062cc1 100644 --- a/http/typescript/fetch/tsconfig.cjs.test.json +++ b/http/typescript/fetch/tsconfig.cjs.test.json @@ -3,7 +3,17 @@ "compilerOptions":{ "target": "ES2015", "module": "commonjs", - "outDir": "./dist/cjs", + "outDir": "./dist/cjs/test/", + "noEmitOnError": true, + "noImplicitAny": false, + "moduleResolution": "node", + "removeComments": false, + "strictFunctionTypes": false, + "strictNullChecks": false, + "sourceMap": false, + "declaration": false, + "strict": false, + "noImplicitThis": false }, "exclude": ["node_modules", "dist"], "include": ["./test"], diff --git a/http/typescript/fetch/tsconfig.es.test.json b/http/typescript/fetch/tsconfig.es.test.json index f7c132f0c4..001997890c 100644 --- a/http/typescript/fetch/tsconfig.es.test.json +++ b/http/typescript/fetch/tsconfig.es.test.json @@ -3,13 +3,22 @@ "compilerOptions": { "module": "ES2015", "target": "ES2017", - "outDir": "dist/es/" + "outDir": "dist/es/test/", + "noEmitOnError": true, + "noImplicitAny": false, + "removeComments": false, + "strictFunctionTypes": false, + "strictNullChecks": false, + "sourceMap": false, + "declaration": false, + "strict": false, + "noImplicitThis": false }, "exclude": ["node_modules", "dist","src"], "include": [ "./test/**/*.ts"], "references": [ { - "path": "./tsconfig.cjs.json" + "path": "./tsconfig.es.json" } ] } From 3db1f8cd1019f14780106d4dd581b056e3f9e074 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Fri, 18 Mar 2022 02:03:06 -0700 Subject: [PATCH 28/34] resetting abstractions --- abstractions/typescript/.eslintignore | 3 +- abstractions/typescript/.eslintrc.json | 2 +- abstractions/typescript/.npmignore | 5 +- abstractions/typescript/package-lock.json | 177 ++++++------- abstractions/typescript/package.json | 75 ++---- .../typescript/src/requestInformation.ts | 243 +++++++++--------- abstractions/typescript/src/requestOption.ts | 3 +- abstractions/typescript/test/browser/index.ts | 8 - .../test/browser/requestInformation.ts | 20 -- .../test/node/requestInformation.ts | 31 --- abstractions/typescript/tsconfig.base.json | 2 +- abstractions/typescript/tsconfig.es.json | 2 +- 12 files changed, 245 insertions(+), 326 deletions(-) delete mode 100644 abstractions/typescript/test/browser/index.ts delete mode 100644 abstractions/typescript/test/browser/requestInformation.ts delete mode 100644 abstractions/typescript/test/node/requestInformation.ts diff --git a/abstractions/typescript/.eslintignore b/abstractions/typescript/.eslintignore index 1f80e8eeae..8942aa232d 100644 --- a/abstractions/typescript/.eslintignore +++ b/abstractions/typescript/.eslintignore @@ -3,4 +3,5 @@ *.d.ts node_modules -dist +lib +spec/development \ No newline at end of file diff --git a/abstractions/typescript/.eslintrc.json b/abstractions/typescript/.eslintrc.json index f41e06fd5e..e73e74ab49 100644 --- a/abstractions/typescript/.eslintrc.json +++ b/abstractions/typescript/.eslintrc.json @@ -25,7 +25,7 @@ } ], "@typescript-eslint/no-var-requires": "error", - "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-non-null-assertion": "error", "@typescript-eslint/naming-convention": [ "error", { diff --git a/abstractions/typescript/.npmignore b/abstractions/typescript/.npmignore index ea0db9d88c..bfe3b8d326 100644 --- a/abstractions/typescript/.npmignore +++ b/abstractions/typescript/.npmignore @@ -1,4 +1 @@ -tsconfig.json -doc/ -dist/cjs/test -dist/es/test \ No newline at end of file +tsconfig.json \ No newline at end of file diff --git a/abstractions/typescript/package-lock.json b/abstractions/typescript/package-lock.json index 1bb2dde0d8..19677edb2c 100644 --- a/abstractions/typescript/package-lock.json +++ b/abstractions/typescript/package-lock.json @@ -18,13 +18,13 @@ "@types/node": "^17.0.21", "@types/uri-template-lite": "^19.12.1", "@types/uuid": "^8.3.4", - "@typescript-eslint/eslint-plugin": "^5.14.0", - "@typescript-eslint/parser": "^5.14.0", + "@typescript-eslint/eslint-plugin": "^5.15.0", + "@typescript-eslint/parser": "^5.15.0", "eslint": "^8.11.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-simple-import-sort": "^7.0.0", - "prettier": "^2.5.1", + "prettier": "^2.6.0", "typescript": "^4.6.2" } }, @@ -128,14 +128,14 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", - "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.15.0.tgz", + "integrity": "sha512-u6Db5JfF0Esn3tiAKELvoU5TpXVSkOpZ78cEGn/wXtT2RVqs2vkt4ge6N8cRCyw7YVKhmmLDbwI2pg92mlv7cA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/type-utils": "5.14.0", - "@typescript-eslint/utils": "5.14.0", + "@typescript-eslint/scope-manager": "5.15.0", + "@typescript-eslint/type-utils": "5.15.0", + "@typescript-eslint/utils": "5.15.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -161,14 +161,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", - "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.15.0.tgz", + "integrity": "sha512-NGAYP/+RDM2sVfmKiKOCgJYPstAO40vPAgACoWPO/+yoYKSgAXIFaBKsV8P0Cc7fwKgvj27SjRNX4L7f4/jCKQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", + "@typescript-eslint/scope-manager": "5.15.0", + "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/typescript-estree": "5.15.0", "debug": "^4.3.2" }, "engines": { @@ -188,13 +188,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz", - "integrity": "sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.15.0.tgz", + "integrity": "sha512-EFiZcSKrHh4kWk0pZaa+YNJosvKE50EnmN4IfgjkA3bTHElPtYcd2U37QQkNTqwMCS7LXeDeZzEqnsOH8chjSg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0" + "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/visitor-keys": "5.15.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -205,12 +205,12 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz", - "integrity": "sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.15.0.tgz", + "integrity": "sha512-KGeDoEQ7gHieLydujGEFLyLofipe9PIzfvA/41urz4hv+xVxPEbmMQonKSynZ0Ks2xDhJQ4VYjB3DnRiywvKDA==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.14.0", + "@typescript-eslint/utils": "5.15.0", "debug": "^4.3.2", "tsutils": "^3.21.0" }, @@ -231,9 +231,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.14.0.tgz", - "integrity": "sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.15.0.tgz", + "integrity": "sha512-yEiTN4MDy23vvsIksrShjNwQl2vl6kJeG9YkVJXjXZnkJElzVK8nfPsWKYxcsGWG8GhurYXP4/KGj3aZAxbeOA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -244,13 +244,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz", - "integrity": "sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.15.0.tgz", + "integrity": "sha512-Hb0e3dGc35b75xLzixM3cSbG1sSbrTBQDfIScqdyvrfJZVEi4XWAT+UL/HMxEdrJNB8Yk28SKxPLtAhfCbBInA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0", + "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/visitor-keys": "5.15.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -271,15 +271,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.14.0.tgz", - "integrity": "sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.15.0.tgz", + "integrity": "sha512-081rWu2IPKOgTOhHUk/QfxuFog8m4wxW43sXNOMSCdh578tGJ1PAaWPsj42LOa7pguh173tNlMigsbrHvh/mtA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", + "@typescript-eslint/scope-manager": "5.15.0", + "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/typescript-estree": "5.15.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -295,12 +295,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz", - "integrity": "sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.15.0.tgz", + "integrity": "sha512-+vX5FKtgvyHbmIJdxMJ2jKm9z2BIlXJiuewI8dsDYMp5LzPUcuTT78Ya5iwvQg3VqSVdmxyM8Anj1Jeq7733ZQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.14.0", + "@typescript-eslint/types": "5.15.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -1242,15 +1242,18 @@ } }, "node_modules/prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.0.tgz", + "integrity": "sha512-m2FgJibYrBGGgQXNzfd0PuDGShJgRavjUoRCw1mZERIWVSXF0iLzLm+aOqTAbLnC3n6JzUhAA8uZnFVghHJ86A==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/prettier-linter-helpers": { @@ -1681,14 +1684,14 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", - "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.15.0.tgz", + "integrity": "sha512-u6Db5JfF0Esn3tiAKELvoU5TpXVSkOpZ78cEGn/wXtT2RVqs2vkt4ge6N8cRCyw7YVKhmmLDbwI2pg92mlv7cA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/type-utils": "5.14.0", - "@typescript-eslint/utils": "5.14.0", + "@typescript-eslint/scope-manager": "5.15.0", + "@typescript-eslint/type-utils": "5.15.0", + "@typescript-eslint/utils": "5.15.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -1698,52 +1701,52 @@ } }, "@typescript-eslint/parser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", - "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.15.0.tgz", + "integrity": "sha512-NGAYP/+RDM2sVfmKiKOCgJYPstAO40vPAgACoWPO/+yoYKSgAXIFaBKsV8P0Cc7fwKgvj27SjRNX4L7f4/jCKQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", + "@typescript-eslint/scope-manager": "5.15.0", + "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/typescript-estree": "5.15.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz", - "integrity": "sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.15.0.tgz", + "integrity": "sha512-EFiZcSKrHh4kWk0pZaa+YNJosvKE50EnmN4IfgjkA3bTHElPtYcd2U37QQkNTqwMCS7LXeDeZzEqnsOH8chjSg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0" + "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/visitor-keys": "5.15.0" } }, "@typescript-eslint/type-utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz", - "integrity": "sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.15.0.tgz", + "integrity": "sha512-KGeDoEQ7gHieLydujGEFLyLofipe9PIzfvA/41urz4hv+xVxPEbmMQonKSynZ0Ks2xDhJQ4VYjB3DnRiywvKDA==", "dev": true, "requires": { - "@typescript-eslint/utils": "5.14.0", + "@typescript-eslint/utils": "5.15.0", "debug": "^4.3.2", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.14.0.tgz", - "integrity": "sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.15.0.tgz", + "integrity": "sha512-yEiTN4MDy23vvsIksrShjNwQl2vl6kJeG9YkVJXjXZnkJElzVK8nfPsWKYxcsGWG8GhurYXP4/KGj3aZAxbeOA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz", - "integrity": "sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.15.0.tgz", + "integrity": "sha512-Hb0e3dGc35b75xLzixM3cSbG1sSbrTBQDfIScqdyvrfJZVEi4XWAT+UL/HMxEdrJNB8Yk28SKxPLtAhfCbBInA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0", + "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/visitor-keys": "5.15.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -1752,26 +1755,26 @@ } }, "@typescript-eslint/utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.14.0.tgz", - "integrity": "sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.15.0.tgz", + "integrity": "sha512-081rWu2IPKOgTOhHUk/QfxuFog8m4wxW43sXNOMSCdh578tGJ1PAaWPsj42LOa7pguh173tNlMigsbrHvh/mtA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", + "@typescript-eslint/scope-manager": "5.15.0", + "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/typescript-estree": "5.15.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz", - "integrity": "sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.15.0.tgz", + "integrity": "sha512-+vX5FKtgvyHbmIJdxMJ2jKm9z2BIlXJiuewI8dsDYMp5LzPUcuTT78Ya5iwvQg3VqSVdmxyM8Anj1Jeq7733ZQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.14.0", + "@typescript-eslint/types": "5.15.0", "eslint-visitor-keys": "^3.0.0" } }, @@ -2477,9 +2480,9 @@ "dev": true }, "prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.0.tgz", + "integrity": "sha512-m2FgJibYrBGGgQXNzfd0PuDGShJgRavjUoRCw1mZERIWVSXF0iLzLm+aOqTAbLnC3n6JzUhAA8uZnFVghHJ86A==", "dev": true }, "prettier-linter-helpers": { diff --git a/abstractions/typescript/package.json b/abstractions/typescript/package.json index 6efdbce40d..c5190784b9 100644 --- a/abstractions/typescript/package.json +++ b/abstractions/typescript/package.json @@ -2,74 +2,51 @@ "name": "@microsoft/kiota-abstractions", "version": "1.0.31", "description": "Core abstractions for kiota generated libraries in TypeScript and JavaScript", + "main": "dist/cjs/index.js", + "module": "dist/es/index.js", + "types": "dist/cjs/index.d.ts", + "scripts": { + "build": "npm run build:cjs && npm run build:esm", + "build:cjs": "tsc -p tsconfig.cjs.json", + "build:esm": "tsc -p tsconfig.es.json", + "test": "echo \"Error: no test specified\" && exit 1", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", + "clean": "rm -r ./dist" + }, + "repository": "git://github.com/microsoft/kiota.git", "keywords": [ "kiota", "openAPI", "Microsoft", "Graph" ], - "homepage": "https://github.com/microsoft/kiota#readme", + "author": "Microsoft", + "license": "MIT", "bugs": { "url": "https://github.com/microsoft/kiota/issues" }, - "repository": "git://github.com/microsoft/kiota.git", - "license": "MIT", - "author": "Microsoft", - "main": "dist/cjs/src/index.js", - "module": "dist/es/src/index.js", - "types": "dist/cjs/src/index.d.ts", - "browser": { - "dist/es/src/utils/index.js": "dist/es/src/utils/browser/index.js" - }, - "scripts": { - "build": "npm run build:cjs && npm run build:es", - "build:cjs": "tsc -p tsconfig.cjs.json", - "build:es": "tsc -p tsconfig.es.json", - "clean": "rm -r ./dist", - "karma": "npm run rollup && karma start --single-run --browsers ChromeHeadless karma.conf.js", - "lint": "eslint . --ext .ts", - "lint:fix": "eslint . --ext .ts --fix", - "rollup": "rollup -c", - "test": "npm run test:cjs && npm run test:es", - "test:cjs": "npm run build:cjs && mocha 'dist/cjs/test/node/**/*.js'", - "test:es": " npm run build:es && mocha 'dist/es/test/node/**/*.js' --require esm" - }, - "dependencies": { - "tinyduration": "^3.2.2", - "tslib": "^2.3.1", - "uri-template-lite": "^22.1.0", - "uuid": "^8.3.2" - }, + "homepage": "https://github.com/microsoft/kiota#readme", "devDependencies": { "@types/node": "^17.0.21", "@types/uri-template-lite": "^19.12.1", - "@rollup/plugin-commonjs": "^21.0.0", - "@rollup/plugin-node-resolve": "^13.0.5", - "@types/chai": "^4.2.22", - "@types/mocha": "^9.0.0", - "@types/sinon": "^10.0.4", "@types/uuid": "^8.3.4", "typescript": "^4.6.2", - "@typescript-eslint/eslint-plugin": "^5.14.0", - "@typescript-eslint/parser": "^5.14.0", + "@typescript-eslint/eslint-plugin": "^5.15.0", + "@typescript-eslint/parser": "^5.15.0", "eslint": "^8.11.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-simple-import-sort": "^7.0.0", - "esm": "^3.2.25", - "karma": "^6.3.4", - "karma-chai": "^0.1.0", - "chai": "^4.3.4", - "karma-chrome-launcher": "^3.1.0", - "karma-firefox-launcher": "^2.1.1", - "karma-mocha": "^2.0.1", - "karma-typescript": "^5.5.2", - "mocha": "^8.4.0", - "prettier": "^2.4.1", - "rollup": "^2.58.0", - "rollup-plugin-terser": "^7.0.2" + "prettier": "^2.6.0" }, "publishConfig": { "registry": "https://npm.pkg.github.com" + }, + "dependencies": { + "tinyduration": "^3.2.2", + "tslib": "^2.3.1", + "uri-template-lite": "^22.1.0", + "uuid": "^8.3.2" } -} \ No newline at end of file +} diff --git a/abstractions/typescript/src/requestInformation.ts b/abstractions/typescript/src/requestInformation.ts index 694d6d2511..bd84db33ca 100644 --- a/abstractions/typescript/src/requestInformation.ts +++ b/abstractions/typescript/src/requestInformation.ts @@ -7,132 +7,131 @@ import { Parsable } from "./serialization"; /** This class represents an abstract HTTP request. */ export class RequestInformation { - /** The URI of the request. */ - private uri?: string; - /** The path parameters for the request. */ - public pathParameters: Record = {}; - /** The URL template for the request */ - public urlTemplate?: string; - /** Gets the URL of the request */ - public get URL(): string { - const rawUrl = this.pathParameters[ - RequestInformation.raw_url_key - ] as string; - if (this.uri) { - return this.uri; - } else if (rawUrl) { - this.URL = rawUrl; - return rawUrl; - } else if (!this.queryParameters) { - throw new Error("queryParameters cannot be undefined"); - } else if (!this.pathParameters) { - throw new Error("pathParameters cannot be undefined"); - } else if (!this.urlTemplate) { - throw new Error("urlTemplate cannot be undefined"); - } else { - const template = new urlTpl.URI.Template(this.urlTemplate); - const data = {} as { [key: string]: unknown }; - for (const key in this.queryParameters) { - if (this.queryParameters[key]) { - data[key] = this.queryParameters[key]; - } - } - for (const key in this.pathParameters) { - if (this.pathParameters[key]) { - data[key] = this.pathParameters[key]; - } - } - return template.expand(data); + /** The URI of the request. */ + private uri?: string; + /** The path parameters for the request. */ + public pathParameters: Record = {}; + /** The URL template for the request */ + public urlTemplate?: string; + /** Gets the URL of the request */ + public get URL(): string { + const rawUrl = this.pathParameters[ + RequestInformation.raw_url_key + ] as string; + if (this.uri) { + return this.uri; + } else if (rawUrl) { + this.URL = rawUrl; + return rawUrl; + } else if (!this.queryParameters) { + throw new Error("queryParameters cannot be undefined"); + } else if (!this.pathParameters) { + throw new Error("pathParameters cannot be undefined"); + } else if (!this.urlTemplate) { + throw new Error("urlTemplate cannot be undefined"); + } else { + const template = new urlTpl.URI.Template(this.urlTemplate); + const data = {} as { [key: string]: unknown }; + for (const key in this.queryParameters) { + if (this.queryParameters[key]) { + data[key] = this.queryParameters[key]; } + } + for (const key in this.pathParameters) { + if (this.pathParameters[key]) { + data[key] = this.pathParameters[key]; + } + } + return template.expand(data); } - /** Sets the URL of the request */ - public set URL(url: string) { - if (!url) throw new Error("URL cannot be undefined"); - this.uri = url; - this.queryParameters = {}; - this.pathParameters = {}; - } - public static raw_url_key = "request-raw-url"; - /** The HTTP method for the request */ - public httpMethod?: HttpMethod; - /** The Request Body. */ - public content?: ArrayBuffer; - /** The Query Parameters of the request. */ - public queryParameters: Record< - string, - string | number | boolean | undefined - > = {}; //TODO: case insensitive - /** The Request Headers. */ - public headers: Record = {}; //TODO: case insensitive - private _requestOptions: Record = {}; //TODO: case insensitive - /** Gets the request options for the request. */ - public getRequestOptions() { - return this._requestOptions; + } + /** Sets the URL of the request */ + public set URL(url: string) { + if (!url) throw new Error("URL cannot be undefined"); + this.uri = url; + this.queryParameters = {}; + this.pathParameters = {}; + } + public static raw_url_key = "request-raw-url"; + /** The HTTP method for the request */ + public httpMethod?: HttpMethod; + /** The Request Body. */ + public content?: ArrayBuffer; + /** The Query Parameters of the request. */ + public queryParameters: Record< + string, + string | number | boolean | undefined + > = {}; //TODO: case insensitive + /** The Request Headers. */ + public headers: Record = {}; //TODO: case insensitive + private _requestOptions: Record = {}; //TODO: case insensitive + /** Gets the request options for the request. */ + public getRequestOptions() { + return this._requestOptions; + } + public addRequestOptions(...options: RequestOption[]) { + if (!options || options.length === 0) return; + options.forEach((option) => { + this._requestOptions[option.getKey()] = option; + }); + } + /** Removes the request options for the request. */ + public removeRequestOptions(...options: RequestOption[]) { + if (!options || options.length === 0) return; + options.forEach((option) => { + delete this._requestOptions[option.getKey()]; + }); + } + private static binaryContentType = "application/octet-stream"; + private static contentTypeHeader = "Content-Type"; + /** + * Sets the request body from a model with the specified content type. + * @param values the models. + * @param contentType the content type. + * @param requestAdapter The adapter service to get the serialization writer from. + * @typeParam T the model type. + */ + public setContentFromParsable = ( + requestAdapter?: RequestAdapter | undefined, + contentType?: string | undefined, + ...values: T[] + ): void => { + if (!requestAdapter) throw new Error("httpCore cannot be undefined"); + if (!contentType) throw new Error("contentType cannot be undefined"); + if (!values || values.length === 0) { + throw new Error("values cannot be undefined or empty"); } - public addRequestOptions(...options: RequestOption[]) { - if (!options || options.length === 0) return; - options.forEach((option) => { - this._requestOptions[option.getKey()] = option; - }); + const writer = requestAdapter + .getSerializationWriterFactory() + .getSerializationWriter(contentType); + if (!this.headers) { + this.headers = {}; } - /** Removes the request options for the request. */ - public removeRequestOptions(...options: RequestOption[]) { - if (!options || options.length === 0) return; - options.forEach((option) => { - delete this._requestOptions[option.getKey()]; - }); + this.headers[RequestInformation.contentTypeHeader] = contentType; + if (values.length === 1) { + writer.writeObjectValue(undefined, values[0]); + } else { + writer.writeCollectionOfObjectValues(undefined, values); } - private static binaryContentType = "application/octet-stream"; - private static contentTypeHeader = "Content-Type"; - /** - * Sets the request body from a model with the specified content type. - * @param values the models. - * @param contentType the content type. - * @param requestAdapter The adapter service to get the serialization writer from. - * @typeParam T the model type. - */ - public setContentFromParsable = ( - requestAdapter?: RequestAdapter | undefined, - contentType?: string | undefined, - ...values: T[] - ): void => { - if (!requestAdapter) throw new Error("httpCore cannot be undefined"); - if (!contentType) throw new Error("contentType cannot be undefined"); - if (!values || values.length === 0) { - throw new Error("values cannot be undefined or empty"); - } - - const writer = requestAdapter - .getSerializationWriterFactory() - .getSerializationWriter(contentType); - if (!this.headers) { - this.headers = {}; - } - this.headers[RequestInformation.contentTypeHeader] = contentType; - if (values.length === 1) { - writer.writeObjectValue(undefined, values[0]); - } else { - writer.writeCollectionOfObjectValues(undefined, values); - } - this.content = writer.getSerializedContent(); - }; - /** - * Sets the request body to be a binary stream. - * @param value the binary stream - */ - public setStreamContent = (value: ArrayBuffer): void => { - this.headers[RequestInformation.contentTypeHeader] = - RequestInformation.binaryContentType; - this.content = value; - }; - /** - * Sets the query string parameters from a raw object. - * @param parameters the parameters. - */ - public setQueryStringParametersFromRawObject = (q: object): void => { - Object.entries(q).forEach(([k, v]) => { - this.queryParameters[k] = v; - }); - }; + this.content = writer.getSerializedContent(); + }; + /** + * Sets the request body to be a binary stream. + * @param value the binary stream + */ + public setStreamContent = (value: ArrayBuffer): void => { + this.headers[RequestInformation.contentTypeHeader] = + RequestInformation.binaryContentType; + this.content = value; + }; + /** + * Sets the query string parameters from a raw object. + * @param parameters the parameters. + */ + public setQueryStringParametersFromRawObject = (q: object): void => { + Object.entries(q).forEach(([k, v]) => { + this.queryParameters[k] = v; + }); + }; } diff --git a/abstractions/typescript/src/requestOption.ts b/abstractions/typescript/src/requestOption.ts index 0507f72677..510de9ca9c 100644 --- a/abstractions/typescript/src/requestOption.ts +++ b/abstractions/typescript/src/requestOption.ts @@ -1,4 +1,5 @@ /** Represents a request option. */ export interface RequestOption { - getKey(): string; + /** Gets the option key for when adding it to a request. Must be unique. */ + getKey(): string; } diff --git a/abstractions/typescript/test/browser/index.ts b/abstractions/typescript/test/browser/index.ts deleted file mode 100644 index 6e14e3e798..0000000000 --- a/abstractions/typescript/test/browser/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -export * from "./requestInformation"; diff --git a/abstractions/typescript/test/browser/requestInformation.ts b/abstractions/typescript/test/browser/requestInformation.ts deleted file mode 100644 index a5a9f61d8b..0000000000 --- a/abstractions/typescript/test/browser/requestInformation.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -import { assert } from "chai"; - -import { RequestInformation } from "../../src/"; - -describe("RequestInformation", () => { - it("Should set request information uri", () => { - const requestInformation = new RequestInformation(); - const browserReadableStream = new ReadableStream(); - requestInformation.setStreamContent(browserReadableStream); - - assert.equal(requestInformation["content"], browserReadableStream); - }); -}); diff --git a/abstractions/typescript/test/node/requestInformation.ts b/abstractions/typescript/test/node/requestInformation.ts deleted file mode 100644 index 788dc0bfb2..0000000000 --- a/abstractions/typescript/test/node/requestInformation.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -import { assert } from "chai"; -import { Readable } from "stream"; -import { URL } from "url"; - -import { RequestInformation } from "../../src/"; - -describe("RequestInformation", () => { - it("Should set request information uri", () => { - const requestInformation = new RequestInformation(); - const nodeReadableStream = new Readable(); - requestInformation.setStreamContent(nodeReadableStream); - - assert.equal(requestInformation["content"], nodeReadableStream); - }); - - it("Should set request information uri", () => { - const requestInformation = new RequestInformation(); - const currentPath = "CURRENT_PATH"; - const pathSegment = "https://base"; - requestInformation.URL = new URL(currentPath, pathSegment); - assert.isNotNull(URL); - assert.deepEqual(requestInformation.URL, new URL(currentPath, pathSegment)); - }); -}); diff --git a/abstractions/typescript/tsconfig.base.json b/abstractions/typescript/tsconfig.base.json index 877773054b..bd42b7f248 100644 --- a/abstractions/typescript/tsconfig.base.json +++ b/abstractions/typescript/tsconfig.base.json @@ -11,4 +11,4 @@ "forceConsistentCasingInFileNames": true, "declaration": true } -} +} \ No newline at end of file diff --git a/abstractions/typescript/tsconfig.es.json b/abstractions/typescript/tsconfig.es.json index f21fce86d0..63b42d5e00 100644 --- a/abstractions/typescript/tsconfig.es.json +++ b/abstractions/typescript/tsconfig.es.json @@ -7,4 +7,4 @@ }, "exclude": ["node_modules", "dist"], "include": ["./src/**/*.ts", "./test/**/*.ts"] -} +} \ No newline at end of file From e34194d2188841dc88440653ae515a187e937381 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Fri, 18 Mar 2022 02:08:57 -0700 Subject: [PATCH 29/34] Apply suggestions from code review Co-authored-by: Vincent Biret --- .../fetch/src/middlewares/options/RetryHandlerOptions.ts | 2 +- http/typescript/fetch/src/utils/headersUtil.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts index f84803395f..fa03b3b43e 100644 --- a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts +++ b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts @@ -90,7 +90,7 @@ export class RetryHandlerOptions implements RequestOption { * @param {ShouldRetry} [shouldRetry = RetryHandlerOptions.DEFAULT_SHOULD_RETRY] - The shouldRetry callback function * @returns An instance of RetryHandlerOptions */ - public constructor(delay: number = RetryHandlerOptions.DEFAULT_DELAY, maxRetries: number = RetryHandlerOptions.DEFAULT_MAX_RETRIES, shouldRetry: ShouldRetry = RetryHandlerOptions.defaultShouldRetry) { + public constructor(private delay: number = RetryHandlerOptions.DEFAULT_DELAY, private maxRetries: number = RetryHandlerOptions.DEFAULT_MAX_RETRIES, private shouldRetry: ShouldRetry = RetryHandlerOptions.defaultShouldRetry) { if (delay > RetryHandlerOptions.MAX_DELAY && maxRetries > RetryHandlerOptions.MAX_MAX_RETRIES) { const error = new Error(`Delay and MaxRetries should not be more than ${RetryHandlerOptions.MAX_DELAY} and ${RetryHandlerOptions.MAX_MAX_RETRIES}`); error.name = "MaxLimitExceeded"; diff --git a/http/typescript/fetch/src/utils/headersUtil.ts b/http/typescript/fetch/src/utils/headersUtil.ts index 547fb1dd25..15278332d2 100644 --- a/http/typescript/fetch/src/utils/headersUtil.ts +++ b/http/typescript/fetch/src/utils/headersUtil.ts @@ -20,7 +20,7 @@ import { FetchRequestInit } from "./fetchDefinitions"; * @returns A header value for the given key from the request */ export const getRequestHeader = (options: FetchRequestInit | undefined, key: string): string | undefined => { - if (typeof options !== "undefined" && options.headers !== undefined) { + if (options && options.headers) { return options.headers[key]; } return undefined; @@ -36,7 +36,7 @@ export const getRequestHeader = (options: FetchRequestInit | undefined, key: str * @returns Nothing */ export const setRequestHeader = (options: FetchRequestInit | undefined, key: string, value: string): void => { - if (typeof options !== "undefined") { + if (options) { if (!options.headers) { options.headers = {}; } @@ -54,11 +54,11 @@ export const setRequestHeader = (options: FetchRequestInit | undefined, key: str * @returns Nothing */ export const appendRequestHeader = (options: FetchRequestInit | undefined, key: string, value: string): void => { - if (typeof options !== "undefined") { + if (options) { if (!options.headers) { options.headers = {}; } - if (options.headers[key] === undefined) { + if (!options.headers[key]) { options.headers[key] = value; } else { options.headers[key] += `, ${value}`; From 3f5b4008491f9b75b58a0cb3507a5e8e89b82134 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Fri, 18 Mar 2022 02:17:49 -0700 Subject: [PATCH 30/34] resetting abstractions --- abstractions/typescript/.prettierrc | 13 -- .../typescript/docs/design/isomorphic.md | 148 ------------------ .../typescript/docs/design/testing.md | 25 --- abstractions/typescript/karma.conf.js | 13 -- abstractions/typescript/rollup.config.js | 29 ---- http/typescript/fetch/package.json | 2 - .../options/RetryHandlerOptions.ts | 20 +-- 7 files changed, 1 insertion(+), 249 deletions(-) delete mode 100644 abstractions/typescript/.prettierrc delete mode 100644 abstractions/typescript/docs/design/isomorphic.md delete mode 100644 abstractions/typescript/docs/design/testing.md delete mode 100644 abstractions/typescript/karma.conf.js delete mode 100644 abstractions/typescript/rollup.config.js diff --git a/abstractions/typescript/.prettierrc b/abstractions/typescript/.prettierrc deleted file mode 100644 index 87a872077f..0000000000 --- a/abstractions/typescript/.prettierrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "arrowParens": "always", - "bracketSpacing": true, - "jsxBracketSameLine": true, - "jsxSingleQuote": false, - "printWidth": 5000, - "proseWrap": "never", - "semi": true, - "singleQuote": false, - "tabWidth": 4, - "trailingComma": "all", - "useTabs": true -} diff --git a/abstractions/typescript/docs/design/isomorphic.md b/abstractions/typescript/docs/design/isomorphic.md deleted file mode 100644 index b2e351cb04..0000000000 --- a/abstractions/typescript/docs/design/isomorphic.md +++ /dev/null @@ -1,148 +0,0 @@ -## Terms - - -- bundler - Module bundlers are tools frontend developers used to bundle JavaScript modules into a single JavaScript files that can be executed in the browser. - -- rollup - rollup.js is the module bundler that the JS SDK uses. - -- package.json fields - - - - main - The main field is a module ID that is the primary entry point to your program. Points to the CJS modules. - - - module - The module field is not an official npm feature but a common convention among bundlers to designate how to import an ESM version of a library. Points to the ES modules. - - - browser - If the module is meant to be used client-side, the browser field should be used instead of the main field. - -## Isomorphic library -The Kiota libraries are isomorphic, that is, this library runs in node and browser. - -To achieve the isomorphism, the library is set up in the following ways: - - TypeScript Source Code - / \ - Transpiles into JavaScript - 'dist' folder - / \ - CJS module ES modules -1. The library supports `CommonJS` modules and `ES` modules.`CommonJS` formats are popular in the node enviroment. - `main` - `dist/es/src/index.js` - `module` - `dist/es/src/index.js` - -2. Entry point for the browser - `dist/es/src/browser/index.js`. - -Often times the library will have code which is different for the browser and node environments. -Examples: -- Browsers use a global `fetch` defined in the `DOM` while node relies on an external library such as `node-fetch` or `undici`. -- `ReadableStream` are different interfaces in node and browser. - -To manage such differences, separate files are maintained when the code can be different for node or browser. - -For example: -- The `DefaultFetchHandler` uses `node-fetch` for node and the `dom` fetch for browser. -- Map this difference as follows: - -```json -"browser": { - "./dist/es/src/index.js": "./dist/es/src/browser/index.js", - "./dist/es/src/utils/utils.js": "./dist/es/src/utils/browser/utils.js", - "./dist/es/src/middlewares/defaultFetchHandler.js": "./dist/es/src/middlewares/browser/defaultFetchHandler.js", - "./dist/es/src/middlewares/middlewareFactory.js": "./dist/es/src/middlewares/browser/middlewareFactory.js", - "./dist/cjs/src/middlewares/middlewareFactory.js": "./dist/es/src/middlewares/browser/middlewareFactory.js" -} -``` - -The applications or library using `kiota-http-fetch library` will have bundlers that use this `package.json browser` mapping if the target environment is set to browser. - - -## Use of `lib:dom` and `@types/node` - -Typescript isomorphic libraries often rely on the DOM definitions and `@types/node` as compile-time dependencies. - -Example 1: -```json -// tsconfig.json in the isomorphic library - -{ - "compileroptions": { - "lib":"dom" - } -} -``` -Issues with example 1: - - This configuration makes DOM definitions globally available as a compile time dependency during development and it is not shipped with the library. However, when a node only application uses the isomorphic library, the DOM definitions will not be available and this causes Typescript compile time errors. - - [Issue example: Removed dom lib dependency](https://github.com/prisma-labs/graphql-request/issues/26) - - [PR example: azure core-http](https://github.com/Azure/azure-sdk-for-js/pull/7500) - - -Example 2: -``` -// example of use of @type/nodes -const readableStream : NodeJS.ReadableStream - -or - -global ambient declarations at the top of the file -/// -/// -``` - -Issues with example 2: - - When transpiling a direct reference to `@types/node`, such as `NodeJS.ReadableStream`, the transpiled code contains a global ambient declaration `/// `. The global ambient declarations leak the typings to the user code. - - Example of issues: - - [Removes reference to node typings and stubs dom interfaces](https://github.com/aws/aws-sdk-js/pull/1228) - - [Typings polutes global space with DOM types ](https://github.com/node-fetch/node-fetch/issues/1285) - - -Other issues: -Typescript is yet capture some of complete dynamic support that JavaScript provides. An example of this is [Node browser resolution strategy](https://github.com/microsoft/TypeScript/issues/7753) since today the compiler cannot type check based on the environment. - -### Solution to this: - -Approaches for this problem as observed in other isomorphic libraries: -- A good reference to a very optimal solution is here: [PR example: azure core-http](https://github.com/Azure/azure-sdk-for-js/pull/7500) -- A common approch that is taken is to create empty interfaces or shims. Then, if the user includes dom or the required definitions, the interfaces are merged. Reference [Removes reference to node typings and stubs dom interfaces](https://github.com/aws/aws-sdk-js/pull/1228) - -##### DOM shims and Fetch definitions -The `kiota-http-fetch library` relies on the DOM definitions such as `RequestInit`, `RequestInfo`. - -1. Maintain and export `dom.shim.d.ts` containing empty interfaces. This way the user can compile their code with the library without having a DOM library. - -```typescript -interface Request { } -interface RequestInit { } -interface Response { } -interface Headers { } -interface ReadableStream { } -interface fetch { } -``` - -2. The library code relies on interface definitions and interface properties such as `Request.body`, `Request.headers`. Introduced the `FetchDefinitions.ts` to achieve this. `FetchDefinitions.ts` contains the following intersection types: -- `FetchRequestInit` -- `FetchHeadersInit` -- `FetchResponse` - -These types are redefined so that definitions are available and can be set isomorphically. - -For example: - -``` typescript -export type FetchRequestInit = Omit & { - /** - * Request's body - * Expected type in case of dom - ReadableStream | XMLHttpRequestBodyInit|null - * Expected type in case of node-fetch - | Blob | Buffer | URLSearchParams | NodeJS.ReadableStream | string|null - */ - body?: unknown; -} -```` - -##### ReadableStreamContent - -- `ReadableStream` are different interfaces in node and browser. -- Introducing `ReadableStreamContent`, empty interface expecting the type of NodeJS.ReadableStream or dom ReadableStream - * Node example: import {Readable} from "stream"; const readableStream = new Readable(); - * Browser example: const readableStream = new ReadableStream(); - -Alternatives considered to manage this difference: -- `content - NodeJS.ReadableStream | ReadableStream`. This transpiles to use the global ambient declaration of `type = nodes` which causes the global leaking issues discussed above. -- `content - ReadableStream` and maintaining an empty interface with the same name, that is, ReadableStream causes a mismatch error if content is set to NodeJS.Readable and DOM definitions are present at the same time. -- Due to the lack of `node browser resolution strategy` in the typings, we cannot maintain separate node and browser typings files for `ReadableStream` interface. diff --git a/abstractions/typescript/docs/design/testing.md b/abstractions/typescript/docs/design/testing.md deleted file mode 100644 index 819b20d7e3..0000000000 --- a/abstractions/typescript/docs/design/testing.md +++ /dev/null @@ -1,25 +0,0 @@ -## Testing for node and browser - -### Testing for node - -- Tests targeting the node environment are in `/test/node` and `/test/common` folder and use `mocha` and `chai` JS libraries. -- Test formats: - - script to test `CommonJS` modules: `npm run test:cjs` - - script to test `ES` modules: `npm run test:es` -- Examples of node environment specific tests: Test `DefaultFetchHandler` using `node-fetch` library. - - -### Testing for browser - - -- Tests targeting the node environment are in `/test/browser` and `/test/common` folder and use `mocha` and `chai` JS libraries. -- To test for browsers, the tests and the source code are bundled using `rollup` and the bundled file is tested using `karma`. -- Test formats: - - script to test: `npm run karma`. -- Examples of node environment specific tests: Test `DefaultFetchHandler` using dom - `fetch`. - ---- -**NOTE** - -The bundled file considers the `package.json browser spec` during the rollup process. The entry point of the source code for the tests will be `src/browser/index.js` and the `package.json browser spec` file mapping should work. ---- diff --git a/abstractions/typescript/karma.conf.js b/abstractions/typescript/karma.conf.js deleted file mode 100644 index ed70e00538..0000000000 --- a/abstractions/typescript/karma.conf.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = function(config) { - config.set({ - frameworks: ["mocha", "chai", "karma-typescript"], - files: [{ pattern: "dist/es/test/index.js", type: "module" }], - preprocessors: { - "**/*.ts": ["karma-typescript"], - }, - karmaTypescriptConfig: { - tsconfig: "./tsconfig.cjs.json", - }, - browsers: ["ChromeHeadless"], - }); -}; \ No newline at end of file diff --git a/abstractions/typescript/rollup.config.js b/abstractions/typescript/rollup.config.js deleted file mode 100644 index b33c9c674d..0000000000 --- a/abstractions/typescript/rollup.config.js +++ /dev/null @@ -1,29 +0,0 @@ - -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -import resolve from "@rollup/plugin-node-resolve"; -import commonjs from "@rollup/plugin-commonjs"; - -const config = [{ - input: ["dist/es/test/browser/index.js"], - output: { - file: "dist/es/test/index.js", - format: "esm", - name: "MicrosoftKiotaAbstractionsTest", - }, - plugins: [ - commonjs({ include: ["node_modules/**"] }), - resolve({ - browser: true, - preferBuiltins: false, - - }) - ], -}]; - -export default config; \ No newline at end of file diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index 38b1d8253d..ee6befb6f4 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -48,7 +48,6 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@microsoft/kiota-abstractions": "^1.0.30", "@rollup/plugin-commonjs": "^21.0.0", "@rollup/plugin-node-resolve": "^13.0.5", "@types/chai": "^4.2.22", @@ -59,7 +58,6 @@ "@typescript-eslint/eslint-plugin": "^5.14.0", "@typescript-eslint/parser": "^5.14.0", "chai": "^4.3.4", - "cross-fetch": "^3.1.5", "eslint": "^8.11.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.0.0", diff --git a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts index fa03b3b43e..3cd024c342 100644 --- a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts +++ b/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts @@ -57,24 +57,6 @@ export class RetryHandlerOptions implements RequestOption { */ private static MAX_MAX_RETRIES = 10; - /** - * @public - * A member holding delay value in seconds - */ - public delay: number; - - /** - * @public - * A member holding maxRetries value - */ - public maxRetries: number; - - /** - * @public - * A member holding shouldRetry callback - */ - public shouldRetry: ShouldRetry; - /** * @private * A member holding default shouldRetry callback @@ -90,7 +72,7 @@ export class RetryHandlerOptions implements RequestOption { * @param {ShouldRetry} [shouldRetry = RetryHandlerOptions.DEFAULT_SHOULD_RETRY] - The shouldRetry callback function * @returns An instance of RetryHandlerOptions */ - public constructor(private delay: number = RetryHandlerOptions.DEFAULT_DELAY, private maxRetries: number = RetryHandlerOptions.DEFAULT_MAX_RETRIES, private shouldRetry: ShouldRetry = RetryHandlerOptions.defaultShouldRetry) { + public constructor(public delay: number = RetryHandlerOptions.DEFAULT_DELAY, public maxRetries: number = RetryHandlerOptions.DEFAULT_MAX_RETRIES, public shouldRetry: ShouldRetry = RetryHandlerOptions.defaultShouldRetry) { if (delay > RetryHandlerOptions.MAX_DELAY && maxRetries > RetryHandlerOptions.MAX_MAX_RETRIES) { const error = new Error(`Delay and MaxRetries should not be more than ${RetryHandlerOptions.MAX_DELAY} and ${RetryHandlerOptions.MAX_MAX_RETRIES}`); error.name = "MaxLimitExceeded"; From aead7b0f41eabeca96c6f62fe447a2632f58d892 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Sun, 20 Mar 2022 23:51:22 -0700 Subject: [PATCH 31/34] update version, use set, collapse function --- http/typescript/fetch/.vscode/launch.json | 20 ------------ http/typescript/fetch/dom.shim.d.ts | 22 +++++++++++++ http/typescript/fetch/package-lock.json | 5 ++- http/typescript/fetch/package.json | 6 ++-- http/typescript/fetch/src/browser/index.ts | 8 +++-- http/typescript/fetch/src/dom.shim.d.ts | 14 --------- http/typescript/fetch/src/httpClient.ts | 31 +++++++------------ http/typescript/fetch/src/index.ts | 3 +- .../options/telemetryHandlerOptions.ts | 6 ++++ .../fetch/src/middlewares/retryHandler.ts | 6 ++-- .../fetch/src/middlewares/telemetryHandler.ts | 6 ++++ 11 files changed, 60 insertions(+), 67 deletions(-) delete mode 100644 http/typescript/fetch/.vscode/launch.json create mode 100644 http/typescript/fetch/dom.shim.d.ts delete mode 100644 http/typescript/fetch/src/dom.shim.d.ts diff --git a/http/typescript/fetch/.vscode/launch.json b/http/typescript/fetch/.vscode/launch.json deleted file mode 100644 index 6b7f670222..0000000000 --- a/http/typescript/fetch/.vscode/launch.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [{ - "args": [ - "${workspaceFolder}/dist/cjs/test/node/*.js" - ], - "internalConsoleOptions": "openOnSessionStart", - "name": "Mocha Tests", - "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", - "request": "launch", - "skipFiles": [ - "/**" - ], - "type": "pwa-node" - } - ] -} \ No newline at end of file diff --git a/http/typescript/fetch/dom.shim.d.ts b/http/typescript/fetch/dom.shim.d.ts new file mode 100644 index 0000000000..214b77dd8e --- /dev/null +++ b/http/typescript/fetch/dom.shim.d.ts @@ -0,0 +1,22 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + + +/** + * Maintain and export `dom.shim.d.ts` containing empty interfaces. This way the user can compile their code with the library without having a DOM library + * Read more {@link docs/design/isomorphic.md} + * This file should be shipped in the package + * */ + + +interface Request {} +interface RequestInit {} +interface Response {} +interface Headers {} +interface ReadableStream {} +interface fetch {} +interface Blob {} diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index e3a25474af..8ac4075219 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -1,12 +1,12 @@ { "name": "@microsoft/kiota-http-fetchlibrary", - "version": "1.0.17", + "version": "1.0.18", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@microsoft/kiota-http-fetchlibrary", - "version": "1.0.17", + "version": "1.0.18", "license": "MIT", "dependencies": { "@microsoft/kiota-abstractions": "1.0.31", @@ -40,7 +40,6 @@ "rollup": "^2.58.0", "rollup-plugin-terser": "^7.0.2", "sinon": "^11.1.2", - "tslib": "^2.3.1", "typescript": "^4.6.2" } }, diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index f14afe13a4..3485951b76 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/kiota-http-fetchlibrary", - "version": "1.0.17", + "version": "1.0.18", "description": "Kiota request adapter implementation with fetch", "keywords": [ "Kiota", @@ -26,7 +26,8 @@ "types": "dist/cjs/src/index.d.ts", "files": [ "dist/", - "src/" + "src/", + "dom.shim.d.ts" ], "scripts": { "build": "npm run build:cjs && npm run build:es", @@ -74,7 +75,6 @@ "rollup": "^2.58.0", "rollup-plugin-terser": "^7.0.2", "sinon": "^11.1.2", - "tslib": "^2.3.1", "typescript": "^4.6.2" }, "publishConfig": { diff --git a/http/typescript/fetch/src/browser/index.ts b/http/typescript/fetch/src/browser/index.ts index 5afc4061b5..6a6d52e77e 100644 --- a/http/typescript/fetch/src/browser/index.ts +++ b/http/typescript/fetch/src/browser/index.ts @@ -6,7 +6,7 @@ */ /* eslint-disable @typescript-eslint/triple-slash-reference*/ -/// +/// export * from "../fetchRequestAdapter"; export * from "../httpClient"; @@ -14,8 +14,10 @@ export * from "../middlewares/middleware"; export * from "../middlewares/customFetchHandler"; export * from "../middlewares/retryHandler"; export * from "../middlewares/options/retryHandlerOptions"; -export * from "../middlewares/browser/middlewareFactory"; - +export * from "../middlewares/options/telemetryHandlerOptions"; export * from "../middlewares/telemetryHandler"; +export * from "../middlewares/middlewareFactory"; export * from "../utils/headersUtil"; +export * from "../utils/fetchDefinitions"; + diff --git a/http/typescript/fetch/src/dom.shim.d.ts b/http/typescript/fetch/src/dom.shim.d.ts deleted file mode 100644 index 8ae5c5b756..0000000000 --- a/http/typescript/fetch/src/dom.shim.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -interface Request { } -interface RequestInit { } -interface Response { } -interface Headers { } -interface ReadableStream { } -interface fetch { } -interface Blob {} \ No newline at end of file diff --git a/http/typescript/fetch/src/httpClient.ts b/http/typescript/fetch/src/httpClient.ts index 9539831cc4..edfacf703b 100644 --- a/http/typescript/fetch/src/httpClient.ts +++ b/http/typescript/fetch/src/httpClient.ts @@ -1,3 +1,10 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + import { type RequestOption } from "@microsoft/kiota-abstractions"; import { CustomFetchHandler } from "./middlewares/customFetchHandler"; @@ -38,28 +45,12 @@ export class HttpClient { * @returns Nothing */ private setMiddleware(...middleware: Middleware[]): void { - if (middleware.length > 1) { - this.parseMiddleWareArray(middleware); - } else { - this.middleware = middleware[0]; - } - } - - /** - * @private - * Processes the middleware array to construct the chain - * and sets this.middleware property to the first middlware handler of the array - * The calling function should validate if middleware is not undefined or not empty - * @param {Middleware[]} middlewareArray - The array of middleware handlers - * @returns Nothing - */ - private parseMiddleWareArray(middlewareArray: Middleware[]) { - middlewareArray.forEach((element, index) => { - if (index < middlewareArray.length - 1) { - element.next = middlewareArray[index + 1]; + middleware.forEach((element, index) => { + if (index < middleware.length - 1) { + element.next = middleware[index + 1]; } }); - this.middleware = middlewareArray[0]; + this.middleware = middleware[0]; } /** diff --git a/http/typescript/fetch/src/index.ts b/http/typescript/fetch/src/index.ts index ad24d4d562..7c7683ecfb 100644 --- a/http/typescript/fetch/src/index.ts +++ b/http/typescript/fetch/src/index.ts @@ -6,7 +6,8 @@ */ /* eslint-disable @typescript-eslint/triple-slash-reference*/ -/// +/// + export * from "./fetchRequestAdapter"; export * from "./httpClient"; export * from "./middlewares/middleware"; diff --git a/http/typescript/fetch/src/middlewares/options/telemetryHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/telemetryHandlerOptions.ts index f823784e06..34eb993b60 100644 --- a/http/typescript/fetch/src/middlewares/options/telemetryHandlerOptions.ts +++ b/http/typescript/fetch/src/middlewares/options/telemetryHandlerOptions.ts @@ -1,3 +1,9 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ import { RequestOption } from "@microsoft/kiota-abstractions"; export interface TelemetryHandlerOptions extends RequestOption { diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts index dc2b018823..1323129550 100644 --- a/http/typescript/fetch/src/middlewares/retryHandler.ts +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -27,11 +27,11 @@ export class RetryHandler implements Middleware { * @static * A list of status codes that needs to be retried */ - private static RETRY_STATUS_CODES: number[] = [ + private static RETRY_STATUS_CODES: Set = new Set([ 429, // Too many requests 503, // Service unavailable 504, // Gateway timeout - ]; + ]); /** * @private @@ -70,7 +70,7 @@ export class RetryHandler implements Middleware { * @returns Whether the response has retry status code or not */ private isRetry(response: FetchResponse): boolean { - return RetryHandler.RETRY_STATUS_CODES.indexOf(response.status) !== -1; + return RetryHandler.RETRY_STATUS_CODES.has(response.status); } /** diff --git a/http/typescript/fetch/src/middlewares/telemetryHandler.ts b/http/typescript/fetch/src/middlewares/telemetryHandler.ts index a429f9423b..44c865e2fd 100644 --- a/http/typescript/fetch/src/middlewares/telemetryHandler.ts +++ b/http/typescript/fetch/src/middlewares/telemetryHandler.ts @@ -1,3 +1,9 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ import { RequestOption } from "@microsoft/kiota-abstractions"; import { Middleware } from "./middleware"; From a6fb496f3df992f3d27c4f6c26bcf5fa8d49aeeb Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Sun, 20 Mar 2022 23:57:26 -0700 Subject: [PATCH 32/34] update change logi= --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index efd4c67e61..dd54ecb601 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed +- Moving middlewares from Graph core ## [0.0.19] - 2022-03-18 From 973a69c4b84159bd95fb56367ee42bc0bdb510b6 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Sun, 20 Mar 2022 23:59:56 -0700 Subject: [PATCH 33/34] Correct case --- .../options/{RetryHandlerOptions.ts => retryHandlerOptions.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename http/typescript/fetch/src/middlewares/options/{RetryHandlerOptions.ts => retryHandlerOptions.ts} (100%) diff --git a/http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts b/http/typescript/fetch/src/middlewares/options/retryHandlerOptions.ts similarity index 100% rename from http/typescript/fetch/src/middlewares/options/RetryHandlerOptions.ts rename to http/typescript/fetch/src/middlewares/options/retryHandlerOptions.ts From be939252ae2ad0da8ac99a29377a427f39f1be88 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Mon, 21 Mar 2022 11:27:46 -0700 Subject: [PATCH 34/34] version bump, case sensitive check --- http/typescript/fetch/package-lock.json | 4 ++-- http/typescript/fetch/package.json | 2 +- http/typescript/fetch/src/middlewares/retryHandler.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/http/typescript/fetch/package-lock.json b/http/typescript/fetch/package-lock.json index 43caf0e288..ab812b627a 100644 --- a/http/typescript/fetch/package-lock.json +++ b/http/typescript/fetch/package-lock.json @@ -1,12 +1,12 @@ { "name": "@microsoft/kiota-http-fetchlibrary", - "version": "1.0.18", + "version": "1.0.19", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@microsoft/kiota-http-fetchlibrary", - "version": "1.0.18", + "version": "1.0.19", "license": "MIT", "dependencies": { "@microsoft/kiota-abstractions": "1.0.31", diff --git a/http/typescript/fetch/package.json b/http/typescript/fetch/package.json index 686226b5ab..67b28bf767 100644 --- a/http/typescript/fetch/package.json +++ b/http/typescript/fetch/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/kiota-http-fetchlibrary", - "version": "1.0.18", + "version": "1.0.19", "description": "Kiota request adapter implementation with fetch", "keywords": [ "Kiota", diff --git a/http/typescript/fetch/src/middlewares/retryHandler.ts b/http/typescript/fetch/src/middlewares/retryHandler.ts index 1323129550..236aa918e3 100644 --- a/http/typescript/fetch/src/middlewares/retryHandler.ts +++ b/http/typescript/fetch/src/middlewares/retryHandler.ts @@ -83,7 +83,7 @@ export class RetryHandler implements Middleware { const method = options.method; const isPutPatchOrPost: boolean = method === HttpMethod.PUT || method === HttpMethod.PATCH || method === HttpMethod.POST; if (isPutPatchOrPost) { - const isStream = getRequestHeader(options, "content-type") === "application/octet-stream"; + const isStream = getRequestHeader(options, "content-type")?.toLowerCase() === "application/octet-stream"; if (isStream) { return false; }