From 47d114f93b0e761feafaee7f74c5d8031e05b06e Mon Sep 17 00:00:00 2001 From: Harrison Ifeanyichukwu Date: Sat, 23 Dec 2023 14:43:04 +0100 Subject: [PATCH] feat(components): simplified api, fixed http2 api, changed routing api parameters this PR fixes error starting up http2 server, it simplifies routing method parameters BREAKING CHANGE: routhing method parameters changed, middleware and route callbacks now receive fourth and third arguments respectively, that contains a pathParams object containing the routes matched parameters --- .husky/commit-msg | 3 + .husky/pre-commit | 7 + .husky/prepare-commit-msg | 4 + .server.config.js | 2 +- commitlint.config.js | 1 + package.json | 15 +- src/@types/{index.d.ts => index.ts} | 87 +- src/index.ts | 9 +- src/modules/BodyParser.ts | 14 +- src/modules/Constants.ts | 10 +- src/modules/Engine.ts | 215 ++--- src/modules/FileServer.ts | 4 +- src/modules/Request.ts | 77 +- src/modules/Response.ts | 123 +-- src/modules/Router.ts | 149 ++-- src/modules/Server.ts | 280 +++--- src/modules/Utils.ts | 17 +- src/modules/Wrapper.ts | 44 +- tests/modules/BodyParser.spec.ts | 22 +- tests/modules/Engine.spec.ts | 192 ++--- tests/modules/Router.spec.ts | 98 +-- tests/modules/Server.spec.ts | 33 +- yarn.lock | 1218 +++++++++------------------ 23 files changed, 961 insertions(+), 1663 deletions(-) create mode 100755 .husky/commit-msg create mode 100755 .husky/pre-commit create mode 100755 .husky/prepare-commit-msg create mode 100644 commitlint.config.js rename src/@types/{index.d.ts => index.ts} (76%) diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 0000000..d0d34c2 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,3 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" +yarn commitlint --edit $1 diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..6201ede --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,7 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +# run test:precommit when ready +# npx lint-staged && yarn test:precommit + +# npx lint-staged \ No newline at end of file diff --git a/.husky/prepare-commit-msg b/.husky/prepare-commit-msg new file mode 100755 index 0000000..17e2764 --- /dev/null +++ b/.husky/prepare-commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +exec < /dev/tty && npx cz --hook || true diff --git a/.server.config.js b/.server.config.js index 34226ad..f1ae8da 100644 --- a/.server.config.js +++ b/.server.config.js @@ -2,7 +2,7 @@ const { createConfig } = require('./build/cjs'); module.exports = createConfig({ https: { enabled: false, - enforce: true, + enforce: false, credentials: { key: '.cert/server.key', cert: '.cert/server.crt', diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..4fedde6 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1 @@ +module.exports = { extends: ['@commitlint/config-conventional'] } diff --git a/package.json b/package.json index 8c4ce9e..19a630d 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "build" ], "scripts": { - "commit": "git-cz", + "prepare": "husky install", "pretest": "bash ./scripts/gen-ssl-cert.sh", "test": "cross-env BABEL_ENV=test jest --runInBand", "build": "yarn rollup-all", @@ -50,19 +50,20 @@ }, "homepage": "https://github.com/teclone/r-server#readme", "devDependencies": { + "@commitlint/cli": "^16.2.3", + "@commitlint/config-conventional": "^16.2.1", "@semantic-release/github": "^8.0.7", - "@teclone/rollup-all": "^1.26.0", + "@teclone/rollup-all": "^1.29.1", "@types/jest": "24.0.11", "@types/request-promise": "^4.1.47", "@typescript-eslint/eslint-plugin": "^5.59.1", "@typescript-eslint/parser": "^5.59.1", "babel-jest": "^29.5.0", - "commitizen": "4.0.3", "coveralls": "3.0.3", "cross-env": "^7.0.3", - "cz-conventional-changelog": "2.1.0", "eslint": "^8.39.0", "eslint-config-prettier": "^8.8.0", + "husky": "^8.0.3", "jest": "^29.5.0", "js-beautify": "1.7.5", "prettier": "^2.8.8", @@ -72,11 +73,13 @@ "semantic-release": "^17.4.2", "semantic-release-cli": "5.2.0", "source-map-support": "0.5.12", - "typescript": "^4.2.3" + "typescript": "^4.2.3", + "commitizen": "^4.2.4", + "cz-conventional-changelog": "3.3.0" }, "config": { "commitizen": { - "path": "cz-conventional-changelog" + "path": "./node_modules/cz-conventional-changelog" } }, "dependencies": { diff --git a/src/@types/index.d.ts b/src/@types/index.ts similarity index 76% rename from src/@types/index.d.ts rename to src/@types/index.ts index 5b2c34b..0f6427f 100644 --- a/src/@types/index.d.ts +++ b/src/@types/index.ts @@ -1,3 +1,4 @@ +import { IncomingHttpHeaders } from 'http'; import { ServerRequest } from '../modules/Request'; import { ServerResponse } from '../modules/Response'; @@ -89,7 +90,7 @@ export type Method = | 'delete' | '*'; -export type Url = string; +export type Path = string; export type RouteId = number; @@ -99,7 +100,7 @@ export type Parameter = string | number | boolean; export interface Next { (): true; - reset: () => boolean; + reset: () => void; status: () => boolean; } @@ -109,8 +110,7 @@ export type Callback< > = ( request: Rq, response: Rs, - params: ObjectOfAny, - options?: ObjectOfAny + options: { pathParams: PathParameters } & Record ) => Promise; export type ErrorCallback< @@ -130,44 +130,18 @@ export type Middleware< request: Rq, response: Rs, next: Next, - params: ObjectOfAny, - options?: ObjectOfAny + options: { pathParams: PathParameters } & Record ) => Promise | boolean; export type ListenerCallback = () => void; -export interface CallbackOptions { - use: Middleware | Middleware[]; - options?: ObjectOfAny; -} - -export interface MiddlewareOptions { - method: Method | Method[]; - options?: ObjectOfAny; -} - -export interface ResolvedCallbackOptions { - use: Middleware[]; - options?: ObjectOfAny; -} - -export interface ResolvedMiddlewareOptions { - method: Method[]; - options?: ObjectOfAny; -} - -export type RouteInstance = [ - RouteId, - Url, - Callback, - null | ResolvedCallbackOptions -]; +export type RouteInstance = [RouteId, Path, Callback, Middleware[]]; export type MiddlewareInstance = [ MiddlewareId, - Url, + Path, Middleware[], - null | ResolvedMiddlewareOptions + Set ]; export interface FileEntry { @@ -232,6 +206,11 @@ export interface Data { [propName: string]: string | string[]; } +export type PathParameters = Record< + T, + string | number | boolean +>; + export interface Headers { [propName: string]: string; } @@ -256,11 +235,37 @@ export interface RouteParameter { value: string | number | boolean; } -export interface Routes { - options: RouteInstance[]; - head: RouteInstance[]; - get: RouteInstance[]; - post: RouteInstance[]; - put: RouteInstance[]; - delete: RouteInstance[]; +export type Routes = Record, RouteInstance[]>; + +export interface RouteResponse { + status?: 'success' | 'error'; + statusCode?: number; + message?: string; + data?: ResponseData; + headers?: IncomingHttpHeaders; + ttl?: number; +} + +export interface APIExecutor { + (arg: { + /** + * request body, should be a combination of parsed post body and url search params + */ + body: RequestBody; + + /** + * request http headers + */ + headers: IncomingHttpHeaders; + + /** + * request path parameters, as contained in the routing path + */ + pathParams: PathParameters; + }): Promise | null>; + + /** + * assigned name of the handler + */ + apiName?: string; } diff --git a/src/index.ts b/src/index.ts index eaac3b1..92652d6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,11 +4,8 @@ export { Server } from './modules/Server'; export { Router } from './modules/Router'; export { Http1Request, Http2Request } from './modules/Request'; -export { - Http1Response, - Http2Response, - RouteResponse, - APIExecutor, -} from './modules/Response'; +export { Http1Response, Http2Response } from './modules/Response'; + +export * from './@types'; export const createConfig = (config: RServerConfig) => config; diff --git a/src/modules/BodyParser.ts b/src/modules/BodyParser.ts index 0e3e977..11d4cd2 100644 --- a/src/modules/BodyParser.ts +++ b/src/modules/BodyParser.ts @@ -236,14 +236,16 @@ export class BodyParser { } /** - * parse the query parameters in the given url + * converts url search parameters to object + * @param searchParams + * @returns */ - parseQueryString(url: string): Data { - if (url.indexOf('?') > -1) { - return this.parseUrlEncoded(url.split('?')[1]); - } else { - return {}; + urlSearchParamsToObject(searchParams: URLSearchParams) { + const result: Data = {}; + for (const key of searchParams.keys()) { + result[key] = searchParams.get(key); } + return result; } /** diff --git a/src/modules/Constants.ts b/src/modules/Constants.ts index 6466bd8..61ddf21 100644 --- a/src/modules/Constants.ts +++ b/src/modules/Constants.ts @@ -1,8 +1,14 @@ -import { Routes } from '../@types'; +import { Method, Routes } from '../@types'; +// this matches a route token path in the form of {dataType:pathParameterName} or {pathParameterName} const singleToken = '\\{((?:[a-z]+:)?[a-z]+)\\}'; +// single token regex export const SINGLE_TOKEN_REGEX = new RegExp(singleToken, 'i'); + +// double token regex, helps capture routh tokens that targets two pairs of from and to values +// eg {dataType:fromPathParameterName}-{dataType:toPathParameterName} +// or {dataType:fromPathParameterName}.{dataType:toPathParameterName} export const DOUBLE_TOKEN_REGEX = new RegExp( singleToken + '([-.])' + singleToken, 'i' @@ -26,7 +32,7 @@ export const assignRouteId = () => ++routeId; export const assignMiddlewareId = () => ++middlewareId; -export const ROUTE_KEYS: Array = [ +export const ALL_METHODS: Method[] = [ 'options', 'head', 'get', diff --git a/src/modules/Engine.ts b/src/modules/Engine.ts index 45b5d7c..51f7ca7 100644 --- a/src/modules/Engine.ts +++ b/src/modules/Engine.ts @@ -1,18 +1,18 @@ import type { - Url, MiddlewareInstance, RouteInstance, - ResolvedCallbackOptions, RouteParameter, Middleware, Next, - ServerResponse, - ServerRequest, + Method, + PathParameters, } from '../@types'; -import { fillArray, isObject, stripSlashes } from '@teclone/utils'; +import { fillArray, stripSlashes } from '@teclone/utils'; import { replace } from '@teclone/regex'; import { DOUBLE_TOKEN_REGEX, SINGLE_TOKEN_REGEX } from './Constants'; -import { handleError } from './Utils'; + +import { ServerRequest } from './Request'; +import { ServerResponse } from './Response'; const generateNext = () => { let status = false; @@ -26,7 +26,7 @@ const generateNext = () => { }; next.reset = () => { - return !(status = false); + status = false; }; return next; @@ -39,25 +39,22 @@ export class Engine { private response: ServerResponse; - private middlewares: MiddlewareInstance[]; - - private method: string; + private method: Method; - private url: Url; + private path: string; constructor( - url: Url, - method: string, + path: string, + method: Method, request: ServerRequest, response: ServerResponse ) { this.resolved = false; this.request = request; this.response = response; - this.middlewares = []; - this.url = stripSlashes(url.replace(/[#?].*$/, '')); - this.method = method.toLowerCase(); + this.path = stripSlashes(path); + this.method = method; } /** @@ -65,7 +62,7 @@ export class Engine { */ private captureParameter( routeToken: string, - urlToken: string, + pathToken: string, parameters: RouteParameter[] ): RouteParameter[] { const processToken = (token: string, value: string) => { @@ -116,194 +113,152 @@ export class Engine { const separator = RegExp.$2; const token2 = RegExp.$3; - const values = urlToken ? urlToken.split(separator) : ['', '']; + const values = pathToken ? pathToken.split(separator) : ['', '']; parameters.push(processToken(token1, values[0])); parameters.push(processToken(token2, values[1])); } else if (SINGLE_TOKEN_REGEX.test(routeToken)) { const token = RegExp.$1; - parameters.push(processToken(token, urlToken)); + parameters.push(processToken(token, pathToken)); } - return parameters; - } - /** - * reduce parameters to object value - * @param parameters - */ - private reduceParams(parameters: RouteParameter[]) { - return parameters.reduce((acc, current) => { - acc[current.name] = current.value; - return acc; - }, {}); + return parameters; } /** * runs through the route, and captures parameters */ - private captureParameters(routeUrl: string): RouteParameter[] { - const parameters: RouteParameter[] = []; + private captureParameters(routePath: string) { + routePath = stripSlashes(routePath); - const removeEmpty = (arg: string) => arg !== ''; + const parameters: RouteParameter[] = []; //split the tokens. - const routeTokens = routeUrl.split('/').filter(removeEmpty); - const urlTokens = this.url.split('/').filter(removeEmpty); + const routeTokens = routePath.split('/'); + const pathTokens = this.path.split('/'); - // if the route tokens is greater than the url tokens, fill with empty string + // if the route tokens is greater than the path tokens, fill with empty string const len = routeTokens.length; - fillArray(urlTokens, len, ''); + fillArray(pathTokens, len, ''); let i = -1; while (++i < len) { - const urlToken = urlTokens[i]; + const pathToken = pathTokens[i]; const routeToken = routeTokens[i]; // if it is final route token, store remaining url if (routeToken === '*' && i + 1 === len) { parameters.push({ - name: 'rest', + name: '__rest', dataType: 'string', - value: urlTokens.slice(i).join('/'), + value: pathTokens.slice(i).join('/'), }); break; } else { - this.captureParameter(routeToken, urlToken, parameters); + this.captureParameter(routeToken, pathToken, parameters); } } - return parameters; + + return parameters.reduce((acc, current) => { + acc[current.name] = current.value; + return acc; + }, {} as PathParameters); } /** * check if route url matches request url */ - private matchUrl(routeUrl: Url): boolean { + private matchPath(routePath: string): boolean { + routePath = stripSlashes(routePath); + /* create matching regular expression */ - const tokens = routeUrl ? routeUrl.split('/') : []; + const tokens = routePath ? routePath.split('/') : []; const max = tokens.length - 1; const pattern = tokens .map((token, index) => { + // if it is the last token and it is optional, put it inside an optional regex pattern if (index === max && /[^)]\?$/.test(token)) { token = `(${token.substring(0, token.length - 1)})?`; } + if (token === '*') { return '.*'; } else { token = replace(DOUBLE_TOKEN_REGEX, '[^/]+$:2[^/]+', token); token = replace(SINGLE_TOKEN_REGEX, '[^/]+', token); } + return token; }) .join('/'); const regex = new RegExp('^' + pattern + '$', 'i'); //regex is case insensitive - return regex.test(this.url) || regex.test(this.url + '/'); + + // the second test is necessary to capture optional path + return regex.test(this.path) || regex.test(this.path + '/'); } /** - * asynchronously runs the middleware + * processes the route */ - private async runMiddlewares( - middlewares: Middleware[], - parameters: RouteParameter[] + async process( + routeInstances: RouteInstance[], + middlewareInstances: MiddlewareInstance[] = [] ) { - const next = generateNext(); + const method = this.method; + if (this.resolved) { + return true; + } - for (let i = 0; i < middlewares.length; i++) { - const middleware = middlewares[i]; - next.reset(); - await middleware(this.request, this.response, next, { - params: this.reduceParams(parameters), - }); + const routeInstance = routeInstances.find((routeInstance) => + this.matchPath(routeInstance[1]) + ); - if (next.status() === false) { - break; - } + if (!routeInstance) { + return false; } - if ( - next.status() === false && - (!this.response.writableFinished || !this.response.finished) - ) { - this.response.end(); - } + const [, routePath, routeCallback, routeMiddlewares] = routeInstance; - return next.status(); - } + const matchingMiddlewares: Array<[string, Middleware[]]> = + middlewareInstances + .filter(([, middlewarePath, , methods]) => { + return methods.has(method) && this.matchPath(middlewarePath); + }) + .map(([, middlewarePath, middleware]) => [middlewarePath, middleware]); - /** - * asynchronously runs the matching route - */ - private async runRoute(route: RouteInstance, parameters: RouteParameter[]) { - for (let i = 0; i < this.middlewares.length; i++) { - const [, url, middlewares, options] = this.middlewares[i]; - const middlewareUrl = stripSlashes(url); - - const methods = options.method; - - if ( - methods.length === 0 || - !methods.includes(this.method as any) || - !this.matchUrl(middlewareUrl) - ) { - continue; - } + if (routeMiddlewares.length) { + matchingMiddlewares.push([routePath, routeMiddlewares]); + } - const middlewareParameters = this.captureParameters(middlewareUrl); + // execute middlewares + const next = generateNext(); - const shouldContinue = await this.runMiddlewares( - middlewares, - middlewareParameters - ); + for (const [middlewarePath, middlewares] of matchingMiddlewares) { + const pathParams = this.captureParameters(middlewarePath); + for (const middleware of middlewares) { + next.reset(); - if (!shouldContinue) { - return; - } - } + await middleware(this.request, this.response, next, { + pathParams, + }); - const [, , callback, routeOptions] = route; + if (!next.status()) { + break; + } + } - //run localised middlewares if any - if (isObject(routeOptions)) { - if (!(await this.runMiddlewares(routeOptions.use, parameters))) { - return; + // stop executing and return true + if (!next.status()) { + return true; } } - return callback(this.request, this.response, { - params: this.reduceParams(parameters), + const routePathParams = this.captureParameters(routePath); + await routeCallback(this.request, this.response, { + pathParams: routePathParams, }); - } - - /** - * processes the route - */ - async process(route: RouteInstance) { - const routeUrl = stripSlashes(route[1]); - if (this.resolved) { - return true; - } - if (!this.matchUrl(routeUrl)) { - return false; - } - - this.resolved = true; - const parameters = this.captureParameters(routeUrl); - - try { - await this.runRoute(route, parameters); - } catch (ex) { - handleError(ex, this.response); - } return true; } - - /** - * sets or overrides the existing middlewares - */ - use(middlewares: MiddlewareInstance[]): this { - this.middlewares = middlewares; - return this; - } } diff --git a/src/modules/FileServer.ts b/src/modules/FileServer.ts index 2badd44..cf69cea 100644 --- a/src/modules/FileServer.ts +++ b/src/modules/FileServer.ts @@ -1,7 +1,7 @@ import * as crypto from 'crypto'; import * as fs from 'fs'; import * as path from 'path'; -import type { RServerConfig, Url, Headers, Range } from '../@types'; +import type { RServerConfig, Headers, Range } from '../@types'; import { isUndefined, isString, stripSlashes } from '@teclone/utils'; import { IncomingHttpHeaders } from 'http'; @@ -299,7 +299,7 @@ export class FileServer { * validates the request method and returns the public file or directory path that * matches the request url */ - private validateRequest(url: Url, method: string): string | null { + private validateRequest(url: string, method: string): string | null { if (!['head', 'get', 'options'].includes(method.toLowerCase())) { return null; } diff --git a/src/modules/Request.ts b/src/modules/Request.ts index a1c638b..8c08ea5 100644 --- a/src/modules/Request.ts +++ b/src/modules/Request.ts @@ -1,12 +1,14 @@ import { IncomingMessage } from 'http'; import { Http2ServerRequest } from 'http2'; -import { Data, Files, HttpProtocol, Method } from '../@types'; +import { Data, Files, Method } from '../@types'; export type ServerRequest< T extends typeof IncomingMessage | typeof Http2ServerRequest = | typeof IncomingMessage | typeof Http2ServerRequest > = Omit, 'method'> & { + parsedUrl: URL; + error: boolean; startedAt: Date; @@ -27,25 +29,11 @@ export type ServerRequest< encrypted: boolean; - host: string; - - port: number; - - hostname: string; - - protocol: HttpProtocol; - method: Method; initialized: boolean; init: (this: ServerRequest, encrypted: boolean) => void; -}; - -type ServerRequestConstructor< - T extends typeof IncomingMessage | typeof Http2ServerRequest -> = Omit & { - new (...args: ConstructorParameters): ServerRequest; prototype: ServerRequest; }; @@ -57,15 +45,12 @@ const createRequestClass = < opts: { init: (this: ServerRequest, encrypted: boolean) => void; } -) => { +): T => { const { init } = opts; - const newClass: ServerRequestConstructor = function _constructor( - this: ServerRequest, - ...args - ) { - BaseRequestClass.call(this, ...args); + const RequestClass = BaseRequestClass as any as ServerRequest; + RequestClass.prototype.init = function (encrypted) { this.buffer = Buffer.alloc(0); this.files = {}; @@ -74,56 +59,48 @@ const createRequestClass = < // data is a merge of query and body this.data = {}; - } as unknown as ServerRequestConstructor; - Object.setPrototypeOf(newClass.prototype, BaseRequestClass.prototype); - - // end - newClass.prototype.init = - init || - function () { - // do nothing - }; + if (init) { + init.call(this, encrypted); + } + }; - return newClass; + return RequestClass as any as T; }; -export const Http1Request = createRequestClass(IncomingMessage, { +// HTTP1Request +class Http1BaseRequest extends IncomingMessage {} +export const Http1Request = createRequestClass(Http1BaseRequest, { init(encrypted) { if (!this.initialized) { this.startedAt = new Date(); this.entityTooLarge = false; - this.encrypted = encrypted; - this.protocol = encrypted ? 'https' : 'http'; - - this.host = this.headers['host']; - - const [hostname, port] = this.host.split(':'); + this.method = this.method.toLowerCase() as Method; + const host = this.headers['host']; + const protocol = encrypted ? 'https' : 'http'; - this.hostname = hostname; - this.port = Number.parseInt(port); + this.encrypted = encrypted; + this.parsedUrl = new URL(this.url, `${protocol}://${host}`); this.initialized = true; } }, }); -export const Http2Request = createRequestClass(Http2ServerRequest, { +// HTTP2Request +class Http2BaseRequest extends Http2ServerRequest {} +export const Http2Request = createRequestClass(Http2BaseRequest, { init(encrypted) { this.startedAt = new Date(); - this.entityTooLarge = false; - this.encrypted = encrypted; - this.protocol = encrypted ? 'https' : 'http'; - - this.host = this.authority; + const host = this.authority; + const protocol = encrypted ? 'https' : 'http'; + this.method = this.method.toLowerCase() as Method; - const [hostname, port] = this.authority.split(':'); - - this.hostname = hostname; - this.port = Number.parseInt(port); + this.encrypted = encrypted; + this.parsedUrl = new URL(this.url, `${protocol}://${host}`); this.initialized = true; }, diff --git a/src/modules/Response.ts b/src/modules/Response.ts index 1013d11..107cb7e 100644 --- a/src/modules/Response.ts +++ b/src/modules/Response.ts @@ -3,32 +3,10 @@ import { Http2ServerResponse } from 'http2'; import { isCallable, isString } from '@teclone/utils'; import { Logger } from './Logger'; import { FileServer } from './FileServer'; -import { ErrorCallback } from '../@types'; +import { ErrorCallback, RouteResponse } from '../@types'; import { handleError } from './Utils'; -import { IncomingHttpHeaders } from 'http'; import { ServerRequest } from './Request'; -export interface RouteResponse { - status?: 'success' | 'error'; - statusCode?: number; - message?: string; - data?: ResponseData; - headers?: IncomingHttpHeaders; - ttl?: number; -} - -export interface APIExecutor { - (arg: { - body: RequestBody; - headers: IncomingHttpHeaders; - }): Promise | null>; - - /** - * assigned name of the handler - */ - apiName?: string; -} - export type ServerResponse< T extends typeof Http2ServerResponse | typeof Http1ServerResponse = | typeof Http2ServerResponse @@ -37,6 +15,8 @@ export type ServerResponse< InstanceType, 'end' | 'setHeader' | 'setHeaders' | 'removeHeader' | 'removeHeaders' > & { + prototype: ServerResponse; + req: ServerRequest; logger: Logger; @@ -167,41 +147,19 @@ export type ServerResponse< ): Promise; }; -type ServerResponseConstructor< - T extends typeof Http2ServerResponse | typeof Http1ServerResponse -> = Omit & { - new (streamOrRequest: ConstructorParameters[0]): ServerResponse; - - prototype: ServerResponse; -}; - const createResponseClass = < T extends typeof Http2ServerResponse | typeof Http1ServerResponse >( - BaseResponseClass: T, - opts: { - construct?: ( - this: ServerResponse, - streamOrRequest: ConstructorParameters[0] - ) => void; - } -) => { - const { construct } = opts; + BaseResponseClass: T +): T => { + const ResponseClass = BaseResponseClass as any as ServerResponse; - const newClass: ServerResponseConstructor = function _constructor( - this: ServerResponse, - streamOrRequest - ) { - BaseResponseClass.call(this, streamOrRequest); - if (construct) { - construct.call(this, streamOrRequest); - } - } as unknown as ServerResponseConstructor; - - Object.setPrototypeOf(newClass.prototype, BaseResponseClass.prototype); + const parentEnd = BaseResponseClass.prototype.end; + const parentSetHeader = BaseResponseClass.prototype.setHeader; + const parentRemoveHeader = BaseResponseClass.prototype.removeHeader; // end - newClass.prototype.end = function (data, encoding?, cb?) { + ResponseClass.prototype.end = function (data, encoding?, cb?) { let resolvedData: string | Buffer | Uint8Array = ''; let resolvedEncoding: BufferEncoding | string; @@ -241,52 +199,43 @@ const createResponseClass = < }; if (encoding) { - BaseResponseClass.prototype.end.call( - this, - resolvedData, - resolvedEncoding, - resolvePromise - ); + parentEnd.call(this, resolvedData, resolvedEncoding, resolvePromise); } else { - BaseResponseClass.prototype.end.call( - this, - resolvedData, - resolvePromise - ); + parentEnd.call(this, resolvedData, resolvePromise); } }); }; - newClass.prototype.setHeader = function (name, value) { - BaseResponseClass.prototype.setHeader.call(this, name, value); + ResponseClass.prototype.setHeader = function (name, value) { + parentSetHeader.call(this, name, value); return this; }; - newClass.prototype.setHeaders = function (headers) { + ResponseClass.prototype.setHeaders = function (headers) { Object.keys(headers || {}).forEach((key) => { this.setHeader(key, headers[key]); }); return this; }; - newClass.prototype.removeHeader = function (name) { - BaseResponseClass.prototype.removeHeader.call(this, name); + ResponseClass.prototype.removeHeader = function (name) { + parentRemoveHeader.call(this, name); return this; }; - newClass.prototype.removeHeaders = function (...names: string[]) { + ResponseClass.prototype.removeHeaders = function (...names: string[]) { names.forEach((name) => { this.removeHeader(name); }); return this; }; - newClass.prototype.status = function (code: number) { + ResponseClass.prototype.status = function (code: number) { this.statusCode = code; return this; }; - newClass.prototype.json = function ( + ResponseClass.prototype.json = function ( data?: object | string ): Promise { if (!isString(data)) { @@ -295,21 +244,21 @@ const createResponseClass = < return this.setHeader('Content-Type', 'application/json').end(data); }; - newClass.prototype.redirect = function ( + ResponseClass.prototype.redirect = function ( path: string, status = 302 ): Promise { return this.status(status).setHeader('Location', path).end(); }; - newClass.prototype.download = function ( + ResponseClass.prototype.download = function ( filePath: string, filename?: string ): Promise { return this.fileServer.serveDownload(filePath, this, filename); }; - newClass.prototype.jsonError = function ( + ResponseClass.prototype.jsonError = function ( response?: RouteResponse ): Promise { const { @@ -335,7 +284,7 @@ const createResponseClass = < }); }; - newClass.prototype.jsonSuccess = function ( + ResponseClass.prototype.jsonSuccess = function ( response?: RouteResponse ): Promise { const { @@ -360,7 +309,7 @@ const createResponseClass = < }); }; - newClass.prototype.wait = function (time: number) { + ResponseClass.prototype.wait = function (time: number) { return new Promise((resolve) => { setTimeout(() => { resolve(this); @@ -368,7 +317,7 @@ const createResponseClass = < }); }; - newClass.prototype.processRouteResponse = function ( + ResponseClass.prototype.processRouteResponse = function ( responsePromise, options ) { @@ -390,13 +339,19 @@ const createResponseClass = < }); }; - return newClass; + return ResponseClass as any as T; }; -export const Http1Response = createResponseClass(Http1ServerResponse, { - construct(req) { - this.req = req as any; - }, -}); +// HTTP1 Response +class HTTP1BaseResponse extends Http1ServerResponse { + constructor(req) { + super(req); + // @ts-ignore + this.req = req; + } +} +export const Http1Response = createResponseClass(HTTP1BaseResponse); -export const Http2Response = createResponseClass(Http2ServerResponse, {}); +// HTTP2 Response +class HTTP2BaseResponse extends Http2ServerResponse {} +export const Http2Response = createResponseClass(HTTP2BaseResponse); diff --git a/src/modules/Router.ts b/src/modules/Router.ts index dd75cc7..6444668 100644 --- a/src/modules/Router.ts +++ b/src/modules/Router.ts @@ -1,31 +1,28 @@ -import { - makeArray, - isObject, - isBoolean, - stripSlashes, - isCallable, - isString, -} from '@teclone/utils'; +import { makeArray, isBoolean, stripSlashes } from '@teclone/utils'; import { Wrapper } from './Wrapper'; import { Callback, - CallbackOptions, Middleware, - Url, Method, - MiddlewareOptions, MiddlewareInstance, Routes, RouteId, MiddlewareId, RouteInstance, - ResolvedCallbackOptions, - ResolvedMiddlewareOptions, } from '../@types'; -import { assignMiddlewareId, assignRouteId, ROUTE_KEYS } from './Constants'; -import { getRouteKeys } from './Utils'; -import { join } from 'path'; +import { ALL_METHODS, assignMiddlewareId, assignRouteId } from './Constants'; + +interface RouterConstructOpts { + /** + * indicating if parent middlewares should be inherited when it gets mounted, defaults to true. + */ + inheritMiddlewares?: boolean; + /** + * defines routers base path + */ + basePath?: string; +} export class Router { private basePath = ''; @@ -46,56 +43,35 @@ export class Router { * * @param inheritMiddlewares - boolean indicating if parent middlewares should be inherited, defaults to true. */ - constructor(inheritMiddlewares = true) { - this.inheritMiddlewares = inheritMiddlewares; + constructor(opts: RouterConstructOpts) { + this.inheritMiddlewares = opts.inheritMiddlewares ?? true; + this.setBasePath(opts?.basePath || ''); } /** * resolves the url route by joining it to the base path */ - private resolveUrl(url: string): string { - url = join(this.basePath, stripSlashes(url)); - return url !== '.' ? url : ''; + private resolvePath(path: string): string { + return stripSlashes([this.basePath, stripSlashes(path)].join('/')); } /** * resolves a route callback options */ - private resolveCallbackOptions( - options?: Middleware | Middleware[] | CallbackOptions - ) { - let resolvedOptions: ResolvedCallbackOptions = null; - - if (isCallable(options) || Array.isArray(options)) { - resolvedOptions = { use: makeArray(options) }; - } else if (isObject(options)) { - resolvedOptions = { - use: makeArray(options.use), - options: options.options, - }; - } - - return resolvedOptions; + private resolveMiddlewares(use?: Middleware | Middleware[]): Middleware[] { + return use ? makeArray(use) : []; } /** * resolves a use middleware options */ - private resolveMiddlewareOptions( - options: Method | Method[] | MiddlewareOptions = '*' - ) { - let resolvedOptions: ResolvedMiddlewareOptions = null; - - if (isString(options) || Array.isArray(options)) { - resolvedOptions = { method: getRouteKeys(options) }; - } else if (isObject(options)) { - resolvedOptions = { - method: getRouteKeys(options.method || '*'), - options: options.options, - }; + private resolveMethods(method: Method | Method[]): Method[] { + const methods = method ? makeArray(method) : ['*']; + if (methods.includes('*')) { + return ALL_METHODS; + } else { + return methods as Method[]; } - - return resolvedOptions; } /** @@ -108,21 +84,21 @@ export class Router { */ private set( method: Method, - url: Url, + path: string, callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions + use?: Middleware | Middleware[] ): RouteId { const routeId = assignRouteId(); - const resolvedOptions = this.resolveCallbackOptions(options); - const resolvedUrl = this.resolveUrl(url); + const resolvedPath = this.resolvePath(path); + const methods = this.resolveMethods(method); - for (const routeKey of getRouteKeys(method)) { - this.routes[routeKey].push([ + for (const method of methods) { + this.routes[method].push([ routeId, - resolvedUrl, + resolvedPath, callback, - resolvedOptions, + this.resolveMiddlewares(use), ]); } @@ -166,11 +142,11 @@ export class Router { * @param options - route configuration object or middleware or array of middlewares */ options( - url: Url, + path: string, callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions + use?: Middleware | Middleware[] ): RouteId { - return this.set('options', url, callback, options); + return this.set('options', path, callback, use); } /** @@ -181,11 +157,11 @@ export class Router { * @param options - route configuration object or middleware or array of middlewares */ head( - url: Url, + path: string, callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions + use?: Middleware | Middleware[] ): RouteId { - return this.set('head', url, callback, options); + return this.set('head', path, callback, use); } /** @@ -196,11 +172,11 @@ export class Router { * @param options - route configuration object or middleware or array of middlewares */ get( - url: Url, + path: string, callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions + use?: Middleware | Middleware[] ): RouteId { - return this.set('get', url, callback, options); + return this.set('get', path, callback, use); } /** @@ -211,11 +187,11 @@ export class Router { * @param options - route configuration object or middleware or array of middlewares */ post( - url: Url, + path: string, callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions + use?: Middleware | Middleware[] ): RouteId { - return this.set('post', url, callback, options); + return this.set('post', path, callback, use); } /** @@ -226,11 +202,11 @@ export class Router { * @param options - route configuration object or middleware or array of middlewares */ put( - url: Url, + path: string, callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions + use?: Middleware | Middleware[] ): RouteId { - return this.set('put', url, callback, options); + return this.set('put', path, callback, use); } /** @@ -241,11 +217,11 @@ export class Router { * @param options - route configuration object or middleware or array of middlewares */ delete( - url: Url, + path: string, callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions + use?: Middleware | Middleware[] ): RouteId { - return this.set('delete', url, callback, options); + return this.set('delete', path, callback, use); } /** @@ -256,11 +232,11 @@ export class Router { * @param options - route configuration object or middleware or array of middlewares */ any( - url: Url, + path: string, callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions + use?: Middleware | Middleware[] ): RouteId { - return this.set('*', url, callback, options); + return this.set('*', path, callback, use); } /** @@ -280,20 +256,17 @@ export class Router { *@returns {MiddlewareId} returns the middleware id, can be used to delete the middleware. */ use( - url: Url, + path: string, middleware: Middleware | Middleware[], - options?: Method | Method[] | MiddlewareOptions + operation?: Method | Method[] ): MiddlewareId { - middleware = makeArray(middleware); - - const resolvedOptions = this.resolveMiddlewareOptions(options); const middlewareId = assignMiddlewareId(); this.middlewares.push([ middlewareId, - this.resolveUrl(url), - middleware, - resolvedOptions, + this.resolvePath(path), + this.resolveMiddlewares(middleware), + new Set(this.resolveMethods(operation)), ]); return middlewareId; @@ -318,7 +291,7 @@ export class Router { const findIndex = (routeInstance: RouteInstance) => routeInstance[0] === id; let found = false; - ROUTE_KEYS.forEach((key) => { + ALL_METHODS.forEach((key) => { const route: RouteInstance[] = this.routes[key]; const index = route.findIndex(findIndex); diff --git a/src/modules/Server.ts b/src/modules/Server.ts index bb0b7f2..0b5eb20 100644 --- a/src/modules/Server.ts +++ b/src/modules/Server.ts @@ -9,24 +9,20 @@ import * as fs from 'fs'; import { Http2SecureServer, createSecureServer as createHttp2SecureServer, - ServerHttp2Session, } from 'http2'; import { createServer as createHttp1SecureServer } from 'https'; import type { Server as HttpServer } from 'http'; import { createServer } from 'http'; -import * as path from 'path'; +import { resolve } from 'path'; import { RServerConfig, RouteInstance, MiddlewareInstance, - Url, Method, Callback, Middleware, - CallbackOptions, - MiddlewareOptions, RouteId, MiddlewareId, ErrorCallback, @@ -54,6 +50,11 @@ export interface ServerConstructorOptions< configFile?: string; config?: RServerConfig; + /** + * routing base path + */ + basePath?: string; + Http1ServerRequest?: Http1Rq; Http2ServerRequest?: Http2Rq; @@ -75,7 +76,7 @@ export class Server< private config: RServerConfig = {}; - private router: Router = new Router(false); + private router: Router; private mountedRouters: Router[] = []; @@ -115,6 +116,11 @@ export class Server< tempDir: this.config.tempDir, }); + this.router = new Router({ + inheritMiddlewares: false, + basePath: options?.basePath, + }); + this.fileServer = new FileServer(this.entryPath, this.config); this.createServers(options); @@ -131,7 +137,7 @@ export class Server< let configFromFile: RServerConfig; try { - const absPath = path.resolve(entryPath, configFile); + const absPath = resolve(entryPath, configFile); configFromFile = require(absPath); } catch (ex) { console.log( @@ -155,7 +161,7 @@ export class Server< 'tempDir', ]; directoriesToResolve.forEach((key) => { - resolvedConfig[key as any] = path.resolve( + resolvedConfig[key as any] = resolve( entryPath, resolvedConfig[key as any] ); @@ -178,7 +184,7 @@ export class Server< // @ts-ignore ServerResponse: opts?.Http1ServerResponse || Http1Response, }, - null + scopeCallback(this.onRequest, this, false) ); } @@ -190,7 +196,7 @@ export class Server< result[key] = key === 'passphrase' ? value - : fs.readFileSync(path.resolve(this.entryPath, value)); + : fs.readFileSync(resolve(this.entryPath, value)); return result; }, {} @@ -206,7 +212,7 @@ export class Server< // @ts-ignore ServerResponse: opts?.Http1ServerResponse || Http1Response, }, - null + scopeCallback(this.onRequest, this, true) ); break; @@ -225,7 +231,7 @@ export class Server< allowHTTP1: true, }, - null + scopeCallback(this.onRequest, this, true) ); } } @@ -245,7 +251,7 @@ export class Server< try { config(); config({ - path: path.resolve(entryPath, `.${env}`), + path: resolve(entryPath, `.${env}`), }); } catch (ex) { // do nothing @@ -277,50 +283,41 @@ export class Server< return result; } - /** - * runs the array of route instances until a matched route is found - */ - private async runRoutes(method: Method, engine: Engine, router: Router) { - const routes = router.getRoutes()[method]; - for (const route of routes) { - if (await engine.process(route)) { - return true; - } - } - return false; - } - /** * cordinates how routes are executed, including mounted routes */ private async cordinateRoutes( - url: Url, - method: string, + path: string, + method: Method, request: ServerRequest, response: ServerResponse ) { - method = method.toLowerCase(); - //create the engine - const engine = new Engine(url, method, request, response); - - //run main router - engine.use(this.router.getMiddlewares()); - - if (await this.runRoutes(method as Method, engine, this.router)) { + const engine = new Engine(path, method, request, response); + + // process main route + if ( + await engine.process( + this.router.getRoutes()[method], + this.router.getMiddlewares() + ) + ) { return true; } - //run mounted routers + // process mounted routes; for (const mountedRouter of this.mountedRouters) { - const middlewares = mountedRouter.shouldInheritMiddlewares() - ? [...this.router.getMiddlewares(), ...mountedRouter.getMiddlewares()] + const middlewareInstances = mountedRouter.shouldInheritMiddlewares() + ? this.router.getMiddlewares().concat(mountedRouter.getMiddlewares()) : mountedRouter.getMiddlewares(); - engine.use(middlewares); - /* istanbul ignore else */ - if (await this.runRoutes(method as Method, engine, mountedRouter)) { + if ( + await engine.process( + mountedRouter.getRoutes()[method], + middlewareInstances + ) + ) { return true; } } @@ -340,25 +337,27 @@ export class Server< /** * parse all request data */ - private parseRequestData(request: ServerRequest, url: Url) { + private parseRequestData(request: ServerRequest) { //parse query - request.query = this.bodyParser.parseQueryString(url); + request.query = this.bodyParser.urlSearchParamsToObject( + request.parsedUrl.searchParams + ); //parse the request body if (request.buffer.length > 0) { - let contentType = 'text/plain'; - /* istanbul ignore else */ - if (request.headers['content-type']) { - contentType = request.headers['content-type']; - } + const contentType = request.headers['content-type'] || 'text/plain'; //TODO: add support for content encoding const result = this.bodyParser.parse(request.buffer, contentType); + request.body = result.body; request.files = result.files; } - copy(request.data, request.query, request.body); + request.data = { + ...request.query, + ...request.body, + }; } /** @@ -370,24 +369,28 @@ export class Server< } request.endedAt = response.startedAt = new Date(); - const { url } = request; - - this.parseRequestData(request, url); - const method = request.method.toLowerCase() as Method; - - return this.cordinateRoutes(url, method, request, response).then( - (status) => { - if (!status) { - return this.fileServer - .serve(url, method, request.headers, response) - .then((status) => { - if (!status) { - return this.fileServer.serveHttpErrorFile(404, response); - } - return true; - }); + const pathname = request.parsedUrl.pathname; + + this.parseRequestData(request); + const method = request.method; + + return this.cordinateRoutes(pathname, method, request, response).then( + (routeFound) => { + if (routeFound) { + return true; } - return true; + + // try serving the file + return this.fileServer + .serve(pathname, method, request.headers, response) + .then((fileServed) => { + if (fileServed) { + return true; + } + + // return 404 response; + return this.fileServer.serveHttpErrorFile(404, response); + }); } ); } @@ -428,36 +431,39 @@ export class Server< const httpsConfig = this.config.https; if (httpsConfig.enabled && !request.encrypted && httpsConfig.enforce) { response.redirect( - `https://${path.join( - request.hostname + ':' + this.address().https.port, - request.url - )}` + `https://${ + request.parsedUrl.hostname + + ':' + + this.address().https.port + + request.parsedUrl.pathname + + request.parsedUrl.search + }` ); - } else { - //handle on request error - request.on('error', (err) => { - request.error = true; - handleError(err, response, 400); - }); + return; + } + //handle on request error + request.on('error', (err) => { + request.error = true; + handleError(err, response, 400); + }); - //handle on data event - request.on( - 'data', - scopeCallback(this.onRequestData, this, [request, response]) - ); + //handle on data event + request.on( + 'data', + scopeCallback(this.onRequestData, this, [request, response]) + ); - //handle on end event - request.on( - 'end', - scopeCallback(this.onRequestEnd, this, [request, response]) - ); + //handle on end event + request.on( + 'end', + scopeCallback(this.onRequestEnd, this, [request, response]) + ); - //clean up resources once the response has been sent out - response.on( - 'finish', - scopeCallback(this.onResponseFinish, this, [request, response]) - ); - } + //clean up resources once the response has been sent out + response.on( + 'finish', + scopeCallback(this.onResponseFinish, this, [request, response]) + ); } /** @@ -486,18 +492,11 @@ export class Server< resolve, reject ) { - const activeSessions = new Set(); - if (!server) { return resolve(); } - // store active sessions server - .on('session', (session) => { - activeSessions.add(session); - session.on('close', () => activeSessions.delete(session)); - }) //handle error event .on('error', (err: any) => { @@ -525,16 +524,9 @@ export class Server< // handle close event .on('close', () => { - // destroy all active sessions - activeSessions.forEach((session) => session.close()); - activeSessions.clear(); - const intro = this.getServerIntro(server, isSecureServer); this.logger.info(`${intro.name} connection closed successfully`); - }) - - //handle server request - .on('request', scopeCallback(this.onRequest, this, isSecureServer)); + }); } /** @@ -587,12 +579,8 @@ export class Server< * @param callback - route callback handler * @param options - route configuration object or middleware or array of middlewares */ - options( - url: Url, - callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions - ) { - return this.router.options(url, callback, options); + options(path: string, callback: Callback, use?: Middleware | Middleware[]) { + return this.router.options(path, callback, use); } /** @@ -602,12 +590,8 @@ export class Server< * @param callback - route callback handler * @param options - route configuration object or middleware or array of middlewares */ - head( - url: Url, - callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions - ) { - return this.router.head(url, callback, options); + head(path: string, callback: Callback, use?: Middleware | Middleware[]) { + return this.router.head(path, callback, use); } /** @@ -617,12 +601,8 @@ export class Server< * @param callback - route callback handler * @param options - route configuration object or middleware or array of middlewares */ - get( - url: Url, - callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions - ) { - return this.router.get(url, callback, options); + get(path: string, callback: Callback, use?: Middleware | Middleware[]) { + return this.router.get(path, callback, use); } /** @@ -630,14 +610,10 @@ export class Server< * * @param url - route url * @param callback - route callback handler - * @param options - route configuration object or middleware or array of middlewares + * @param use - route configuration object or middleware or array of middlewares */ - post( - url: Url, - callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions - ) { - return this.router.post(url, callback, options); + post(path: string, callback: Callback, use?: Middleware | Middleware[]) { + return this.router.post(path, callback, use); } /** @@ -646,12 +622,8 @@ export class Server< * @param callback - route callback handler * @param options - route configuration object or middleware or array of middlewares */ - put( - url: Url, - callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions - ) { - return this.router.put(url, callback, options); + put(path: string, callback: Callback, use?: Middleware | Middleware[]) { + return this.router.put(path, callback, use); } /** @@ -661,12 +633,8 @@ export class Server< * @param callback - route callback handler * @param options - route configuration object or middleware or array of middlewares */ - delete( - url: Url, - callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions - ) { - return this.router.delete(url, callback, options); + delete(path: string, callback: Callback, use?: Middleware | Middleware[]) { + return this.router.delete(path, callback, use); } /** @@ -676,19 +644,15 @@ export class Server< * @param callback - route callback handler * @param options - route configuration object or middleware or array of middlewares */ - any( - url: Url, - callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions - ) { - this.router.any(url, callback, options); + any(path: string, callback: Callback, use?: Middleware | Middleware[]) { + this.router.any(path, callback, use); } /** * returns a route wrapper for the given url */ - route(url: Url): Wrapper { - return new Wrapper(this.router, url); + route(path: string): Wrapper { + return new Wrapper(this.router, path); } /** @@ -734,20 +698,20 @@ export class Server< * that the middleware will run against */ use( - url: Url, + path: string, middleware: Middleware | Middleware[], - options?: Method | Method[] | MiddlewareOptions + operation?: Method | Method[] ) { - return this.router.use(url, middleware, options); + return this.router.use(path, middleware, operation); } /** * mounts a router to the server instance */ - mount(baseUrl: Url, router: Router) { + mount(basePath: string, router: Router) { const mainRouterBasePath = this.router.getBasePath(); const resolve = (instance: RouteInstance | MiddlewareInstance) => { - instance[1] = join(mainRouterBasePath, baseUrl, instance[1]); + instance[1] = join(mainRouterBasePath, basePath, instance[1]); }; //resolve all routes, each apiRoutes is of the form [url, callback, options] diff --git a/src/modules/Utils.ts b/src/modules/Utils.ts index ed8a841..459685e 100644 --- a/src/modules/Utils.ts +++ b/src/modules/Utils.ts @@ -1,7 +1,5 @@ -import { Method, Routes } from '../@types'; import { EntityTooLargeException } from '../Exceptions/EntityTooLargeException'; -import { isString, makeArray } from '@teclone/utils'; -import { ROUTE_KEYS } from './Constants'; +import { isString } from '@teclone/utils'; import { ServerResponse } from './Response'; export const handleError = ( @@ -33,7 +31,7 @@ export const handleError = ( return response.jsonError({ statusCode: code || 500, - message: 'internal server error', + message: 'Error', data: process.env.NODE_ENV === 'production' ? null @@ -42,14 +40,3 @@ export const handleError = ( }, }); }; - -export const getRouteKeys = ( - method: Method | Method[] = '*' -): Array => { - method = makeArray(method); - if (method.findIndex((current) => current === '*') > -1) { - return ROUTE_KEYS; - } else { - return method as Array; - } -}; diff --git a/src/modules/Wrapper.ts b/src/modules/Wrapper.ts index a3b9684..59bc678 100644 --- a/src/modules/Wrapper.ts +++ b/src/modules/Wrapper.ts @@ -1,5 +1,5 @@ import { Router } from './Router'; -import { Callback, CallbackOptions, Middleware } from '../@types'; +import { Callback, Middleware } from '../@types'; export class Wrapper { private router: Router; @@ -17,11 +17,8 @@ export class Wrapper { * @param callback - route callback handler * @param options - route configuration object or middleware or array of middlewares */ - options( - callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions - ): this { - this.router.options(this.url, callback, options); + options(callback: Callback, use?: Middleware | Middleware[]): this { + this.router.options(this.url, callback, use); return this; } @@ -31,11 +28,8 @@ export class Wrapper { * @param callback - route callback handler * @param options - route configuration object or middleware or array of middlewares */ - head( - callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions - ): this { - this.router.head(this.url, callback, options); + head(callback: Callback, use?: Middleware | Middleware[]): this { + this.router.head(this.url, callback, use); return this; } @@ -45,11 +39,8 @@ export class Wrapper { * @param callback - route callback handler * @param options - route configuration object or middleware or array of middlewares */ - get( - callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions - ): this { - this.router.get(this.url, callback, options); + get(callback: Callback, use?: Middleware | Middleware[]): this { + this.router.get(this.url, callback, use); return this; } @@ -59,11 +50,8 @@ export class Wrapper { * @param callback - route callback handler * @param options - route configuration object or middleware or array of middlewares */ - post( - callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions - ): this { - this.router.post(this.url, callback, options); + post(callback: Callback, use?: Middleware | Middleware[]): this { + this.router.post(this.url, callback, use); return this; } @@ -73,11 +61,8 @@ export class Wrapper { * @param callback - route callback handler * @param options - route configuration object or middleware or array of middlewares */ - put( - callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions - ): this { - this.router.put(this.url, callback, options); + put(callback: Callback, use?: Middleware | Middleware[]): this { + this.router.put(this.url, callback, use); return this; } @@ -87,11 +72,8 @@ export class Wrapper { * @param callback - route callback handler * @param options - route configuration object or middleware or array of middlewares */ - delete( - callback: Callback, - options?: Middleware | Middleware[] | CallbackOptions - ): this { - this.router.delete(this.url, callback, options); + delete(callback: Callback, use?: Middleware | Middleware[]): this { + this.router.delete(this.url, callback, use); return this; } } diff --git a/tests/modules/BodyParser.spec.ts b/tests/modules/BodyParser.spec.ts index 1dcdd01..c52135e 100644 --- a/tests/modules/BodyParser.spec.ts +++ b/tests/modules/BodyParser.spec.ts @@ -33,19 +33,15 @@ describe('BodyParser', function () { }); }); - describe(`#parseQueryString(url: string)`, function () { - it(`should extract and parse the query portion of the given url`, function () { - const url = '/index?' + encodeData(data); - expect(bodyParser.parseQueryString(url)).toEqual(data); - }); - - it(`should default query parameters with no value to empty string`, function () { - expect(bodyParser.parseQueryString('/index?name')).toEqual({ name: '' }); - }); - - it(`should return empty object if url has no query portion`, function () { - expect(bodyParser.parseQueryString('/index')).toEqual({}); - expect(bodyParser.parseQueryString('/index?')).toEqual({}); + describe(`#urlSearchParamsToObject(searchParams: URLSearchParams)`, function () { + it(`should convert the search params to object of key value pairs`, function () { + const urlSearchParams = new URLSearchParams('key1=value1&key2=value2'); + expect(bodyParser.urlSearchParamsToObject(urlSearchParams)).toMatchObject( + { + key1: 'value1', + key2: 'value2', + } + ); }); }); diff --git a/tests/modules/Engine.spec.ts b/tests/modules/Engine.spec.ts index ee00c99..59e9923 100644 --- a/tests/modules/Engine.spec.ts +++ b/tests/modules/Engine.spec.ts @@ -1,18 +1,15 @@ import { dummyCallback, dummyMiddleware } from '../helpers'; import { Engine } from '../../src/modules/Engine'; -import { - Method, - MiddlewareInstance, - ServerRequest, - ServerResponse, -} from '../../src/@types'; +import { Method, MiddlewareInstance } from '../../src/@types'; import { Logger } from '../../src/modules/Logger'; import { Server } from '../../src/modules/Server'; +import { ServerResponse } from '../../src/modules/Response'; +import { ServerRequest } from '../../src/modules/Request'; describe('Engine', function () { let engine: Engine; - const createEngine = (url: string, method: Method) => { + const createEngine = (path: string, method: Method) => { const server = new Server(); const configs = server.getConfig(); @@ -36,7 +33,7 @@ describe('Engine', function () { } as ServerResponse; response.logger = logger; - return new Engine(url, method, {} as ServerRequest, response); + return new Engine(path, method, {} as ServerRequest, response); }; beforeEach(function () { @@ -50,83 +47,6 @@ describe('Engine', function () { }); }); - describe(`#use(middlewares: MiddlewareInstance[]): this`, function () { - it(`should set the given middlewares as registered global middlewares, executing - middlewares whose route url and method matches that of the request`, function () { - const engine = createEngine('/users', 'get'); - - const middleware1 = jest.fn(dummyMiddleware); - const middleware2 = jest.fn(); - const middleware3 = jest.fn(); - - const middlewares: MiddlewareInstance[] = [ - [1, '*', [middleware1], { method: ['get'] }], - [2, '/users', [middleware2], { method: ['options'] }], - [3, '/users', [middleware3], { method: ['get'] }], - ]; - engine.use(middlewares); - - return engine - .process([1, 'users', dummyCallback, null]) - .then((status) => { - expect(status).toBeTruthy(); - expect(middleware1.mock.calls).toHaveLength(1); - expect(middleware2.mock.calls).toHaveLength(0); - expect(middleware3.mock.calls).toHaveLength(1); - }); - }); - - it(`should stop middleware execution if any of the middlewares fails to execute the - next callback`, function () { - const engine = createEngine('/users', 'get'); - - const middleware1 = jest.fn((req, res, next) => { - return false; - }); - const middleware2 = jest.fn(dummyMiddleware); - - const middlewares: MiddlewareInstance[] = [ - [1, '*', [middleware1], { method: ['post', 'put', 'get'] }], - [2, '/users', [middleware2], { method: ['get' as Method] }], - ]; - - engine.use(middlewares); - - return engine - .process([3, 'users', dummyCallback, null]) - .then((status) => { - expect(status).toBeTruthy(); - expect(middleware1.mock.calls).toHaveLength(1); - expect(middleware2.mock.calls).toHaveLength(0); - }); - }); - - it(`should stop middleware execution and also end the response if any of the middlewares fails to execute the - next callback and also fails to end the response`, function () { - const engine = createEngine('/users', 'get'); - - const middleware1 = jest.fn((req, res, next) => { - return false; - }); - const middleware2 = jest.fn(dummyMiddleware); - - const middlewares: MiddlewareInstance[] = [ - [1, '*', [middleware1], { method: ['get'] }], - [2, '/users', [middleware2], { method: ['get'] }], - ]; - - engine.use(middlewares); - - return engine - .process([3, 'users', dummyCallback, null]) - .then((status) => { - expect(status).toBeTruthy(); - expect(middleware1.mock.calls).toHaveLength(1); - expect(middleware2.mock.calls).toHaveLength(0); - }); - }); - }); - describe(`parameter capturing`, function () { it(`should capture route parameters and pass along to route callback during execution`, function () { @@ -134,11 +54,11 @@ describe('Engine', function () { const routeCallback = jest.fn(dummyCallback); return engine - .process([1, 'users/{id}', routeCallback, null]) + .process([[1, 'users/{id}', routeCallback, []]], []) .then((status) => { expect(status).toBeTruthy(); expect(routeCallback).toHaveBeenCalledTimes(1); - expect(routeCallback.mock.calls[0][2].params).toHaveProperty( + expect(routeCallback.mock.calls[0][2].pathParams).toHaveProperty( 'id', '1' ); @@ -151,9 +71,9 @@ describe('Engine', function () { const routeCallback = jest.fn(dummyCallback); return engine - .process([1, 'flights/{from}-{to}', routeCallback, null]) + .process([[1, 'flights/{from}-{to}', routeCallback, []]]) .then((status) => { - const params = routeCallback.mock.calls[0][2].params; + const params = routeCallback.mock.calls[0][2].pathParams; expect(status).toBeTruthy(); expect(routeCallback).toHaveBeenCalledTimes(1); @@ -169,9 +89,9 @@ describe('Engine', function () { const routeCallback = jest.fn(dummyCallback); return engine - .process([1, 'flights/{from}.{to}', routeCallback, null]) + .process([[1, 'flights/{from}.{to}', routeCallback, []]]) .then((status) => { - const params = routeCallback.mock.calls[0][2].params; + const params = routeCallback.mock.calls[0][2].pathParams; expect(status).toBeTruthy(); expect(routeCallback).toHaveBeenCalledTimes(1); @@ -186,9 +106,9 @@ describe('Engine', function () { const routeCallback = jest.fn(dummyCallback); return engine - .process([1, 'users/{int:userId}', routeCallback, null]) + .process([[1, 'users/{int:userId}', routeCallback, []]]) .then((status) => { - const params = routeCallback.mock.calls[0][2].params; + const params = routeCallback.mock.calls[0][2].pathParams; expect(status).toBeTruthy(); expect(routeCallback).toHaveBeenCalledTimes(1); @@ -202,9 +122,9 @@ describe('Engine', function () { const routeCallback = jest.fn(dummyCallback); return engine - .process([1, 'users/{int:userId}', routeCallback, null]) + .process([[1, 'users/{int:userId}', routeCallback, []]]) .then((status) => { - const params = routeCallback.mock.calls[0][2].params; + const params = routeCallback.mock.calls[0][2].pathParams; expect(status).toBeTruthy(); expect(routeCallback).toHaveBeenCalledTimes(1); @@ -218,9 +138,9 @@ describe('Engine', function () { const routeCallback = jest.fn(dummyCallback); return engine - .process([1, 'amount/{float:value}', routeCallback, null]) + .process([[1, 'amount/{float:value}', routeCallback, []]]) .then((status) => { - const params = routeCallback.mock.calls[0][2].params; + const params = routeCallback.mock.calls[0][2].pathParams; expect(status).toBeTruthy(); expect(routeCallback).toHaveBeenCalledTimes(1); @@ -234,9 +154,9 @@ describe('Engine', function () { const routeCallback = jest.fn(dummyCallback); return engine - .process([1, 'amount/{numeric:value}', routeCallback, null]) + .process([[1, 'amount/{numeric:value}', routeCallback, []]]) .then((status) => { - const params = routeCallback.mock.calls[0][2].params; + const params = routeCallback.mock.calls[0][2].pathParams; expect(status).toBeTruthy(); expect(routeCallback).toHaveBeenCalledTimes(1); @@ -250,9 +170,9 @@ describe('Engine', function () { const routeCallback = jest.fn(dummyCallback); return engine - .process([1, 'amount/{number:value}', routeCallback, null]) + .process([[1, 'amount/{number:value}', routeCallback, []]]) .then((status) => { - const params = routeCallback.mock.calls[0][2].params; + const params = routeCallback.mock.calls[0][2].pathParams; expect(status).toBeTruthy(); expect(routeCallback).toHaveBeenCalledTimes(1); @@ -266,9 +186,9 @@ describe('Engine', function () { const routeCallback = jest.fn(dummyCallback); return engine - .process([1, 'agreement/{boolean:value}', routeCallback, null]) + .process([[1, 'agreement/{boolean:value}', routeCallback, []]]) .then((status) => { - const params = routeCallback.mock.calls[0][2].params; + const params = routeCallback.mock.calls[0][2].pathParams; expect(status).toBeTruthy(); expect(routeCallback).toHaveBeenCalledTimes(1); @@ -282,9 +202,9 @@ describe('Engine', function () { const routeCallback = jest.fn(dummyCallback); return engine - .process([1, 'agreement/{bool:value}', routeCallback, null]) + .process([[1, 'agreement/{bool:value}', routeCallback, []]]) .then((status) => { - const params = routeCallback.mock.calls[0][2].params; + const params = routeCallback.mock.calls[0][2].pathParams; expect(status).toBeTruthy(); expect(routeCallback).toHaveBeenCalledTimes(1); @@ -296,10 +216,10 @@ describe('Engine', function () { describe(`pattern matching`, function () { it(`should match optional ending routes which are identified by the presence of - the question mark character at the end of the route`, function () { + the question mark character at the end of the route path`, function () { const engine = createEngine('/flights', 'get'); return engine - .process([1, '/flights/{from}-{to}?', dummyCallback, null]) + .process([[1, '/flights/{from}-{to}?', dummyCallback, []]]) .then((status) => { expect(status).toBeTruthy(); }); @@ -307,18 +227,17 @@ describe('Engine', function () { it(`should treat home route as empty string while matching`, function () { const engine = createEngine('/', 'get'); - return engine.process([1, '/', dummyCallback, null]).then((status) => { + return engine.process([[1, '/', dummyCallback, []]]).then((status) => { expect(status).toBeTruthy(); }); }); }); describe(`routing`, function () { - it(`should process the given route and run the route callback if request - method and url matches`, function () { + it(`should process the given route and run the route callback if any of the routes path match request path`, function () { const engine = createEngine('/users', 'options'); const callback = jest.fn(dummyCallback); - return engine.process([1, 'users', callback, null]).then((status) => { + return engine.process([[1, 'users', callback, []]]).then((status) => { expect(status).toBeTruthy(); expect(callback.mock.calls).toHaveLength(1); }); @@ -336,12 +255,7 @@ describe('Engine', function () { return engine .process([ - 1, - 'users', - callback, - { - use: [middleware1, middleware2, middleware3], - }, + [1, 'users', callback, [middleware1, middleware2, middleware3]], ]) .then((status) => { expect(status).toBeTruthy(); @@ -365,12 +279,7 @@ describe('Engine', function () { return engine .process([ - 1, - 'users', - callback, - { - use: [middleware1, middleware2, middleware3], - }, + [1, 'users', callback, [middleware1, middleware2, middleware3]], ]) .then((status) => { expect(status).toBeTruthy(); @@ -382,15 +291,34 @@ describe('Engine', function () { }); }); - it(`should capture exceptions thrown inside the callback and handle it - accordingly`, function () { - const engine = createEngine('/users', 'options'); - const callback = (req, res) => { - throw new Error('something went bad'); - }; - return engine.process([1, 'users', callback, null]).then((status) => { - expect(status).toBeTruthy(); - }); + it(`should execute matching + middlewares whose route path and method matches that of the request`, function () { + const engine = createEngine('/users', 'get'); + + const middleware1 = jest.fn(dummyMiddleware); + const middleware2 = jest.fn(); + const middleware3 = jest.fn(); + const middleware4 = jest.fn(); + + const middlewares: MiddlewareInstance[] = [ + [1, '*', [middleware1], new Set(['get'])], + [2, '/users', [middleware2], new Set(['options'])], + [3, '/users', [middleware3], new Set(['get'])], + [3, '/users', [middleware4], new Set(['get'])], + ]; + + return engine + .process([[1, 'users', dummyCallback, []]], middlewares) + .then((status) => { + expect(status).toBeTruthy(); + expect(middleware1.mock.calls).toHaveLength(1); + expect(middleware2.mock.calls).toHaveLength(0); + expect(middleware3.mock.calls).toHaveLength(1); + + // middleware 4 is not called because middleware 2, despite being executed, + // did not call the next callback + expect(middleware4.mock.calls).toHaveLength(0); + }); }); }); }); diff --git a/tests/modules/Router.spec.ts b/tests/modules/Router.spec.ts index 30f5b0b..1b84aaf 100644 --- a/tests/modules/Router.spec.ts +++ b/tests/modules/Router.spec.ts @@ -2,14 +2,12 @@ import { Router } from '../../src/modules/Router'; import { dummyCallback, dummyMiddleware } from '../helpers'; import { Method } from '../../src/@types'; import { Wrapper } from '../../src/modules/Wrapper'; -import { getRouteKeys } from '../../src/modules/Utils'; -import { ROUTE_KEYS } from '../../src/modules/Constants'; - +import { ALL_METHODS } from '../../src/modules/Constants'; describe('Router', function () { let router: Router; beforeEach(function () { - router = new Router(true); + router = new Router({ inheritMiddlewares: true }); }); const getTemplate = (method: Method) => { @@ -20,59 +18,39 @@ describe('Router', function () { ? 'all http method verbs' : 'http ' + method.toUpperCase() + ' method'); - const routeKeys = getRouteKeys(method); - const api = method === '*' ? 'any' : method; + const methods = method === '*' ? ALL_METHODS : [method]; + it(banner, function () { router[api]('/', dummyCallback); - for (const routeKey of routeKeys) { + for (const routeKey of methods) { expect(router.getRoutes()[routeKey].length).toEqual(1); expect(router.getRoutes()[routeKey][0][1]).toEqual(''); expect(router.getRoutes()[routeKey][0][2]).toEqual(dummyCallback); - expect(router.getRoutes()[routeKey][0][3]).toBeNull(); + expect(router.getRoutes()[routeKey][0][3]).toEqual([]); } }); it(`can take a middleware callback or array of middleware callbacks as - options argument which is then resolved in a ResolvedCallbackOptions object`, function () { + third argument`, function () { router[api]('/users/', dummyCallback, dummyMiddleware); - for (const routeKey of routeKeys) { + for (const routeKey of methods) { expect(router.getRoutes()[routeKey].length).toEqual(1); expect(router.getRoutes()[routeKey][0][1]).toEqual('users'); expect(router.getRoutes()[routeKey][0][2]).toEqual(dummyCallback); - expect(router.getRoutes()[routeKey][0][3]).toHaveProperty('use', [ - dummyMiddleware, - ]); + expect(router.getRoutes()[routeKey][0][3]).toEqual([dummyMiddleware]); } }); - it(`can take an array of middleware callbacks as - options argument which is then resolved in a ResolvedCallbackOptions object`, function () { + it(`can take an array of middleware callbacks as third arguments`, function () { router[api]('/', dummyCallback, [dummyMiddleware]); - for (const routeKey of routeKeys) { + for (const routeKey of methods) { expect(router.getRoutes()[routeKey].length).toEqual(1); expect(router.getRoutes()[routeKey][0][1]).toEqual(''); expect(router.getRoutes()[routeKey][0][2]).toEqual(dummyCallback); - expect(router.getRoutes()[routeKey][0][3]).toHaveProperty('use', [ - dummyMiddleware, - ]); - } - }); - - it(`can take a CallbackOptions object as options argument containing a single middleware - or aray of middlewares which in turn is resolved to a ResolvedCallbackOptions object`, function () { - router[api]('/users', dummyCallback, { - use: dummyMiddleware, - }); - for (const routeKey of routeKeys) { - expect(router.getRoutes()[routeKey].length).toEqual(1); - expect(router.getRoutes()[routeKey][0][1]).toEqual('users'); - expect(router.getRoutes()[routeKey][0][2]).toEqual(dummyCallback); - expect(router.getRoutes()[routeKey][0][3]).toHaveProperty('use', [ - dummyMiddleware, - ]); + expect(router.getRoutes()[routeKey][0][3]).toEqual([dummyMiddleware]); } }); }; @@ -118,44 +96,37 @@ describe('Router', function () { }); describe( - `#options(url: Url, callback: Callback, - options: Middleware | Middleware[] | CallbackOptions | null = null)`, + `#options(url: Url, callback: Callback, use?: Middleware | Middleware[])`, getTemplate('options') ); describe( - `#head(url: Url, callback: Callback, - options: Middleware | Middleware[] | CallbackOptions | null = null)`, + `#head(url: Url, callback: Callback, use?: Middleware | Middleware[])`, getTemplate('head') ); describe( - `#get(url: Url, callback: Callback, - options: Middleware | Middleware[] | CallbackOptions | null = null)`, + `#get(url: Url, callback: Callback, use?: Middleware | Middleware[])`, getTemplate('get') ); describe( - `#post(url: Url, callback: Callback, - options: Middleware | Middleware[] | CallbackOptions | null = null)`, + `#post(url: Url, callback: Callback, use?: Middleware | Middleware[])`, getTemplate('post') ); describe( - `#put(url: Url, callback: Callback, - options: Middleware | Middleware[] | CallbackOptions | null = null)`, + `#put(url: Url, callback: Callback, use?: Middleware | Middleware[])`, getTemplate('put') ); describe( - `#delete(url: Url, callback: Callback, - options: Middleware | Middleware[] | CallbackOptions | null = null)`, + `#delete(url: Url, callback: Callback, use?: Middleware | Middleware[])`, getTemplate('delete') ); describe( - `#any(url: Url, callback: Callback, - options: Middleware | Middleware[] | CallbackOptions | null = null)`, + `#any(url: Url, callback: Callback, use?: Middleware | Middleware[])`, getTemplate('*') ); @@ -166,7 +137,7 @@ describe('Router', function () { }); describe(`#use(url: Url, middleware: Middleware | Middleware[], - options: Method | Method[] | MiddlewareOptions | null = null)`, function () { + operation?: Method | Method[])`, function () { it(`should register a middleware to be called whenever the given url is visited`, function () { expect(router.getMiddlewares().length).toEqual(0); @@ -174,21 +145,18 @@ describe('Router', function () { expect(router.getMiddlewares().length).toEqual(1); expect(router.getMiddlewares()[0][1]).toEqual(''); expect(router.getMiddlewares()[0][2]).toEqual([dummyMiddleware]); - expect(router.getMiddlewares()[0][3]).toHaveProperty( - 'method', - ROUTE_KEYS - ); + expect(router.getMiddlewares()[0][3]).toEqual(new Set(ALL_METHODS)); }); - it(`can accept a http method argument as options, specifying the which request method type - that middleware will apply to`, function () { + it(`can accept a http method argument as last parameter, specifying which request method type + the middleware will apply to`, function () { expect(router.getMiddlewares().length).toEqual(0); router.use('/users', dummyMiddleware, 'get'); expect(router.getMiddlewares().length).toEqual(1); expect(router.getMiddlewares()[0][1]).toEqual('users'); expect(router.getMiddlewares()[0][2]).toEqual([dummyMiddleware]); - expect(router.getMiddlewares()[0][3]).toHaveProperty('method', ['get']); + expect(router.getMiddlewares()[0][3]).toEqual(new Set(['get'])); }); it(`can accept an array of http method arguments as options too`, function () { @@ -198,23 +166,7 @@ describe('Router', function () { expect(router.getMiddlewares().length).toEqual(1); expect(router.getMiddlewares()[0][1]).toEqual(''); expect(router.getMiddlewares()[0][2]).toEqual([dummyMiddleware]); - expect(router.getMiddlewares()[0][3]).toHaveProperty('method', [ - 'get', - 'post', - ]); - }); - - it(`can also accept a MiddlewareOptions object, that defines the http methods`, function () { - expect(router.getMiddlewares().length).toEqual(0); - router.use('/', dummyMiddleware, { method: ['get', 'post'] }); - - expect(router.getMiddlewares().length).toEqual(1); - expect(router.getMiddlewares()[0][1]).toEqual(''); - expect(router.getMiddlewares()[0][2]).toEqual([dummyMiddleware]); - expect(router.getMiddlewares()[0][3]).toHaveProperty('method', [ - 'get', - 'post', - ]); + expect(router.getMiddlewares()[0][3]).toEqual(new Set(['get', 'post'])); }); }); diff --git a/tests/modules/Server.spec.ts b/tests/modules/Server.spec.ts index 922ab97..ddfce23 100644 --- a/tests/modules/Server.spec.ts +++ b/tests/modules/Server.spec.ts @@ -109,44 +109,37 @@ describe(`Server`, function () { }); describe( - `#options(url: Url, callback: Callback, - options: Middleware | Middleware[] | CallbackOptions | null = null)`, + `#options(url: Url, callback: Callback, use?: Middleware | Middleware[])`, getTemplate('options') ); describe( - `#head(url: Url, callback: Callback, - options: Middleware | Middleware[] | CallbackOptions | null = null)`, + `#head(url: Url, callback: Callback, use?: Middleware | Middleware[])`, getTemplate('head') ); describe( - `#get(url: Url, callback: Callback, - options: Middleware | Middleware[] | CallbackOptions | null = null)`, + `#get(url: Url, callback: Callback, use?: Middleware | Middleware[])`, getTemplate('get') ); describe( - `#post(url: Url, callback: Callback, - options: Middleware | Middleware[] | CallbackOptions | null = null)`, + `#post(url: Url, callback: Callback, use?: Middleware | Middleware[])`, getTemplate('post') ); describe( - `#put(url: Url, callback: Callback, - options: Middleware | Middleware[] | CallbackOptions | null = null)`, + `#put(url: Url, callback: Callback, use?: Middleware | Middleware[])`, getTemplate('put') ); describe( - `#delete(url: Url, callback: Callback, - options: Middleware | Middleware[] | CallbackOptions | null = null)`, + `#delete(url: Url, callback: Callback, use?: Middleware | Middleware[])`, getTemplate('delete') ); describe( - `#any(url: Url, callback: Callback, - options: Middleware | Middleware[] | CallbackOptions | null = null)`, + `#any(url: Url, callback: Callback, use?: Middleware | Middleware[])`, getTemplate('any') ); @@ -174,7 +167,7 @@ describe(`Server`, function () { server.setBasePath('api/v1'); server.get('login', dummyCallback); - const router = new Router(true); + const router = new Router({ inheritMiddlewares: true }); router.get('/', dummyCallback); router.get('{id}', dummyCallback); router.get('{id}/posts', dummyCallback); @@ -202,7 +195,7 @@ describe(`Server`, function () { }); it(`should also search in mounted routers, returning true if router is found`, function () { - const router = new Router(true); + const router = new Router({ inheritMiddlewares: true }); const routeId = router.get('profile', dummyCallback); server.mount('user', router); @@ -210,7 +203,7 @@ describe(`Server`, function () { }); it(`should also search in mounted routers, returning false if router is not found`, function () { - const router = new Router(true); + const router = new Router({ inheritMiddlewares: true }); router.get('profile', dummyCallback); server.mount('user', router); @@ -230,7 +223,7 @@ describe(`Server`, function () { }); it(`should also search in mounted routers, returning true if middleware exists`, function () { - const router = new Router(true); + const router = new Router({ inheritMiddlewares: true }); const middlewareId = router.use('profile', dummyMiddleware); server.mount('user', router); @@ -238,7 +231,7 @@ describe(`Server`, function () { }); it(`should also search in mounted routers, returning false if middleware does not exist`, function () { - const router = new Router(true); + const router = new Router({ inheritMiddlewares: true }); router.use('profile', dummyMiddleware); server.mount('user', router); @@ -572,7 +565,7 @@ describe(`Server`, function () { const callback = (req, res) => { return res.end(); }; - const router = new Router(true); + const router = new Router({ inheritMiddlewares: true }); router.get('/{id}', callback); router.post('/{id}', callback); diff --git a/yarn.lock b/yarn.lock index a53cab8..9e35cce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1043,6 +1043,36 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@commitlint/cli@^16.2.3": + version "16.3.0" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-16.3.0.tgz#5689f5c2abbb7880d5ff13329251e5648a784b16" + integrity sha512-P+kvONlfsuTMnxSwWE1H+ZcPMY3STFaHb2kAacsqoIkNx66O0T7sTpBxpxkMrFPyhkJiLJnJWMhk4bbvYD3BMA== + dependencies: + "@commitlint/format" "^16.2.1" + "@commitlint/lint" "^16.2.4" + "@commitlint/load" "^16.3.0" + "@commitlint/read" "^16.2.1" + "@commitlint/types" "^16.2.1" + lodash "^4.17.19" + resolve-from "5.0.0" + resolve-global "1.0.0" + yargs "^17.0.0" + +"@commitlint/config-conventional@^16.2.1": + version "16.2.4" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-16.2.4.tgz#56647108c89ed06fc5271242787550331988c0fb" + integrity sha512-av2UQJa3CuE5P0dzxj/o/B9XVALqYzEViHrMXtDrW9iuflrqCStWBAioijppj9URyz6ONpohJKAtSdgAOE0gkA== + dependencies: + conventional-changelog-conventionalcommits "^4.3.1" + +"@commitlint/config-validator@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-16.2.1.tgz#794e769afd4756e4cf1bfd823b6612932e39c56d" + integrity sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw== + dependencies: + "@commitlint/types" "^16.2.1" + ajv "^6.12.6" + "@commitlint/config-validator@^17.4.4": version "17.4.4" resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-17.4.4.tgz#d0742705719559a101d2ee49c0c514044af6d64d" @@ -1051,11 +1081,50 @@ "@commitlint/types" "^17.4.4" ajv "^8.11.0" +"@commitlint/ensure@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-16.2.1.tgz#0fc538173f95c1eb2694eeedb79cab478347f16f" + integrity sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A== + dependencies: + "@commitlint/types" "^16.2.1" + lodash "^4.17.19" + +"@commitlint/execute-rule@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-16.2.1.tgz#60be73be4b9af97a41546e7ce59fdd33787c65f8" + integrity sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g== + "@commitlint/execute-rule@^17.4.0": version "17.4.0" resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz#4518e77958893d0a5835babe65bf87e2638f6939" integrity sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA== +"@commitlint/format@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-16.2.1.tgz#6e673f710c799be78e68b2682323e04f75080d07" + integrity sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q== + dependencies: + "@commitlint/types" "^16.2.1" + chalk "^4.0.0" + +"@commitlint/is-ignored@^16.2.4": + version "16.2.4" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-16.2.4.tgz#369e40a240ad5451bf2b57a80829253129d7f19b" + integrity sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ== + dependencies: + "@commitlint/types" "^16.2.1" + semver "7.3.7" + +"@commitlint/lint@^16.2.4": + version "16.2.4" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-16.2.4.tgz#575f5a9d227dddfca8386253d9aff27be5b94788" + integrity sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ== + dependencies: + "@commitlint/is-ignored" "^16.2.4" + "@commitlint/parse" "^16.2.1" + "@commitlint/rules" "^16.2.4" + "@commitlint/types" "^16.2.1" + "@commitlint/load@>6.1.1": version "17.5.0" resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.5.0.tgz#be45dbbb50aaf5eb7e8e940e1e0d6171d1426bab" @@ -1076,6 +1145,59 @@ ts-node "^10.8.1" typescript "^4.6.4 || ^5.0.0" +"@commitlint/load@^16.3.0": + version "16.3.0" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-16.3.0.tgz#e674ccc9edefd64a2d8b82d175de81ec3bb70eca" + integrity sha512-3tykjV/iwbkv2FU9DG+NZ/JqmP0Nm3b7aDwgCNQhhKV5P74JAuByULkafnhn+zsFGypG1qMtI5u+BZoa9APm0A== + dependencies: + "@commitlint/config-validator" "^16.2.1" + "@commitlint/execute-rule" "^16.2.1" + "@commitlint/resolve-extends" "^16.2.1" + "@commitlint/types" "^16.2.1" + "@types/node" ">=12" + chalk "^4.0.0" + cosmiconfig "^7.0.0" + cosmiconfig-typescript-loader "^2.0.0" + lodash "^4.17.19" + resolve-from "^5.0.0" + typescript "^4.4.3" + +"@commitlint/message@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-16.2.1.tgz#bc6a0fa446a746ac2ca78cf372e4cec48daf620d" + integrity sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw== + +"@commitlint/parse@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-16.2.1.tgz#50b359cb711ec566d2ee236a8e4c6baca07b77c0" + integrity sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g== + dependencies: + "@commitlint/types" "^16.2.1" + conventional-changelog-angular "^5.0.11" + conventional-commits-parser "^3.2.2" + +"@commitlint/read@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-16.2.1.tgz#e0539205d77cdb6879b560f95e5fb251e0c6f562" + integrity sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw== + dependencies: + "@commitlint/top-level" "^16.2.1" + "@commitlint/types" "^16.2.1" + fs-extra "^10.0.0" + git-raw-commits "^2.0.0" + +"@commitlint/resolve-extends@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-16.2.1.tgz#2f7833a5a3a7aa79f508e59fcb0f1d33c45ed360" + integrity sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg== + dependencies: + "@commitlint/config-validator" "^16.2.1" + "@commitlint/types" "^16.2.1" + import-fresh "^3.0.0" + lodash "^4.17.19" + resolve-from "^5.0.0" + resolve-global "^1.0.0" + "@commitlint/resolve-extends@^17.4.4": version "17.4.4" resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-17.4.4.tgz#8f931467dea8c43b9fe38373e303f7c220de6fdc" @@ -1088,6 +1210,36 @@ resolve-from "^5.0.0" resolve-global "^1.0.0" +"@commitlint/rules@^16.2.4": + version "16.2.4" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-16.2.4.tgz#c2fbbf20d9d0e8fcf25690c88a27750d4a3e867b" + integrity sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg== + dependencies: + "@commitlint/ensure" "^16.2.1" + "@commitlint/message" "^16.2.1" + "@commitlint/to-lines" "^16.2.1" + "@commitlint/types" "^16.2.1" + execa "^5.0.0" + +"@commitlint/to-lines@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-16.2.1.tgz#42d000f34dc0406f514991e86237fdab5e8affd0" + integrity sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ== + +"@commitlint/top-level@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-16.2.1.tgz#bdaa53ab3d8970e0288879f1a342a8c2dfe01583" + integrity sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw== + dependencies: + find-up "^5.0.0" + +"@commitlint/types@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-16.2.1.tgz#f25d373b88b01e51fc3fa44488101361945a61bd" + integrity sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA== + dependencies: + chalk "^4.0.0" + "@commitlint/types@^17.4.4": version "17.4.4" resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-17.4.4.tgz#1416df936e9aad0d6a7bbc979ecc31e55dade662" @@ -2050,10 +2202,10 @@ dependencies: "@teclone/utils" "2.14.4" -"@teclone/rollup-all@^1.26.0": - version "1.26.0" - resolved "https://registry.yarnpkg.com/@teclone/rollup-all/-/rollup-all-1.26.0.tgz#14a3f9bf2dfb864b41c25ee52bdd2b8649b51e91" - integrity sha512-nOYcYy7qgCDW/k6gcLLFuxZwn0xW2ctSMw/4Q84woD5BaCLcfgKLCj1wgn1neS0Xe11+KLW7ka81Owuu3YnNsA== +"@teclone/rollup-all@^1.29.1": + version "1.29.1" + resolved "https://registry.yarnpkg.com/@teclone/rollup-all/-/rollup-all-1.29.1.tgz#b6c7e32d82846edaeec236fe27fae5033afc858d" + integrity sha512-DPqAy3WMEh6lAs2neFjM/K0Siji/yc/d710wp8i71Z2TIAMRZ3hVQEiryhcitG/vKHjVSakhMK6wdY035ST8Xg== dependencies: "@babel/core" "^7.21.4" "@babel/plugin-transform-runtime" "7.21.4" @@ -2227,6 +2379,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.0.tgz#4668bc392bb6938637b47e98b1f2ed5426f33316" integrity sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ== +"@types/node@>=12": + version "20.10.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.5.tgz#47ad460b514096b7ed63a1dae26fad0914ed3ab2" + integrity sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw== + dependencies: + undici-types "~5.26.4" + "@types/node@^14.14.31", "@types/node@^14.14.33": version "14.18.42" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.42.tgz#fa39b2dc8e0eba61bdf51c66502f84e23b66e114" @@ -2461,7 +2620,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.6: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2495,11 +2654,6 @@ ansi-align@^3.0.0: dependencies: string-width "^4.1.0" -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -2637,21 +2791,6 @@ argv-formatter@~1.0.0: resolved "https://registry.yarnpkg.com/argv-formatter/-/argv-formatter-1.0.0.tgz#a0ca0cbc29a5b73e836eebe1cbf6c5e0e4eb82f9" integrity sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw== -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - array-buffer-byte-length@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" @@ -2670,11 +2809,6 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - array.prototype.reduce@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" @@ -2708,20 +2842,15 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== available-typed-arrays@^1.0.5: version "1.0.5" @@ -3359,18 +3488,10 @@ base32@0.0.6: dependencies: optimist ">=0.1.0" -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== bcrypt-pbkdf@^1.0.0: version "1.0.2" @@ -3413,6 +3534,15 @@ binary-extensions@^2.2.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + bluebird@^3.0.5, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -3465,22 +3595,6 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - braces@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -3518,6 +3632,14 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + builtin-modules@^3.1.0: version "3.3.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" @@ -3583,21 +3705,6 @@ cacache@^15.0.3, cacache@^15.0.5, cacache@^15.2.0, cacache@^15.3.0: tar "^6.0.2" unique-filename "^1.1.1" -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - cacheable-request@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" @@ -3611,10 +3718,10 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" -cachedir@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.2.0.tgz#19afa4305e05d79e417566882e0c8f960f62ff0e" - integrity sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ== +cachedir@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" + integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" @@ -3714,7 +3821,7 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3776,16 +3883,6 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -3809,13 +3906,6 @@ cli-columns@^3.1.2: string-width "^2.0.0" strip-ansi "^3.0.1" -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== - dependencies: - restore-cursor "^2.0.0" - cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -3823,6 +3913,11 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-spinners@^2.5.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + cli-table3@^0.5.0, cli-table3@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -3842,11 +3937,6 @@ cli-table3@^0.6.0: optionalDependencies: "@colors/colors" "1.5.0" -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" @@ -3930,14 +4020,6 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -3992,26 +4074,25 @@ commander@^2.20.0, commander@^2.9.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commitizen@4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.0.3.tgz#c19a4213257d0525b85139e2f36db7cc3b4f6dae" - integrity sha512-lxu0F/Iq4dudoFeIl5pY3h3CQJzkmQuh3ygnaOvqhAD8Wu2pYBI17ofqSuPHNsBTEOh1r1AVa9kR4Hp0FAHKcQ== +commitizen@^4.0.3, commitizen@^4.2.4: + version "4.3.0" + resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.3.0.tgz#0d056c542a2d2b1f9b9aba981aa32575b2849924" + integrity sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw== dependencies: - cachedir "2.2.0" - cz-conventional-changelog "3.0.1" + cachedir "2.3.0" + cz-conventional-changelog "3.3.0" dedent "0.7.0" - detect-indent "6.0.0" - find-node-modules "2.0.0" + detect-indent "6.1.0" + find-node-modules "^2.1.2" find-root "1.1.0" - fs-extra "8.1.0" - glob "7.1.4" - inquirer "6.5.0" + fs-extra "9.1.0" + glob "7.2.3" + inquirer "8.2.5" is-utf8 "^0.2.1" - lodash "4.17.15" - minimist "1.2.0" - shelljs "0.7.6" + lodash "4.17.21" + minimist "1.2.7" strip-bom "4.0.0" - strip-json-comments "3.0.1" + strip-json-comments "3.1.1" common-ancestor-path@^1.0.1: version "1.0.1" @@ -4031,11 +4112,6 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -4088,7 +4164,7 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control- resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -conventional-changelog-angular@^5.0.0: +conventional-changelog-angular@^5.0.0, conventional-changelog-angular@^5.0.11: version "5.0.13" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== @@ -4096,6 +4172,15 @@ conventional-changelog-angular@^5.0.0: compare-func "^2.0.0" q "^1.5.1" +conventional-changelog-conventionalcommits@^4.3.1: + version "4.6.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz#0765490f56424b46f6cb4db9135902d6e5a36dc2" + integrity sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g== + dependencies: + compare-func "^2.0.0" + lodash "^4.17.15" + q "^1.5.1" + conventional-changelog-writer@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz#1ca7880b75aa28695ad33312a1f2366f4b12659f" @@ -4112,10 +4197,10 @@ conventional-changelog-writer@^4.0.0: split "^1.0.0" through2 "^4.0.0" -conventional-commit-types@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-2.3.0.tgz#bc3c8ebba0a9e4b3ecc548f1d0674e251ab8be22" - integrity sha512-6iB39PrcGYdz0n3z31kj6/Km6mK9hm9oMRhwcLnKxE7WNoeRKZbTAobliKrbYZ5jqyCvtcVEfjCiaEzhL3AVmQ== +conventional-commit-types@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz#7c9214e58eae93e85dd66dbfbafe7e4fffa2365b" + integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg== conventional-commits-filter@^2.0.0, conventional-commits-filter@^2.0.7: version "2.0.7" @@ -4125,7 +4210,7 @@ conventional-commits-filter@^2.0.0, conventional-commits-filter@^2.0.7: lodash.ismatch "^4.4.0" modify-values "^1.0.0" -conventional-commits-parser@^3.0.0, conventional-commits-parser@^3.0.7: +conventional-commits-parser@^3.0.0, conventional-commits-parser@^3.0.7, conventional-commits-parser@^3.2.2: version "3.2.4" resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== @@ -4159,11 +4244,6 @@ copy-concurrently@^1.0.0: rimraf "^2.5.4" run-queue "^1.0.0" -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - core-js-compat@^3.25.1: version "3.30.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.1.tgz#961541e22db9c27fc48bfc13a3cafa8734171dfe" @@ -4186,12 +4266,20 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cosmiconfig-typescript-loader@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-2.0.2.tgz#7e7ce6064af041c910e1e43fb0fd9625cee56e93" + integrity sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw== + dependencies: + cosmiconfig "^7" + ts-node "^10.8.1" + cosmiconfig-typescript-loader@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz#c4259ce474c9df0f32274ed162c0447c951ef073" integrity sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q== -cosmiconfig@^7.0.0: +cosmiconfig@^7, cosmiconfig@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== @@ -4287,31 +4375,25 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A== -cz-conventional-changelog@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-2.1.0.tgz#2f4bc7390e3244e4df293e6ba351e4c740a7c764" - integrity sha512-TMjkSrvju5fPQV+Ho8TIioAgXkly8h3vJ/txiczJrlUaLpgMGA6ssnwquLMWzNZZyCsJK5r4kPgwdohC4UAGmQ== - dependencies: - conventional-commit-types "^2.0.0" - lodash.map "^4.5.1" - longest "^1.0.1" - right-pad "^1.0.1" - word-wrap "^1.0.3" - -cz-conventional-changelog@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-3.0.1.tgz#b1f207ae050355e7ada65aad5c52e9de3d0c8e5b" - integrity sha512-7KASIwB8/ClEyCRvQrCPbN7WkQnUSjSSVNyPM+gDJ0jskLi8h8N2hrdpyeCk7fIqKMRzziqVSOBTB8yyLTMHGQ== +cz-conventional-changelog@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz#9246947c90404149b3fe2cf7ee91acad3b7d22d2" + integrity sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw== dependencies: chalk "^2.4.1" - conventional-commit-types "^2.0.0" + commitizen "^4.0.3" + conventional-commit-types "^3.0.0" lodash.map "^4.5.1" longest "^2.0.1" - right-pad "^1.0.1" word-wrap "^1.0.3" optionalDependencies: "@commitlint/load" ">6.1.1" +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -4338,7 +4420,7 @@ debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, d dependencies: ms "2.1.2" -debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -4422,28 +4504,6 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - del@^6.0.0: version "6.1.1" resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" @@ -4483,10 +4543,10 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== -detect-indent@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" - integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== +detect-indent@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== detect-indent@^4.0.0: version "4.0.0" @@ -4955,19 +5015,6 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -4986,21 +5033,6 @@ expect@^29.5.0: jest-message-util "^29.5.0" jest-util "^29.5.0" -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -5015,20 +5047,6 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -5110,16 +5128,6 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -5132,13 +5140,13 @@ filter-obj@^1.1.0: resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== -find-node-modules@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-2.0.0.tgz#5db1fb9e668a3d451db3d618cd167cdd59e41b69" - integrity sha512-8MWIBRgJi/WpjjfVXumjPKCtmQ10B+fjx6zmSA+770GMJirLhWIzg8l763rhjl9xaeaHbnxPNRQKq2mgMhr+aw== +find-node-modules@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-2.1.3.tgz#3c976cff2ca29ee94b4f9eafc613987fc4c0ee44" + integrity sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg== dependencies: - findup-sync "^3.0.0" - merge "^1.2.1" + findup-sync "^4.0.0" + merge "^2.1.1" find-npm-prefix@^1.0.2: version "1.0.2" @@ -5187,14 +5195,14 @@ find-versions@^4.0.0: dependencies: semver-regex "^3.1.2" -findup-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== +findup-sync@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0" + integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== dependencies: detect-file "^1.0.0" is-glob "^4.0.0" - micromatch "^3.0.4" + micromatch "^4.0.2" resolve-dir "^1.0.1" flat-cache@^3.0.4: @@ -5225,11 +5233,6 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - foreground-child@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" @@ -5261,13 +5264,6 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - from2@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-1.3.0.tgz#88413baaa5f9a597cfde9221d86986cd3c061dfd" @@ -5289,14 +5285,15 @@ fromentries@^1.3.2: resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== -fs-extra@8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== +fs-extra@9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: + at-least-node "^1.0.0" graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" + jsonfile "^6.0.1" + universalify "^2.0.0" fs-extra@^10.0.0: version "10.1.0" @@ -5486,11 +5483,6 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -5515,6 +5507,17 @@ git-log-parser@^1.2.0: through2 "~2.0.0" traverse "~0.6.6" +git-raw-commits@^2.0.0: + version "2.0.11" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" + integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== + dependencies: + dargs "^7.0.0" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + github-url-from-git@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" @@ -5544,15 +5547,15 @@ glob-to-regexp@0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== +glob@7.2.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0, glob@^7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" @@ -5567,18 +5570,6 @@ glob@^10.0.0: minipass "^5.0.0" path-scurry "^1.7.0" -glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0, glob@^7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-dirs@^0.1.0, global-dirs@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -5779,37 +5770,6 @@ has-unicode@^2.0.0, has-unicode@^2.0.1, has-unicode@~2.0.1: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - has-yarn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" @@ -5932,6 +5892,11 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" +husky@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" + integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== + iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -5946,6 +5911,11 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" @@ -6061,24 +6031,26 @@ init-package-json@^2.0.5: validate-npm-package-license "^3.0.4" validate-npm-package-name "^3.0.0" -inquirer@6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" - integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== +inquirer@8.2.5: + version "8.2.5" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" + integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" through "^2.3.6" + wrap-ansi "^7.0.0" inquirer@^7.0.0: version "7.3.3" @@ -6108,11 +6080,6 @@ internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - into-stream@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-6.0.0.tgz#4bfc1244c0128224e18b8870e85b2de8e66c6702" @@ -6148,20 +6115,6 @@ ip@^2.0.0: resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" @@ -6191,11 +6144,6 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -6236,20 +6184,6 @@ is-core-module@^2.11.0, is-core-module@^2.5.0: dependencies: has "^1.0.3" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - is-date-object@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -6257,41 +6191,11 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - is-docker@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -6339,6 +6243,11 @@ is-installed-globally@^0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" @@ -6371,13 +6280,6 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -6415,13 +6317,6 @@ is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - is-plain-object@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" @@ -6506,6 +6401,11 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" @@ -6518,7 +6418,7 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -6540,33 +6440,21 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -7115,13 +7003,6 @@ json5@^2.2.2: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -7163,26 +7044,7 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -7627,12 +7489,7 @@ lodash.without@~4.4.0: resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" integrity sha512-M3MefBwfDhgKgINVuBJCO1YR3+gf6s9HNJsIiZ/Ru77Ws6uTb9eBuvrkpzO+9iLoAaRodGuq7tyrPCx+74QYGQ== -lodash@4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -lodash@^4.16.4, lodash@^4.17.12, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: +lodash@4.17.21, lodash@^4.16.4, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7647,10 +7504,13 @@ log-driver@^1.2.7: resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - integrity sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg== +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" longest@^2.0.1: version "2.0.1" @@ -7787,11 +7647,6 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -7802,13 +7657,6 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - marked-terminal@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-4.2.0.tgz#593734a53cf9a4bb01ea961aa579bd21889ce502" @@ -7858,29 +7706,10 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merge@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" - integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== - -micromatch@^3.0.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" +merge@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-2.1.1.tgz#59ef4bf7e0b3e879186436e8481c06a6c162ca98" + integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" @@ -7924,11 +7753,6 @@ mime@^3.0.0: resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -7972,10 +7796,10 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha512-7Wl+Jz+IGWuSdgsQEJ4JunV0si/iMhg42MnQQG6h1R6TNeVenp4U9x5CC5v/gYqz/fENLQITAWXidNtVL0NNbw== +minimist@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" @@ -8090,14 +7914,6 @@ mississippi@^3.0.0: stream-each "^1.1.0" through2 "^2.0.0" -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - mkdirp-infer-owner@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316" @@ -8156,33 +7972,11 @@ ms@^2.0.0, ms@^2.1.1, ms@^2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== - mute-stream@0.0.8, mute-stream@~0.0.4: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" @@ -8750,15 +8544,6 @@ object-assign@^4.1.0, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - object-inspect@^1.12.3, object-inspect@^1.9.0: version "1.12.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" @@ -8769,13 +8554,6 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" @@ -8797,13 +8575,6 @@ object.getownpropertydescriptors@^2.0.3: es-abstract "^1.21.2" safe-array-concat "^1.0.0" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== - dependencies: - isobject "^3.0.1" - once@^1.3.0, once@^1.3.1, once@^1.4.0, once@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -8811,13 +8582,6 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0, once@~1.4.0: dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== - dependencies: - mimic-fn "^1.0.0" - onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -8850,6 +8614,21 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -9121,11 +8900,6 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -9219,11 +8993,6 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -9545,7 +9314,7 @@ read@1, read@^1.0.7, read@~1.0.1, read@~1.0.7: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.6.0: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -9574,13 +9343,6 @@ readdir-scoped-modules@^1.0.0, readdir-scoped-modules@^1.1.0: graceful-fs "^4.1.2" once "^1.3.0" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -9639,14 +9401,6 @@ regenerator-transform@^0.15.1: dependencies: "@babel/runtime" "^7.8.4" -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - regexp.prototype.flags@^1.4.3: version "1.5.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" @@ -9725,16 +9479,6 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" @@ -9857,34 +9601,29 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: expand-tilde "^2.0.0" global-modules "^1.0.0" +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-global@^1.0.0: +resolve-global@1.0.0, resolve-global@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== dependencies: global-dirs "^0.1.1" -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - resolve.exports@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.8.1: +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.8.1: version "1.22.2" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== @@ -9900,14 +9639,6 @@ responselike@^1.0.2: dependencies: lowercase-keys "^1.0.0" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -9916,11 +9647,6 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - retry@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" @@ -9941,11 +9667,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -right-pad@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/right-pad/-/right-pad-1.0.1.tgz#8ca08c2cbb5b55e74dafa96bf7fd1a27d568c8d0" - integrity sha512-bYBjgxmkvTAfgIYy328fmkwhp39v8lwVgWhhrzxPV3yHtcSqyYKe9/XOhvW48UFjATg3VuJbpsp5822ACNvkmw== - rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -9981,7 +9702,7 @@ rollup@^2.39.0: optionalDependencies: fsevents "~2.3.2" -run-async@^2.2.0, run-async@^2.4.0: +run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== @@ -10000,13 +9721,20 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.4.0, rxjs@^6.6.0: +rxjs@^6.6.0: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" +rxjs@^7.5.5: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + safe-array-concat@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" @@ -10036,13 +9764,6 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -10138,6 +9859,13 @@ semver-regex@^3.1.2: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@7.3.7: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -10162,16 +9890,6 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - sha@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/sha/-/sha-3.0.0.tgz#b2f2f90af690c16a3a839a6a6c680ea51fedd1ae" @@ -10203,15 +9921,6 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@0.7.6: - version "0.7.6" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.6.tgz#379cccfb56b91c8601e4793356eb5382924de9ad" - integrity sha512-sK/rjl+frweS4RL1ifxTb7eIXQaliSCDN5meqwwfDIHSWU7zH2KPTa/2hS6EAgGw7wHzJ3rQHfhnLzktfagSZA== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -10275,36 +9984,6 @@ smob@^0.0.6: resolved "https://registry.yarnpkg.com/smob/-/smob-0.0.6.tgz#09b268fea916158a2781c152044c6155adbb8aa1" integrity sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw== -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - socks-proxy-agent@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" @@ -10351,17 +10030,6 @@ sorted-union-stream@~2.1.3: from2 "^1.3.0" stream-iterate "^1.1.0" -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - source-map-support@0.5.12: version "0.5.12" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" @@ -10393,11 +10061,6 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -10449,13 +10112,6 @@ split-on-first@^1.0.0: resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - split2@^3.0.0: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" @@ -10518,14 +10174,6 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" @@ -10591,7 +10239,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.0.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -10719,12 +10367,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -10902,26 +10545,11 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - to-readable-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -10929,16 +10557,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - tough-cookie@^2.3.3, tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -11014,6 +10632,11 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.1.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -11101,7 +10724,7 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@^4.1.5, typescript@^4.2.3: +typescript@^4.1.5, typescript@^4.2.3, typescript@^4.4.3: version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== @@ -11141,6 +10764,11 @@ underscore.string@~2.2.0rc: resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.2.1.tgz#d7c0fa2af5d5a1a67f4253daee98132e733f0f19" integrity sha512-3FVmhXqelrj6gfgp3Bn6tOavJvW0dNH2T+heTD38JRxIrAbiuzbqjknszoOYj3DyFB1nWiLj208Qt2no/L4cIA== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -11164,16 +10792,6 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -11207,11 +10825,6 @@ universal-user-agent@^6.0.0: resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -11222,14 +10835,6 @@ unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" @@ -11284,11 +10889,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - url-join@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" @@ -11308,11 +10908,6 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - user-home@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" @@ -11402,7 +10997,7 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -wcwidth@^1.0.0: +wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== @@ -11638,6 +11233,19 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.0.0: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yargs@^17.3.1: version "17.7.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967"