From 991c69d46a6c06d11e2f6c74196776104e08889e Mon Sep 17 00:00:00 2001 From: Pongstr Date: Thu, 25 Mar 2021 10:57:39 +0200 Subject: [PATCH 01/13] init --- .eslintrc.js | 6 - .eslintrc.json | 23 + .gitignore | 202 ++++++- .nvmrc | 1 + .prettierrc | 7 + .../OpenAPI 3.0 Sample Project.paw.json | 498 ------------------ src/config.json | 15 + src/index.ts | 65 +-- .../components/auth-converter.ts | 122 +++-- .../components/body-converter.ts | 34 +- .../components/parameters-converter.ts | 131 +++-- .../components/responses-converter.ts | 60 ++- .../paw-to-openapi-converter.ts | 126 ++--- src/lib/paw-utils.ts | 60 ++- src/lib/url.ts | 99 ++-- src/types/openapi-v3.d.ts | 314 +++++++++++ src/{types-paw-api => types}/openapi.d.ts | 97 ++-- src/{types-paw-api => types}/paw.d.ts | 0 tsconfig.json | 13 +- webpack.config.babel.js | 31 +- yarn.lock | 5 + 21 files changed, 1020 insertions(+), 889 deletions(-) delete mode 100644 .eslintrc.js create mode 100644 .eslintrc.json create mode 100644 .nvmrc create mode 100644 .prettierrc delete mode 100644 output_examples/OpenAPI 3.0 Sample Project.paw.json create mode 100644 src/config.json create mode 100644 src/types/openapi-v3.d.ts rename src/{types-paw-api => types}/openapi.d.ts (72%) rename src/{types-paw-api => types}/paw.d.ts (100%) diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 523eff6..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - extends: ['airbnb-typescript/base'], - parserOptions: { - project: './tsconfig.json', - }, -}; diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..61c68d1 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,23 @@ +{ + "env": { + "browser": true, + "es6": true, + "node": true + }, + "extends": [ + "eslint:recommended", + "plugin:import/errors", + "plugin:import/warnings", + "prettier", + "eslint-config-airbnb-typescript-prettier" + ], + "rules": { + "lines-between-class-members": [ + "error", + "always", + { "exceptAfterSingleLine": true } + ] + }, + "parser": "@typescript-eslint/parser", + "ignorePatterns": ["*.js"] +} diff --git a/.gitignore b/.gitignore index 1f7e790..cd1111c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,199 @@ -node_modules -dist -src/__index.ts +## Generated from: +## https://www.toptal.com/developers/gitignore?templates=node,macos,linux,windows + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### macOS ### +# General .DS_Store -.idea +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test +.env*.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Storybook build outputs +.out +.storybook-out +storybook-static + +# rollup.js default build output +dist/ + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# Temporary folders +tmp/ +temp/ + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk +# End of https://www.toptal.com/developers/gitignore/api/node,macos,linux,windows diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..158c006 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v14.16.0 diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..9cd6fca --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +{ + "endOfLine": "lf", + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all" +} diff --git a/output_examples/OpenAPI 3.0 Sample Project.paw.json b/output_examples/OpenAPI 3.0 Sample Project.paw.json deleted file mode 100644 index 7614b91..0000000 --- a/output_examples/OpenAPI 3.0 Sample Project.paw.json +++ /dev/null @@ -1,498 +0,0 @@ -{ - "openapi": "3.0.3", - "info": { - "title": "OpenAPI 3.0 Sample Project.paw", - "version": "1599487424583" - }, - "paths": { - "/api/v3/users/{userId}/": { - "servers": [ - { - "url": "https://echo.paw.cloud/" - } - ], - "get": { - "operationId": "bb4672ed-9007-4519-9030-7b9be1c7ea56", - "summary": "Get User", - "description": "I voluntarily included the Base URL and Authorization header as an environment variable.", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "default": "{\n \"client_ip\": \"91.196.215.178\",\n \"get\": {\n \"fields\": \"username,id,age\"\n },\n \"headers\": {\n \"Accept\": \"application/json\",\n \"Authorization\": \"Bearer SOME_TOKEN\",\n \"Connection\": \"keep-alive\",\n \"Host\": \"echo.paw.cloud\",\n \"User-Agent\": \"Paw/3.1.10 (Macintosh; OS X/10.15.6) GCDHTTPRequest\",\n \"X-Forwarded-Port\": \"443\",\n \"X-Forwarded-Proto\": \"https\"\n },\n \"method\": \"GET\",\n \"path\": \"/api/v3/users/{{userId}}\",\n \"post\": \"\",\n \"url\": \"https://echo.paw.cloud/api/v3/users/%7B%7BuserId%7D%7D?fields=username,id,age\"\n}" - } - } - }, - "description": "Response 200", - "headers": { - "Content-Type": { - "schema": { - "default": "application/json; charset=utf-8" - } - }, - "Access-Control-Allow-Origin": { - "schema": { - "default": "*" - } - }, - "Content-Security-Policy": { - "schema": { - "default": "default-src 'self'; style-src 'unsafe-inline' https://maxcdn.bootstrapcdn.com; font-src https://maxcdn.bootstrapcdn.com/; report-uri https://pawcloud.report-uri.com/r/d/csp/enforce" - } - }, - "X-Xss-Protection": { - "schema": { - "default": "1; mode=block" - } - }, - "Server": { - "schema": { - "default": "nginx/1.17.5" - } - }, - "Access-Control-Allow-Headers": { - "schema": { - "default": "Content-Type" - } - }, - "Referrer-Policy": { - "schema": { - "default": "no-referrer, strict-origin-when-cross-origin" - } - }, - "Date": { - "schema": { - "default": "Fri, 04 Sep 2020 13:07:47 GMT" - } - }, - "X-Robots-Tag": { - "schema": { - "default": "noindex" - } - }, - "Strict-Transport-Security": { - "schema": { - "default": "max-age=31536000; includeSubDomains; preload" - } - }, - "Paw-Location": { - "schema": { - "default": "https://paw.cloud" - } - }, - "Content-Length": { - "schema": { - "default": "589" - } - }, - "Connection": { - "schema": { - "default": "Close" - } - }, - "X-Content-Type-Options": { - "schema": { - "default": "nosniff" - } - }, - "Paw-Content-Types": { - "schema": { - "default": "text/html,text/plain,application/json,application/x-www-form-urlencoded" - } - }, - "Vary": { - "schema": { - "default": "Accept-Encoding, Accept-Encoding" - } - }, - "X-Frame-Options": { - "schema": { - "default": "deny" - } - } - } - }, - "default": { - "description": "Default response" - } - }, - "parameters": [ - { - "name": "fields", - "in": "query", - "schema": { - "type": "string", - "default": "username,id,age", - "description": "Filter fields to be returned" - } - }, - { - "name": "Authorization", - "in": "header", - "schema": { - "type": "string", - "default": "Bearer SOME_TOKEN", - "description": "" - } - }, - { - "name": "Accept", - "in": "header", - "schema": { - "type": "string", - "default": "application/json", - "description": "Accep format. Default \"application/json\"." - } - }, - { - "name": "userId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "default": "42", - "description": "Identifier of the user" - } - } - ], - "security": [ - { - "BearerAuth": [] - } - ] - } - }, - "/api/v3/users/": { - "servers": [ - { - "url": "https://echo.paw.cloud/" - } - ], - "get": { - "operationId": "dabe0a0a-3103-4683-bf5d-d65d0786ae11", - "summary": "List Users", - "description": "", - "responses": { - "default": { - "description": "Default response" - } - }, - "parameters": [ - { - "name": "q", - "in": "query", - "schema": { - "type": "string", - "default": "mittsh", - "description": "Search query" - } - }, - { - "name": "Authorization", - "in": "header", - "schema": { - "type": "string", - "default": "Bearer SOME_TOKEN", - "description": "" - } - }, - { - "name": "Accept", - "in": "header", - "schema": { - "type": "string", - "default": "application/json", - "description": "Accep format. Default \"application/json\"." - } - } - ], - "security": [ - { - "BearerAuth": [] - } - ] - } - }, - "/api/v3/users/{username}/": { - "servers": [ - { - "url": "https://echo.paw.cloud/" - } - ], - "post": { - "operationId": "1c03e7f7-51c5-4b49-877b-c0a98e0ba390", - "summary": "Create User", - "description": "I believe it's ok not to include the description fields included in body. This is possible in Paw, but should be a JSON Schema in OpenAPI 3.0. I think this is not necessary to implement this.\n\nFields contained in the body can be simply ignored when exporting.", - "responses": { - "default": { - "description": "Default response" - } - }, - "parameters": [ - { - "name": "expiry", - "in": "query", - "schema": { - "type": "string", - "default": "2020-09-07T14:03:44+00:00", - "description": "Expiration date of the request. Optional." - } - }, - { - "name": "Authorization", - "in": "header", - "schema": { - "type": "string", - "default": "Bearer SOME_TOKEN", - "description": "" - } - }, - { - "name": "Accept", - "in": "header", - "schema": { - "type": "string", - "default": "application/json", - "description": "Accep format. Default \"application/json\"." - } - }, - { - "name": "Content-Type", - "in": "header", - "schema": { - "type": "string", - "default": "application/json; charset=utf-8", - "description": "" - } - }, - { - "name": "username", - "in": "path", - "required": true, - "schema": { - "type": "string", - "default": "mittsh", - "description": "" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "example": { - "value": { - "id": "uxBdfo5EaoBoocFm", - "username": "mittsh" - } - } - } - } - }, - "security": [ - { - "BearerAuth": [] - } - ] - } - }, - "/instapic/pictures/": { - "servers": [ - { - "url": "https://echo.paw.cloud/" - } - ], - "get": { - "operationId": "a97bd036-f967-477d-b843-940f2655113c", - "summary": "Get Pictures", - "description": "An API that returns pictures. That's an example of an API that won't be using environment variables but only request variables.", - "responses": { - "200": { - "content": { - "text/html": { - "schema": { - "default": "\n\n\n\n \n \n echo\n \n \n\n \n \n \n \n \n
\n

HTTP Echo

\n\n
GET /instapic/pictures/?size=768&q=dogs HTTP/1.1
\n\n

Request

\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
MethodGET
URLhttps://echo.paw.cloud/instapic/pictures/?size=768&q=dogs
Path/instapic/pictures/
Client IP91.196.215.178
\n
\n\n

URL parameters

\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
KeyValue
qdogs
size768
\n
\n\n

Headers

\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
KeyValue
AuthorizationBasic bXl1c2VyOm15cGFzc3dvcmQ=
Connectionkeep-alive
Hostecho.paw.cloud
User-AgentPaw/3.1.10 (Macintosh; OS X/10.15.6) GCDHTTPRequest
X-Forwarded-Port443
X-Forwarded-Protohttps
\n
\n\n

Body

\n \n No request body\n \n\n \n
\n \n\n" - } - } - }, - "description": "Response 200", - "headers": { - "Content-Type": { - "schema": { - "default": "text/html; charset=utf-8" - } - }, - "Access-Control-Allow-Origin": { - "schema": { - "default": "*" - } - }, - "Content-Security-Policy": { - "schema": { - "default": "default-src 'self'; style-src 'unsafe-inline' https://maxcdn.bootstrapcdn.com; font-src https://maxcdn.bootstrapcdn.com/; report-uri https://pawcloud.report-uri.com/r/d/csp/enforce" - } - }, - "X-Xss-Protection": { - "schema": { - "default": "1; mode=block" - } - }, - "Server": { - "schema": { - "default": "nginx/1.17.5" - } - }, - "Access-Control-Allow-Headers": { - "schema": { - "default": "Content-Type" - } - }, - "Referrer-Policy": { - "schema": { - "default": "no-referrer, strict-origin-when-cross-origin" - } - }, - "Date": { - "schema": { - "default": "Fri, 04 Sep 2020 12:56:09 GMT" - } - }, - "X-Robots-Tag": { - "schema": { - "default": "noindex" - } - }, - "Strict-Transport-Security": { - "schema": { - "default": "max-age=31536000; includeSubDomains; preload" - } - }, - "Paw-Location": { - "schema": { - "default": "https://paw.cloud" - } - }, - "Content-Length": { - "schema": { - "default": "4169" - } - }, - "Connection": { - "schema": { - "default": "Close" - } - }, - "X-Content-Type-Options": { - "schema": { - "default": "nosniff" - } - }, - "Paw-Content-Types": { - "schema": { - "default": "text/html,text/plain,application/json,application/x-www-form-urlencoded" - } - }, - "Vary": { - "schema": { - "default": "Accept-Encoding, Accept-Encoding" - } - }, - "X-Frame-Options": { - "schema": { - "default": "deny" - } - } - } - }, - "default": { - "description": "Default response" - } - }, - "parameters": [ - { - "name": "size", - "in": "query", - "schema": { - "type": "string", - "default": "768", - "description": "Max size in pixels. Required." - } - }, - { - "name": "q", - "in": "query", - "schema": { - "type": "string", - "default": "dogs", - "description": "Search pictures by query. Optional." - } - }, - { - "name": "Authorization", - "in": "header", - "schema": { - "type": "string", - "default": "Basic bXl1c2VyOm15cGFzc3dvcmQ=", - "description": "This is a cool auth method." - } - } - ] - } - }, - "/instapic/pictures/{Picture ID}/": { - "servers": [ - { - "url": "https://echo.paw.cloud/" - } - ], - "get": { - "operationId": "89dc13e4-af71-4b45-8047-d0c4a32b6b18", - "summary": "Get A Picture", - "description": "An API that returns pictures. That's an example of an API that won't be using environment variables but only request variables.", - "responses": { - "default": { - "description": "Default response" - } - }, - "parameters": [ - { - "name": "size", - "in": "query", - "schema": { - "type": "string", - "default": "768", - "description": "Max size in pixels to return. Required." - } - }, - { - "name": "Authorization", - "in": "header", - "schema": { - "type": "string", - "default": "Basic bXl1c2VyOm15cGFzc3dvcmQ=", - "description": "This is a cool auth method." - } - }, - { - "name": "Picture ID", - "in": "path", - "required": true, - "schema": { - "type": "string", - "default": "4242", - "description": "ID of the picture to get." - } - } - ] - } - } - }, - "components": { - "securitySchemes": { - "BearerAuth": { - "type": "http", - "scheme": "bearer" - } - } - } -} diff --git a/src/config.json b/src/config.json new file mode 100644 index 0000000..e7c8c71 --- /dev/null +++ b/src/config.json @@ -0,0 +1,15 @@ +{ + "title": "OpenAPI 3.0", + "identifier": "com.luckymarmot.PawExtensions.OpenAPIGenerator", + "fileExtension": "json", + "languageHighlighter": "json", + "debug": false, + "targetPath": "/Library/Containers/com.luckymarmot.Paw/Data/Library/Application Support/com.luckymarmot.Paw/Extensions", + "options": { + "inputs": {}, + "file": { + "name": "", + "path": "" + } + } +} diff --git a/src/index.ts b/src/index.ts index eb1c4c1..815f707 100755 --- a/src/index.ts +++ b/src/index.ts @@ -1,33 +1,37 @@ /* eslint-disable class-methods-use-this */ -import Yaml from 'yaml'; +import Yaml from 'yaml' // eslint-disable-next-line import/extensions -import Paw from './types-paw-api/paw'; -import Console from './lib/console'; -import PawToOpenapiConverter from './lib/paw-to-openapi-converter/paw-to-openapi-converter'; +import Paw from 'types/paw' +import Console from 'lib/console' +import PawToOpenapiConverter from './lib/paw-to-openapi-converter/paw-to-openapi-converter' +import extension from './config.json' + +const { + title, + identifier, + fileExtension, + languageHighlighter, + debug, + options, +} = extension /** * @TODO * Can it be done manually from some input? */ -const exportFormat = 'json'; +const exportFormat = 'json' // const exportFormat = 'yaml' class OpenAPIGenerator implements Paw.Generator { - static identifier = 'com.luckymarmot.PawExtensions.OpenAPIGenerator'; + static title = title + static identifier = identifier + static fileExtension = fileExtension + static languageHighlighter = languageHighlighter + public options = options + public context: Paw.Context + public converter: PawToOpenapiConverter = new PawToOpenapiConverter() + public debug: boolean = debug - static title = 'OpenAPI 3.0'; - - static languageHighlighter = exportFormat; - - static fileExtension = exportFormat; - - context: Paw.Context; - - converter: PawToOpenapiConverter = new PawToOpenapiConverter(); - - debug: boolean = false; // output all Paw data - - // eslint-disable-next-line @typescript-eslint/no-unused-vars public generate( context: Paw.Context, requests: Paw.Request[], @@ -35,23 +39,22 @@ class OpenAPIGenerator implements Paw.Generator { ): string { if (this.debug) { const allPawData = { - context, requests, options, - }; - - return Console.stringifyWithCyclicSupport(allPawData); + context, + requests, + options, + } + return Console.stringifyWithCyclicSupport(allPawData) } - this.context = context; - - this.converter.convert(context, requests); - - const openApi = this.converter.generateOutput(); + this.context = context + this.converter.convert(context, requests) + const openApi = this.converter.generateOutput() if (OpenAPIGenerator.fileExtension === 'json') { - return JSON.stringify(openApi, null, 2); + return JSON.stringify(openApi, null, 2) } - return Yaml.stringify(openApi); + return Yaml.stringify(openApi) } } -registerCodeGenerator(OpenAPIGenerator); +registerCodeGenerator(OpenAPIGenerator) diff --git a/src/lib/paw-to-openapi-converter/components/auth-converter.ts b/src/lib/paw-to-openapi-converter/components/auth-converter.ts index ce81f07..a6489f1 100644 --- a/src/lib/paw-to-openapi-converter/components/auth-converter.ts +++ b/src/lib/paw-to-openapi-converter/components/auth-converter.ts @@ -1,145 +1,157 @@ -import { Md5 } from 'md5-typescript'; +import { Md5 } from 'md5-typescript' // eslint-disable-next-line import/extensions -import Paw from '../../../types-paw-api/paw'; +import Paw from 'types/paw' // eslint-disable-next-line import/extensions -import OpenAPI, { MapKeyedWithString, BasicCredentialsLabel, OAuth2CredentialsLabel } from '../../../types-paw-api/openapi'; +import OpenAPI, { + MapKeyedWithString, + BasicCredentialsLabel, + OAuth2CredentialsLabel, +} from 'types/openapi' export type AuthConverterType = [ string, OpenAPI.SecurityRequirementObject, OpenAPI.SecuritySchemeObject, -]; +] export default class AuthConverter { - private readonly request: Paw.Request; + private readonly request: Paw.Request - private authFound: boolean; + private authFound: boolean - private readonly existingSecuritySchemes: MapKeyedWithString; + private readonly existingSecuritySchemes: MapKeyedWithString - private key: string; + private key: string - private requirement: OpenAPI.SecurityRequirementObject; + private requirement: OpenAPI.SecurityRequirementObject - private scheme: OpenAPI.SecuritySchemeObject; + private scheme: OpenAPI.SecuritySchemeObject constructor( request: Paw.Request, existingSecuritySchemes: MapKeyedWithString, ) { - this.request = request; - this.authFound = false; - this.existingSecuritySchemes = existingSecuritySchemes; + this.request = request + this.authFound = false + this.existingSecuritySchemes = existingSecuritySchemes - this.parseBasicAuth(); + this.parseBasicAuth() if (!this.authFound) { - this.parseOAuth2Auth(); + this.parseOAuth2Auth() } if (!this.authFound) { - this.parseHttpBearerAuth(); + this.parseHttpBearerAuth() } } getOutput(): AuthConverterType { - return [ - this.key, - this.requirement, - this.scheme, - ]; + return [this.key, this.requirement, this.scheme] } private parseBasicAuth(): void { if (this.request.httpBasicAuth) { - this.key = BasicCredentialsLabel; - this.requirement = {}; + this.key = BasicCredentialsLabel + this.requirement = {} this.scheme = { type: 'http', scheme: 'basic', - }; + } - this.requirement[this.key] = []; + this.requirement[this.key] = [] - this.authFound = true; + this.authFound = true } } // eslint-disable-next-line class-methods-use-this private parseHttpBearerAuth(): void { - const authHeader = this.request.getHeaderByName('authorization'); + const authHeader = this.request.getHeaderByName('authorization') if (authHeader && (authHeader as string).match(/bearer /i)) { - this.requirement = {}; - this.key = 'BearerAuth'; + this.requirement = {} + this.key = 'BearerAuth' this.scheme = { type: 'http', scheme: 'bearer', - }; + } - this.requirement[this.key] = []; + this.requirement[this.key] = [] - this.authFound = true; + this.authFound = true } } // eslint-disable-next-line class-methods-use-this private parseOAuth2Auth(): void { - const { oauth2 } = this.request; + const { oauth2 } = this.request if (oauth2) { - this.requirement = {}; + this.requirement = {} const keyHash = AuthConverter.generateKeyHash( oauth2.grant_type as string, oauth2.authorization_uri as string, oauth2.access_token_uri as string, oauth2.scope as string, - ); - this.key = `${OAuth2CredentialsLabel} ${keyHash}`; - let sameAuthFound = false; - - if (this.existingSecuritySchemes && typeof this.existingSecuritySchemes[this.key] !== 'undefined') { - sameAuthFound = true; - this.scheme = this.existingSecuritySchemes[this.key]; + ) + this.key = `${OAuth2CredentialsLabel} ${keyHash}` + let sameAuthFound = false + + if ( + this.existingSecuritySchemes && + typeof this.existingSecuritySchemes[this.key] !== 'undefined' + ) { + sameAuthFound = true + this.scheme = this.existingSecuritySchemes[this.key] } if (!sameAuthFound) { - const grantType: string = AuthConverter.camelCaseToCapital(oauth2.grant_type as string); - const scopes = AuthConverter.convertScopes(oauth2.scope as string); + const grantType: string = AuthConverter.camelCaseToCapital( + oauth2.grant_type as string, + ) + const scopes = AuthConverter.convertScopes(oauth2.scope as string) - const flows: MapKeyedWithString = {}; + const flows: MapKeyedWithString = {} flows[grantType] = { authorizationUrl: oauth2.authorization_uri, tokenUrl: oauth2.access_token_uri, scopes, - } as OpenAPI.OAuthFlowObject; + } as OpenAPI.OAuthFlowObject this.scheme = { type: 'oauth2', flows, - }; + } } - this.requirement[this.key] = []; + this.requirement[this.key] = [] - this.authFound = true; + this.authFound = true } } static camelCaseToCapital(string: string) { - return string.replace(/[_][a-z]/g, (snakeWithLetter) => snakeWithLetter.toUpperCase().replace('_', '')); + return string.replace(/[_][a-z]/g, (snakeWithLetter) => + snakeWithLetter.toUpperCase().replace('_', ''), + ) } static convertScopes(pawScopes: string) { - const openAPIScopes: MapKeyedWithString = {}; + const openAPIScopes: MapKeyedWithString = {} pawScopes.split(' ').forEach((singlePawScope) => { - openAPIScopes[singlePawScope] = singlePawScope; - }); + openAPIScopes[singlePawScope] = singlePawScope + }) - return openAPIScopes; + return openAPIScopes } - static generateKeyHash(grantType: string, authUrl: string, tokenUrl: string, scopes: string) { - return Md5.init(grantType + authUrl + tokenUrl + scopes); + static generateKeyHash( + grantType: string, + authUrl: string, + tokenUrl: string, + scopes: string, + ) { + return Md5.init(grantType + authUrl + tokenUrl + scopes) } } diff --git a/src/lib/paw-to-openapi-converter/components/body-converter.ts b/src/lib/paw-to-openapi-converter/components/body-converter.ts index e5fbb09..9b66266 100644 --- a/src/lib/paw-to-openapi-converter/components/body-converter.ts +++ b/src/lib/paw-to-openapi-converter/components/body-converter.ts @@ -1,47 +1,47 @@ // eslint-disable-next-line import/extensions -import Paw from '../../../types-paw-api/paw'; +import Paw from 'types/paw.d' // eslint-disable-next-line import/extensions -import OpenAPI from '../../../types-paw-api/openapi'; +import OpenAPI from 'types/openapi.d' export default class BodyConverter { - private request: Paw.Request; + private request: Paw.Request - private body: OpenAPI.RequestBodyObject; + private body: OpenAPI.RequestBodyObject constructor(request: Paw.Request, bodyContentType: string) { - this.request = request; + this.request = request - this.parseBody(bodyContentType); + this.parseBody(bodyContentType) } getOutput(): OpenAPI.RequestBodyObject { - return this.body; + return this.body } private parseBody(bodyContentType: string): void { - let body; + let body switch (bodyContentType.toLowerCase()) { case 'application/json': - body = this.request.jsonBody; - break; + body = this.request.jsonBody + break case 'application/x-www-form-urlencoded': - body = this.request.urlEncodedBody; - break; + body = this.request.urlEncodedBody + break case 'multipart/form-data': - body = this.request.multipartBody; - break; + body = this.request.multipartBody + break default: - body = this.request.body; + body = this.request.body } if (body) { - this.body = { content: {} }; + this.body = { content: {} } this.body.content[bodyContentType] = { example: { value: body, } as OpenAPI.ExampleObject, - }; + } } } } diff --git a/src/lib/paw-to-openapi-converter/components/parameters-converter.ts b/src/lib/paw-to-openapi-converter/components/parameters-converter.ts index bdd0ada..ddb67fc 100644 --- a/src/lib/paw-to-openapi-converter/components/parameters-converter.ts +++ b/src/lib/paw-to-openapi-converter/components/parameters-converter.ts @@ -1,30 +1,30 @@ // eslint-disable-next-line import/extensions -import Paw from '../../../types-paw-api/paw'; +import Paw from 'types/paw' // eslint-disable-next-line import/extensions -import OpenAPI, { NonRequiredLabel } from '../../../types-paw-api/openapi'; +import OpenAPI, { NonRequiredLabel } from 'types/openapi' export default class ParametersConverter { - private request: Paw.Request; + private request: Paw.Request - private readonly parameters: OpenAPI.ParameterObject[]; + private readonly parameters: OpenAPI.ParameterObject[] - private bodyContentType: string = 'text/plain'; + private bodyContentType: string = 'text/plain' constructor(request: Paw.Request) { - this.request = request; - this.parameters = []; + this.request = request + this.parameters = [] - this.parseQueryParams(); - this.parseHeaders(); - this.parsePathParams(); + this.parseQueryParams() + this.parseHeaders() + this.parsePathParams() } getBodyContentType() { - return this.bodyContentType; + return this.bodyContentType } getParameters(): OpenAPI.ParameterObject[] { - return this.parameters; + return this.parameters } private parseQueryParams(): void { @@ -32,97 +32,116 @@ export default class ParametersConverter { const schema: OpenAPI.SchemaObject = { type: 'string', default: this.request.urlParameters[paramName] ?? '', - description: this.request.getVariableByName(paramName)?.description ?? '', - }; + description: + this.request.getVariableByName(paramName)?.description ?? '', + } this.parameters.push({ name: paramName, in: 'query', schema, - }); - }); + }) + }) } private parseHeaders(): void { - Object.entries(this.request.headers).forEach(([headerName, headerValue]) => { - if (headerName.toLowerCase() === 'cookie') { - this.parseCookies((headerValue ?? '') as string); - } else { - const schema: OpenAPI.SchemaObject = { - type: 'string', - default: headerValue ?? '', - description: this.request.getVariableByName(headerName)?.description ?? '', - }; - - if (headerName.toLowerCase() === 'content-type' && schema.default !== '') { - if (schema.default.toLowerCase().indexOf('application/json') >= 0) { - this.bodyContentType = 'application/json'; - } else if (schema.default.toLowerCase().indexOf('application/xml') >= 0) { - this.bodyContentType = 'application/xml'; - } else if (schema.default.toLowerCase().indexOf('application/x-www-form-urlencoded') >= 0) { - this.bodyContentType = 'application/x-www-form-urlencoded'; - } else if (schema.default.toLowerCase().indexOf('multipart/form-data') >= 0) { - this.bodyContentType = 'multipart/form-data'; + Object.entries(this.request.headers).forEach( + ([headerName, headerValue]) => { + if (headerName.toLowerCase() === 'cookie') { + this.parseCookies((headerValue ?? '') as string) + } else { + const schema: OpenAPI.SchemaObject = { + type: 'string', + default: headerValue ?? '', + description: + this.request.getVariableByName(headerName)?.description ?? '', } - } - this.parameters.push({ - name: headerName, - in: 'header', - schema, - }); - } - }); + if ( + headerName.toLowerCase() === 'content-type' && + schema.default !== '' + ) { + if (schema.default.toLowerCase().indexOf('application/json') >= 0) { + this.bodyContentType = 'application/json' + } else if ( + schema.default.toLowerCase().indexOf('application/xml') >= 0 + ) { + this.bodyContentType = 'application/xml' + } else if ( + schema.default + .toLowerCase() + .indexOf('application/x-www-form-urlencoded') >= 0 + ) { + this.bodyContentType = 'application/x-www-form-urlencoded' + } else if ( + schema.default.toLowerCase().indexOf('multipart/form-data') >= 0 + ) { + this.bodyContentType = 'multipart/form-data' + } + } + + this.parameters.push({ + name: headerName, + in: 'header', + schema, + }) + } + }, + ) } private parseCookies(cookiesString: string): void { // eslint-disable-next-line array-callback-return cookiesString.split('; ').map((cookieString) => { - const [cookieName, cookieValue] = cookieString.split('='); + const [cookieName, cookieValue] = cookieString.split('=') const schema: OpenAPI.SchemaObject = { type: 'string', default: cookieValue, - }; + } const newParam: OpenAPI.ParameterObject = { name: cookieName, in: 'cookie', schema, - }; + } - this.parameters.push(newParam); - }); + this.parameters.push(newParam) + }) } private parsePathParams(): void { if (this.request.variables.length > 0) { this.request.variables.forEach((variable) => { - if (variable && !this.parameters.some((param) => param.name === variable.name)) { + if ( + variable && + !this.parameters.some((param) => param.name === variable.name) + ) { const newParam: OpenAPI.ParameterObject = { name: variable.name, in: 'path', required: true, - }; + } - const variableValue = variable.getCurrentValue(); + const variableValue = variable.getCurrentValue() if (!variable.required) { - newParam.example = { // just to inform Paw while importing back that exported file + newParam.example = { + // just to inform Paw while importing back that exported file summary: NonRequiredLabel, value: true, - }; + } } newParam.schema = { type: 'string', default: variableValue ?? '', description: variable.description ?? '', - }; + } - this.parameters.push(newParam); + this.parameters.push(newParam) } - }); + }) } } } diff --git a/src/lib/paw-to-openapi-converter/components/responses-converter.ts b/src/lib/paw-to-openapi-converter/components/responses-converter.ts index 4f3129f..0d734ab 100644 --- a/src/lib/paw-to-openapi-converter/components/responses-converter.ts +++ b/src/lib/paw-to-openapi-converter/components/responses-converter.ts @@ -1,54 +1,58 @@ // eslint-disable-next-line import/extensions -import Paw from '../../../types-paw-api/paw'; +import Paw from 'types/paw' // eslint-disable-next-line import/extensions -import OpenAPI, { MapKeyedWithString } from '../../../types-paw-api/openapi'; +import OpenAPI, { MapKeyedWithString } from 'types/openapi' export default class ResponsesConverter { - private request: Paw.Request; + private request: Paw.Request - private readonly responses: OpenAPI.ResponsesObject; + private readonly responses: OpenAPI.ResponsesObject constructor(request: Paw.Request) { - this.request = request; + this.request = request this.responses = { default: { description: 'Default response', } as OpenAPI.ResponseObject, - } as OpenAPI.ResponsesObject; + } as OpenAPI.ResponsesObject - this.parsePawResponses(); + this.parsePawResponses() } getOutput(): OpenAPI.ResponsesObject { - return this.responses; + return this.responses } private parsePawResponses() { - const lastExchange = this.request.getLastExchange(); + const lastExchange = this.request.getLastExchange() if (lastExchange) { - const content = {} as MapKeyedWithString; - const description = `Response ${lastExchange.responseStatusCode}`; - const headers = {} as MapKeyedWithString; - - Object.entries(lastExchange.responseHeaders).forEach(([headerName, headerContent]) => { - headers[headerName] = { - schema: { - default: headerContent, - }, - }; - - if (headerName.toLowerCase() === 'content-type') { - content[headerContent.replace(/;.+/, '')] = { + const content = {} as MapKeyedWithString + const description = `Response ${lastExchange.responseStatusCode}` + const headers = {} as MapKeyedWithString + + Object.entries(lastExchange.responseHeaders).forEach( + ([headerName, headerContent]) => { + headers[headerName] = { schema: { - default: lastExchange.responseBody, + default: headerContent, }, - }; - } - }); + } + + if (headerName.toLowerCase() === 'content-type') { + content[headerContent.replace(/;.+/, '')] = { + schema: { + default: lastExchange.responseBody, + }, + } + } + }, + ) this.responses[lastExchange.responseStatusCode] = { - content, description, headers, - } as OpenAPI.ResponseObject; + content, + description, + headers, + } as OpenAPI.ResponseObject } } } diff --git a/src/lib/paw-to-openapi-converter/paw-to-openapi-converter.ts b/src/lib/paw-to-openapi-converter/paw-to-openapi-converter.ts index 6a5a125..1815f1a 100644 --- a/src/lib/paw-to-openapi-converter/paw-to-openapi-converter.ts +++ b/src/lib/paw-to-openapi-converter/paw-to-openapi-converter.ts @@ -1,51 +1,52 @@ // eslint-disable-next-line import/extensions -import Paw from '../../types-paw-api/paw'; +import Paw from 'types/paw' // eslint-disable-next-line import/extensions -import OpenAPI, { MapKeyedWithString } from '../../types-paw-api/openapi'; -import { convertEnvString } from '../paw-utils'; -import URL from '../url'; -import AuthConverter, { AuthConverterType } from './components/auth-converter'; -import BodyConverter from './components/body-converter'; -import ParametersConverter from './components/parameters-converter'; -import ResponsesConverter from './components/responses-converter'; -import Console from "../console"; +import OpenAPI, { MapKeyedWithString } from 'types/openapi' +import { convertEnvString } from '../paw-utils' +import URL from '../url' +import AuthConverter, { AuthConverterType } from './components/auth-converter' +import BodyConverter from './components/body-converter' +import ParametersConverter from './components/parameters-converter' +import ResponsesConverter from './components/responses-converter' +import Console from '../console' export default class PawToOpenapiConverter { - private readonly info: OpenAPI.InfoObject; + private readonly info: OpenAPI.InfoObject - private readonly paths: OpenAPI.PathsObject; + private readonly paths: OpenAPI.PathsObject - private readonly components: OpenAPI.ComponentsObject; + private readonly components: OpenAPI.ComponentsObject constructor() { this.info = { title: 'OpenAPI export', version: Date.now().toString(), - }; - this.paths = {}; + } + this.paths = {} this.components = { securitySchemes: {}, - }; + } } convert(context: Paw.Context, requests: Paw.Request[]) { - this.generateInfo(context); + this.generateInfo(context) requests.forEach((request: Paw.Request) => { - const parametersConverter = new ParametersConverter(request); + const parametersConverter = new ParametersConverter(request) - const parameters = parametersConverter.getParameters(); + const parameters = parametersConverter.getParameters() - const url = new URL(request, context, parameters); + const url = new URL(request, context, parameters) const body = PawToOpenapiConverter.generateBody( request, parametersConverter.getBodyContentType(), - ); + ) const auth = PawToOpenapiConverter.generateAuth( request, - this.components.securitySchemes as MapKeyedWithString, - ); - const responses = PawToOpenapiConverter.generateResponses(request); + this.components + .securitySchemes as MapKeyedWithString, + ) + const responses = PawToOpenapiConverter.generateResponses(request) this.paths[url.pathname] = this.generatePathItem( request, @@ -54,8 +55,8 @@ export default class PawToOpenapiConverter { body, auth, responses, - ); - }); + ) + }) } generateOutput(): OpenAPI.OpenAPIObject { @@ -64,12 +65,12 @@ export default class PawToOpenapiConverter { info: this.info, paths: this.paths, components: this.components, - }; + } } private generateInfo(context: Paw.Context): void { if (context.document.name) { - this.info.title = context.document.name; + this.info.title = context.document.name } } @@ -77,7 +78,7 @@ export default class PawToOpenapiConverter { request: Paw.Request, parameters: OpenAPI.ParameterObject[], url: URL, - body: (OpenAPI.RequestBodyObject | null), + body: OpenAPI.RequestBodyObject | null, auth: AuthConverterType, responses: OpenAPI.ResponsesObject, ): OpenAPI.PathItemObject { @@ -86,31 +87,34 @@ export default class PawToOpenapiConverter { summary: request.name, description: request.description, responses, - }; + } if (parameters.length > 0) { - operation.parameters = parameters; + operation.parameters = parameters } if (body) { - operation.requestBody = body; + operation.requestBody = body } - const [authKey, authRequirement, authScheme] = auth; + const [authKey, authRequirement, authScheme] = auth if (authKey && authRequirement && authScheme) { if (this.components.securitySchemes) { - this.components.securitySchemes[authKey] = authScheme; + this.components.securitySchemes[authKey] = authScheme } - operation.security = [authRequirement]; + operation.security = [authRequirement] } - let pathItem: OpenAPI.PathItemObject; + let pathItem: OpenAPI.PathItemObject if (this.paths[url.pathname]) { - pathItem = this.paths[url.pathname]; - if (pathItem.servers && !pathItem.servers.some((server) => server.url === url.hostname)) { - pathItem.servers.push({ url: url.hostname }); + pathItem = this.paths[url.pathname] + if ( + pathItem.servers && + !pathItem.servers.some((server) => server.url === url.hostname) + ) { + pathItem.servers.push({ url: url.hostname }) } } else { pathItem = { @@ -119,56 +123,56 @@ export default class PawToOpenapiConverter { url: url.hostname, }, ], - }; + } } switch (request.method) { case 'GET': - pathItem.get = !pathItem.get ? operation : pathItem.get; - break; + pathItem.get = !pathItem.get ? operation : pathItem.get + break case 'POST': - pathItem.post = !pathItem.post ? operation : pathItem.post; - break; + pathItem.post = !pathItem.post ? operation : pathItem.post + break case 'DELETE': - pathItem.delete = !pathItem.delete ? operation : pathItem.delete; - break; + pathItem.delete = !pathItem.delete ? operation : pathItem.delete + break case 'OPTIONS': - pathItem.options = !pathItem.options ? operation : pathItem.options; - break; + pathItem.options = !pathItem.options ? operation : pathItem.options + break case 'HEAD': - pathItem.head = !pathItem.head ? operation : pathItem.head; - break; + pathItem.head = !pathItem.head ? operation : pathItem.head + break case 'PATCH': - pathItem.patch = !pathItem.patch ? operation : pathItem.patch; - break; + pathItem.patch = !pathItem.patch ? operation : pathItem.patch + break case 'TRACE': - pathItem.trace = !pathItem.trace ? operation : pathItem.trace; - break; + pathItem.trace = !pathItem.trace ? operation : pathItem.trace + break default: - // nothing + // nothing } - return pathItem; + return pathItem } static generateBody( request: Paw.Request, bodyContentType: string, ): OpenAPI.RequestBodyObject | null { - const bodyConverter = new BodyConverter(request, bodyContentType); - return bodyConverter.getOutput(); + const bodyConverter = new BodyConverter(request, bodyContentType) + return bodyConverter.getOutput() } static generateAuth( request: Paw.Request, existingSecuritySchemes: MapKeyedWithString, ): AuthConverterType { - const authConverter = new AuthConverter(request, existingSecuritySchemes); - return authConverter.getOutput(); + const authConverter = new AuthConverter(request, existingSecuritySchemes) + return authConverter.getOutput() } static generateResponses(request: Paw.Request): OpenAPI.ResponsesObject { - const responsesConverter = new ResponsesConverter(request); - return responsesConverter.getOutput(); + const responsesConverter = new ResponsesConverter(request) + return responsesConverter.getOutput() } } diff --git a/src/lib/paw-utils.ts b/src/lib/paw-utils.ts index 38dc20a..90d53ea 100755 --- a/src/lib/paw-utils.ts +++ b/src/lib/paw-utils.ts @@ -1,50 +1,54 @@ // eslint-disable-next-line import/extensions -import Paw from '../types-paw-api/paw'; +import Paw from 'types/paw' -const makeDv = (type: string, properties?: {[key:string]:any}): DynamicValue => ( - new DynamicValue(type, properties) -); +const makeDv = ( + type: string, + properties?: { [key: string]: any }, +): DynamicValue => new DynamicValue(type, properties) -const makeDs = (...components: Paw.DynamicStringComponent[]): DynamicString => ( +const makeDs = (...components: Paw.DynamicStringComponent[]): DynamicString => new DynamicString(...components) -); -const makeEnvDv = (variableId: string): DynamicValue => ( +const makeEnvDv = (variableId: string): DynamicValue => makeDv('com.luckymarmot.EnvironmentVariableDynamicValue', { environmentVariable: variableId, }) -); -const makeRequestDv = (variableId: string): DynamicValue => ( +const makeRequestDv = (variableId: string): DynamicValue => makeDv('com.luckymarmot.RequestVariableDynamicValue', { variableUUID: variableId, }) -); -const makeFileDv = (): DynamicValue => ( +const makeFileDv = (): DynamicValue => makeDv('com.luckymarmot.FileContentDynamicValue', { bookmarkData: null, }) -); -const convertEnvString = (dynamicString: DynamicString, context: Paw.Context): string => { +const convertEnvString = ( + dynamicString: DynamicString, + context: Paw.Context, +): string => { if (!dynamicString) { - return ''; + return '' } - return dynamicString.components.map((component): string => { - if (typeof component === 'string') { - return component; - } - if (component.type === 'com.luckymarmot.EnvironmentVariableDynamicValue') { - const envVarId = (component as any).environmentVariable; - const envVar = context.getEnvironmentVariableById(envVarId); - if (envVar) { - return `{${envVar.name}}`; + return dynamicString.components + .map((component): string => { + if (typeof component === 'string') { + return component } - } - return component.getEvaluatedString(); - }).join(''); -}; + if ( + component.type === 'com.luckymarmot.EnvironmentVariableDynamicValue' + ) { + const envVarId = (component as any).environmentVariable + const envVar = context.getEnvironmentVariableById(envVarId) + if (envVar) { + return `{${envVar.name}}` + } + } + return component.getEvaluatedString() + }) + .join('') +} export { makeDv, @@ -53,4 +57,4 @@ export { makeRequestDv, makeFileDv, convertEnvString, -}; +} diff --git a/src/lib/url.ts b/src/lib/url.ts index 54a4a49..f85d523 100644 --- a/src/lib/url.ts +++ b/src/lib/url.ts @@ -1,72 +1,85 @@ // eslint-disable-next-line import/extensions -import OpenAPI from '../types-paw-api/openapi'; +import OpenAPI from 'types/openapi' // eslint-disable-next-line import/extensions -import Paw from '../types-paw-api/paw'; -import { convertEnvString } from './paw-utils'; +import Paw from 'types/paw' +import { convertEnvString } from './paw-utils' export default class URL { - hostname: string; + hostname: string - pathname: string; + pathname: string - port: string; + port: string - fullUrl: string; + fullUrl: string - constructor(request: Paw.Request, context: Paw.Context, parameters: OpenAPI.ParameterObject[]) { + constructor( + request: Paw.Request, + context: Paw.Context, + parameters: OpenAPI.ParameterObject[], + ) { this.fullUrl = convertEnvString( request.getUrl(true) as DynamicString, context, - ); + ) - const urlRegex = /^([^:]+):\/\/([^:/]+)(?::([0-9]*))?(?:(\/.*))?\??$/i; + const urlRegex = /^([^:]+):\/\/([^:/]+)(?::([0-9]*))?(?:(\/.*))?\??$/i - let match = this.fullUrl.match(urlRegex); + let match = this.fullUrl.match(urlRegex) if (match) { - this.parseMatches(match); + this.parseMatches(match) } else { - this.fullUrl = request.urlBase; - match = this.fullUrl.match(urlRegex); - this.parseMatches(match); + this.fullUrl = request.urlBase + match = this.fullUrl.match(urlRegex) + this.parseMatches(match) } - this.parseParameters(parameters); + this.parseParameters(parameters) } public replacePathParam(variableValue: string, variableName: string): void { if (this.pathname.indexOf(`/${variableValue}/`) < 0) { - throw new Error('Param cannot be replaced'); + throw new Error('Param cannot be replaced') } - this.pathname = this.pathname.replace(`/${variableValue}/`, `/{${variableName}}/`); + this.pathname = this.pathname.replace( + `/${variableValue}/`, + `/{${variableName}}/`, + ) } public addPathParam(variableName: string): void { - this.pathname = `${this.pathname}{${variableName}}/`; + this.pathname = `${this.pathname}{${variableName}}/` } - private parseMatches(match: RegExpMatchArray|null) { + private parseMatches(match: RegExpMatchArray | null) { if (match) { if (match[2]) { - let host = 'http'; + let host = 'http' if (match[1]) { // eslint-disable-next-line prefer-destructuring - host = match[1]; + host = match[1] } - this.hostname = URL.addSlashAtEnd(`${host}://${match[2]}`); + this.hostname = URL.addSlashAtEnd(`${host}://${match[2]}`) } if (match[3]) { // eslint-disable-next-line prefer-destructuring - this.port = match[3]; + this.port = match[3] } if (match[4]) { - this.pathname = decodeURI(URL.addSlashAtEnd(match[4].replace(new RegExp('//', 'g'), '/').replace(new RegExp('\\?.*'), ''))); + this.pathname = decodeURI( + URL.addSlashAtEnd( + match[4] + .replace(new RegExp('//', 'g'), '/') + .replace(new RegExp('\\?.*'), ''), + ), + ) } else { - this.pathname = '/'; + this.pathname = '/' } } } @@ -74,36 +87,40 @@ export default class URL { private parseParameters(parameters: OpenAPI.ParameterObject[]) { parameters.forEach((param) => { if ( - param.in === 'path' - && param.name - && typeof (param?.schema as OpenAPI.SchemaObject).default !== 'undefined' - && this.pathname.indexOf(`{${param.name}}`) < 0 - && this.hostname.indexOf(`{${param.name}}`) < 0 + param.in === 'path' && + param.name && + typeof (param?.schema as OpenAPI.SchemaObject).default !== + 'undefined' && + this.pathname.indexOf(`{${param.name}}`) < 0 && + this.hostname.indexOf(`{${param.name}}`) < 0 ) { - const paramName = param.name; - const paramValue = (param.schema as OpenAPI.SchemaObject).default; - if (paramValue !== null && (paramValue === '0' || (paramValue as string).length > 0)) { + const paramName = param.name + const paramValue = (param.schema as OpenAPI.SchemaObject).default + if ( + paramValue !== null && + (paramValue === '0' || (paramValue as string).length > 0) + ) { try { - this.replacePathParam(paramValue as string, paramName); + this.replacePathParam(paramValue as string, paramName) } catch (error) { - this.addPathParam(paramName); + this.addPathParam(paramName) } } else { try { - this.replacePathParam('', paramName); // hacky way to try insert empty value in correct place in URL -> try replace "//" with "/{param_name}/" + this.replacePathParam('', paramName) // hacky way to try insert empty value in correct place in URL -> try replace "//" with "/{param_name}/" } catch (error) { - this.addPathParam(paramName); + this.addPathParam(paramName) } } } - }); + }) } static addSlashAtEnd(variable: string): string { if (variable[variable.length - 1] !== '/') { - return `${variable}/`; + return `${variable}/` } - return variable; + return variable } } diff --git a/src/types/openapi-v3.d.ts b/src/types/openapi-v3.d.ts new file mode 100644 index 0000000..a16cf70 --- /dev/null +++ b/src/types/openapi-v3.d.ts @@ -0,0 +1,314 @@ +declare namespace OpenAPIV3 { + interface Document { + openapi: string + info: InfoObject + servers?: ServerObject[] + paths: PathsObject + components?: ComponentsObject + security?: SecurityRequirementObject[] + tags?: TagObject[] + externalDocs?: ExternalDocumentationObject + 'x-express-openapi-additional-middleware'?: ( + | ((request: any, response: any, next: any) => Promise) + | ((request: any, response: any, next: any) => void) + )[] + 'x-express-openapi-validation-strict'?: boolean + } + + interface InfoObject { + title: string + description?: string + termsOfService?: string + contact?: ContactObject + license?: LicenseObject + version: string + } + + interface ContactObject { + name?: string + url?: string + email?: string + } + + interface LicenseObject { + name: string + url?: string + } + + interface ServerObject { + url: string + description?: string + variables?: { [variable: string]: ServerVariableObject } + } + + interface ServerVariableObject { + enum?: string[] + default: string + description?: string + } + + interface PathsObject { + [pattern: string]: PathItemObject | undefined + } + + interface PathItemObject { + $ref?: string + summary?: string + description?: string + get?: OperationObject + put?: OperationObject + post?: OperationObject + delete?: OperationObject + options?: OperationObject + head?: OperationObject + patch?: OperationObject + trace?: OperationObject + servers?: ServerObject[] + parameters?: (ReferenceObject | ParameterObject)[] + } + + type OperationObject = { + tags?: string[] + summary?: string + description?: string + externalDocs?: ExternalDocumentationObject + operationId?: string + parameters?: (ReferenceObject | ParameterObject)[] + requestBody?: ReferenceObject | RequestBodyObject + responses?: ResponsesObject + callbacks?: { [callback: string]: ReferenceObject | CallbackObject } + deprecated?: boolean + security?: SecurityRequirementObject[] + servers?: ServerObject[] + } & T + + interface ExternalDocumentationObject { + description?: string + url: string + } + + interface ParameterObject extends ParameterBaseObject { + name: string + in: string + } + + interface HeaderObject extends ParameterBaseObject {} + + interface ParameterBaseObject { + description?: string + required?: boolean + deprecated?: boolean + allowEmptyValue?: boolean + style?: string + explode?: boolean + allowReserved?: boolean + schema?: ReferenceObject | SchemaObject + example?: any + examples?: { [media: string]: ReferenceObject | ExampleObject } + content?: { [media: string]: MediaTypeObject } + } + type NonArraySchemaObjectType = + | 'boolean' + | 'object' + | 'number' + | 'string' + | 'integer' + type ArraySchemaObjectType = 'array' + type SchemaObject = ArraySchemaObject | NonArraySchemaObject + + interface ArraySchemaObject extends BaseSchemaObject { + type: ArraySchemaObjectType + items: ReferenceObject | SchemaObject + } + + interface NonArraySchemaObject extends BaseSchemaObject { + type?: NonArraySchemaObjectType + } + + interface BaseSchemaObject { + // JSON schema allowed properties, adjusted for OpenAPI + title?: string + description?: string + format?: string + default?: any + multipleOf?: number + maximum?: number + exclusiveMaximum?: boolean + minimum?: number + exclusiveMinimum?: boolean + maxLength?: number + minLength?: number + pattern?: string + additionalProperties?: boolean | ReferenceObject | SchemaObject + maxItems?: number + minItems?: number + uniqueItems?: boolean + maxProperties?: number + minProperties?: number + required?: string[] + enum?: any[] + properties?: { + [name: string]: ReferenceObject | SchemaObject + } + allOf?: (ReferenceObject | SchemaObject)[] + oneOf?: (ReferenceObject | SchemaObject)[] + anyOf?: (ReferenceObject | SchemaObject)[] + not?: ReferenceObject | SchemaObject + + // OpenAPI-specific properties + nullable?: boolean + discriminator?: DiscriminatorObject + readOnly?: boolean + writeOnly?: boolean + xml?: XMLObject + externalDocs?: ExternalDocumentationObject + example?: any + deprecated?: boolean + } + + interface DiscriminatorObject { + propertyName: string + mapping?: { [value: string]: string } + } + + interface XMLObject { + name?: string + namespace?: string + prefix?: string + attribute?: boolean + wrapped?: boolean + } + + interface ReferenceObject { + $ref: string + } + + interface ExampleObject { + summary?: string + description?: string + value?: any + externalValue?: string + } + + interface MediaTypeObject { + schema?: ReferenceObject | SchemaObject + example?: any + examples?: { [media: string]: ReferenceObject | ExampleObject } + encoding?: { [media: string]: EncodingObject } + } + + interface EncodingObject { + contentType?: string + headers?: { [header: string]: ReferenceObject | HeaderObject } + style?: string + explode?: boolean + allowReserved?: boolean + } + + interface RequestBodyObject { + description?: string + content: { [media: string]: MediaTypeObject } + required?: boolean + } + + interface ResponsesObject { + [code: string]: ReferenceObject | ResponseObject + } + + interface ResponseObject { + description: string + headers?: { [header: string]: ReferenceObject | HeaderObject } + content?: { [media: string]: MediaTypeObject } + links?: { [link: string]: ReferenceObject | LinkObject } + } + + interface LinkObject { + operationRef?: string + operationId?: string + parameters?: { [parameter: string]: any } + requestBody?: any + description?: string + server?: ServerObject + } + + interface CallbackObject { + [url: string]: PathItemObject + } + + interface SecurityRequirementObject { + [name: string]: string[] + } + + interface ComponentsObject { + schemas?: { [key: string]: ReferenceObject | SchemaObject } + responses?: { [key: string]: ReferenceObject | ResponseObject } + parameters?: { [key: string]: ReferenceObject | ParameterObject } + examples?: { [key: string]: ReferenceObject | ExampleObject } + requestBodies?: { [key: string]: ReferenceObject | RequestBodyObject } + headers?: { [key: string]: ReferenceObject | HeaderObject } + securitySchemes?: { [key: string]: ReferenceObject | SecuritySchemeObject } + links?: { [key: string]: ReferenceObject | LinkObject } + callbacks?: { [key: string]: ReferenceObject | CallbackObject } + } + + type SecuritySchemeObject = + | HttpSecurityScheme + | ApiKeySecurityScheme + | OAuth2SecurityScheme + | OpenIdSecurityScheme + + interface HttpSecurityScheme { + type: 'http' + description?: string + scheme: string + bearerFormat?: string + } + + interface ApiKeySecurityScheme { + type: 'apiKey' + description?: string + name: string + in: string + } + + interface OAuth2SecurityScheme { + type: 'oauth2' + flows: { + implicit?: { + authorizationUrl: string + refreshUrl?: string + scopes: { [scope: string]: string } + } + password?: { + tokenUrl: string + refreshUrl?: string + scopes: { [scope: string]: string } + } + clientCredentials?: { + tokenUrl: string + refreshUrl?: string + scopes: { [scope: string]: string } + } + authorizationCode?: { + authorizationUrl: string + tokenUrl: string + refreshUrl?: string + scopes: { [scope: string]: string } + } + } + } + + interface OpenIdSecurityScheme { + type: 'openIdConnect' + description?: string + openIdConnectUrl: string + } + + interface TagObject { + name: string + description?: string + externalDocs?: ExternalDocumentationObject + } +} + +export default OpenAPIV3 diff --git a/src/types-paw-api/openapi.d.ts b/src/types/openapi.d.ts similarity index 72% rename from src/types-paw-api/openapi.d.ts rename to src/types/openapi.d.ts index 7d4d6ef..f1fc054 100755 --- a/src/types-paw-api/openapi.d.ts +++ b/src/types/openapi.d.ts @@ -3,10 +3,10 @@ /** * Helper types */ -export type MapKeyedWithString = { [key: string]: T }; -export const NonRequiredLabel = 'NonRequired'; -export const BasicCredentialsLabel = 'Basic credentials'; -export const OAuth2CredentialsLabel = 'OAuth2'; +export type MapKeyedWithString = { [key: string]: T } +export const NonRequiredLabel = 'NonRequired' +export const BasicCredentialsLabel = 'Basic credentials' +export const OAuth2CredentialsLabel = 'OAuth2' /** * OpenAPI format @@ -65,15 +65,15 @@ export interface ServerVariableObject { } export interface ComponentsObject { - schemas?: MapKeyedWithString<(SchemaObject | ReferenceObject)> - responses?: MapKeyedWithString<(ResponseObject | ReferenceObject)> - parameters?: MapKeyedWithString<(ParameterObject | ReferenceObject)> - examples?: MapKeyedWithString<(ExampleObject | ReferenceObject)> - requestBodies?: MapKeyedWithString<(RequestBodyObject | ReferenceObject)> - headers?: MapKeyedWithString<(HeaderObject | ReferenceObject)> - securitySchemes?: MapKeyedWithString<(SecuritySchemeObject | ReferenceObject)> - links?: MapKeyedWithString<(LinkObject | ReferenceObject)> - callbacks?: MapKeyedWithString<(CallbackObject | ReferenceObject)> + schemas?: MapKeyedWithString + responses?: MapKeyedWithString + parameters?: MapKeyedWithString + examples?: MapKeyedWithString + requestBodies?: MapKeyedWithString + headers?: MapKeyedWithString + securitySchemes?: MapKeyedWithString + links?: MapKeyedWithString + callbacks?: MapKeyedWithString } export interface PathsObject { @@ -93,7 +93,7 @@ export interface PathItemObject { patch?: OperationObject trace?: OperationObject servers?: ServerObject[] - parameters?: (ParameterObject[] | ReferenceObject[]) + parameters?: ParameterObject[] | ReferenceObject[] } export interface OperationObject { @@ -103,9 +103,9 @@ export interface OperationObject { externalDocs?: ExternalDocumentationObject operationId?: string parameters?: (ParameterObject | ReferenceObject)[] - requestBody?: (RequestBodyObject | ReferenceObject) + requestBody?: RequestBodyObject | ReferenceObject responses: ResponsesObject - callbacks?: MapKeyedWithString<(CallbackObject | ReferenceObject)> + callbacks?: MapKeyedWithString deprecated?: boolean security?: SecurityRequirementObject[] servers?: ServerObject[] @@ -123,12 +123,19 @@ export interface ParameterObject { required?: boolean deprecated?: boolean allowEmptyValue?: boolean - style?: 'matrix' | 'label' | 'form' | 'simple' | 'spaceDelimited' | 'pipeDelimited' | 'depObject' + style?: + | 'matrix' + | 'label' + | 'form' + | 'simple' + | 'spaceDelimited' + | 'pipeDelimited' + | 'depObject' explode?: boolean allowReserved?: boolean schema?: SchemaObject | ReferenceObject example?: any - examples?: MapKeyedWithString<(ExampleObject | ReferenceObject)> + examples?: MapKeyedWithString content?: MapKeyedWithString } @@ -141,13 +148,13 @@ export interface RequestBodyObject { export interface MediaTypeObject { schema?: SchemaObject | ReferenceObject example?: any - examples?: MapKeyedWithString<(ExampleObject | ReferenceObject)> + examples?: MapKeyedWithString encoding?: MapKeyedWithString } export interface EncodingObject { contentType?: string - headers?: MapKeyedWithString<(HeaderObject | ReferenceObject)> + headers?: MapKeyedWithString style?: string explode?: boolean allowReserved?: boolean @@ -159,9 +166,9 @@ export interface ResponsesObject { export interface ResponseObject { description: string | null - headers: MapKeyedWithString<(HeaderObject | ReferenceObject)> | null + headers: MapKeyedWithString | null content: MapKeyedWithString | null - links: MapKeyedWithString<(LinkObject | ReferenceObject)> | null + links: MapKeyedWithString | null } export interface CallbackObject { @@ -194,7 +201,7 @@ export interface HeaderObject { allowReserved?: boolean schema?: SchemaObject | ReferenceObject example?: any - examples?: MapKeyedWithString<(ExampleObject | ReferenceObject)> + examples?: MapKeyedWithString content?: MapKeyedWithString } @@ -232,7 +239,7 @@ export interface SchemaObject { anyOf?: (SchemaObject | ReferenceObject)[] not?: (SchemaObject | ReferenceObject)[] items?: SchemaObject | ReferenceObject - properties?: MapKeyedWithString<(SchemaObject | ReferenceObject)> + properties?: MapKeyedWithString additionalProperties?: boolean | SchemaObject | ReferenceObject description?: string format?: string @@ -261,25 +268,29 @@ export interface XMLObject { wrapped?: boolean } -export type SecuritySchemeObject = { - type: 'apiKey' - description?: string - name: string - in: 'query' | 'header' | 'cookie' -} | { - type: 'http' - description?: string - scheme: 'basic' | 'bearer' | string - bearerFormat?: string -} | { - type: 'oauth2' - description?: string - flows: OAuthFlowsObject -} | { - type: 'openIdConnect' - description?: string - openIdConnectUrl: string -}; +export type SecuritySchemeObject = + | { + type: 'apiKey' + description?: string + name: string + in: 'query' | 'header' | 'cookie' + } + | { + type: 'http' + description?: string + scheme: 'basic' | 'bearer' | string + bearerFormat?: string + } + | { + type: 'oauth2' + description?: string + flows: OAuthFlowsObject + } + | { + type: 'openIdConnect' + description?: string + openIdConnectUrl: string + } export interface OAuthFlowsObject { implicit?: OAuthFlowObject diff --git a/src/types-paw-api/paw.d.ts b/src/types/paw.d.ts similarity index 100% rename from src/types-paw-api/paw.d.ts rename to src/types/paw.d.ts diff --git a/tsconfig.json b/tsconfig.json index ef804de..95f6203 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,14 +4,17 @@ "sourceMap": true, "noImplicitAny": true, "module": "commonjs", - "target": "es5", + "target": "ES2018", + "resolveJsonModule": true, "declaration": true, "allowSyntheticDefaultImports": true, "esModuleInterop": true, "strictNullChecks": true, - "noEmit": true + "noEmit": true, + "baseUrl": "src", + "paths": { + "lib": ["src/lib"] + } }, - "include": [ - "src/**/*" - ] + "include": ["src"] } diff --git a/webpack.config.babel.js b/webpack.config.babel.js index 997af4c..99991a1 100755 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -1,17 +1,18 @@ -import path from 'path' -import PACKAGE from './package.json' +const { join } = require('path') +const extensionConfig = require('./src/config.json') +const { title, identifier } = extensionConfig -const name = PACKAGE.config.extension_name -const identifier = PACKAGE.config.extension_identifier +const mode = process.env.NODE_ENV || 'production' +const target = process.env.BUILD_TARGET === '4' ? 'web' : 'node-webkit' const config = { - mode: 'production', - target: 'node-webkit', + mode, + target, entry: './src/index.ts', - output:{ - path: path.join(__dirname, `./dist/${identifier}`), - filename: `${name}.js` + output: { + path: join(__dirname, `./dist/${identifier}`), + filename: `${title}.js`, }, module: { rules: [ @@ -20,18 +21,16 @@ const config = { use: 'babel-loader', exclude: /node_modules/, }, - ] + ], }, - resolve: { - extensions: [ '.ts', '.js', '.d.ts' ], + modules: ['./src/**'], + extensions: ['.ts', '.js', '.d.ts'], }, - devtool: 'inline-source-map', - optimization: { - minimize: false + minimize: false, }, } -export default config +module.exports = config diff --git a/yarn.lock b/yarn.lock index f331042..b6fa391 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4462,6 +4462,11 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +md5-typescript@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/md5-typescript/-/md5-typescript-1.0.5.tgz#68c0b24dff8e5d3162e498fa9893b63be72e038f" + integrity sha1-aMCyTf+OXTFi5Jj6mJO2O+cuA48= + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" From 92055b6ca9fca82653e84ba3473347260197b36a Mon Sep 17 00:00:00 2001 From: Pongstr Date: Mon, 19 Apr 2021 14:58:36 +0300 Subject: [PATCH 02/13] init: update --- .babelrc | 9 +- .eslintrc.json | 8 +- .gitignore | 9 +- jest.config.js | 13 +- package.json | 51 +- src/types/openapi-v3.d.ts | 314 -- src/types/openapi.d.ts | 311 -- src/types/paw.d.ts | 988 +++-- src/utils/__snapshots__/console.test.ts.snap | 53 + src/utils/console.test.ts | 22 + src/utils/console.ts | 68 + src/utils/dynamic-values.ts | 130 + src/utils/environment.ts | 60 + src/utils/group.ts | 53 + src/utils/index.ts | 6 + src/utils/json-schema-parser.ts | 228 ++ src/utils/paw-url.ts | 107 + tsconfig.json | 18 +- webpack.config.babel.js | 40 +- yarn.lock | 3379 ++++++++++-------- 20 files changed, 3283 insertions(+), 2584 deletions(-) delete mode 100644 src/types/openapi-v3.d.ts delete mode 100755 src/types/openapi.d.ts create mode 100644 src/utils/__snapshots__/console.test.ts.snap create mode 100644 src/utils/console.test.ts create mode 100644 src/utils/console.ts create mode 100644 src/utils/dynamic-values.ts create mode 100644 src/utils/environment.ts create mode 100644 src/utils/group.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/json-schema-parser.ts create mode 100644 src/utils/paw-url.ts diff --git a/.babelrc b/.babelrc index f34ccd9..23dd526 100755 --- a/.babelrc +++ b/.babelrc @@ -1,6 +1,13 @@ { "presets": [ - "@babel/env", + [ + "@babel/env", + { + "targets": { + "safari": "6" + } + } + ], "@babel/typescript" ], "plugins": [ diff --git a/.eslintrc.json b/.eslintrc.json index 61c68d1..c4cbbe5 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,8 +1,8 @@ { "env": { - "browser": true, - "es6": true, - "node": true + "node": true, + "jest": true, + "browser": true }, "extends": [ "eslint:recommended", @@ -19,5 +19,5 @@ ] }, "parser": "@typescript-eslint/parser", - "ignorePatterns": ["*.js"] + "ignorePatterns": ["*.js", "./dist/*"] } diff --git a/.gitignore b/.gitignore index cd1111c..b8b21e8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ -## Generated from: -## https://www.toptal.com/developers/gitignore?templates=node,macos,linux,windows +examples + +# Created by https://www.toptal.com/developers/gitignore/api/macos,linux,windows,node +# Edit at https://www.toptal.com/developers/gitignore?templates=macos,linux,windows,node ### Linux ### *~ @@ -196,4 +198,5 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk -# End of https://www.toptal.com/developers/gitignore/api/node,macos,linux,windows + +# End of https://www.toptal.com/developers/gitignore/api/macos,linux,windows,node diff --git a/jest.config.js b/jest.config.js index 5909783..c96b3b6 100755 --- a/jest.config.js +++ b/jest.config.js @@ -1,8 +1,11 @@ module.exports = { - "roots": [ - "/src" - ], - "transform": { - "^.+\\.tsx?$": "ts-jest" + preset: 'ts-jest', + clearMocks: true, + moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx'], + roots: ['/src'], + testEnvironment: 'node', + transform: { + '^.+\\.ts?$': 'ts-jest', }, + moduleDirectories: ['node_modules', 'src'], } diff --git a/package.json b/package.json index 3471ba8..a839e8d 100755 --- a/package.json +++ b/package.json @@ -1,17 +1,27 @@ { "name": "paw-openapigenerator", - "version": "0.0.9", - "description": "A Paw Extension to export requests to the OpenAPI format.", + "version": "0.0.10", + "description": "A Paw Extension to export requests to the OpenAPI v3 document.", "main": "src/index.ts", "license": "MIT", "repository": "git@github.com:luckymarmot/Paw-OpenAPI3Generator.git", + "scripts": { + "start": "yarn dev:mac", + "dev:mac": "bash -c \"./node_modules/.bin/webpack --node-env development --watch -o $HOME/$npm_package_config_outputDir/$npm_package_config_identifier\"", + "dev:mac:static": "bash -c \"./node_modules/.bin/webpack --node-env development -o $HOME/$npm_package_config_outputDir/$npm_package_config_identifier\"", + "dev:web": "echo \"\n\tWork in progress...\n\"", + "build:mac": "webpack --config ./webpack.config.babel.js", + "build:web": "yarn ", + "test": "jest" + }, "devDependencies": { "@babel/cli": "^7.7.0", "@babel/core": "^7.7.0", "@babel/plugin-proposal-class-properties": "^7.7.0", "@babel/plugin-proposal-object-rest-spread": "^7.6.2", + "@babel/plugin-transform-classes": "^7.13.0", "@babel/plugin-transform-runtime": "^7.6.2", - "@babel/preset-env": "^7.7.0", + "@babel/preset-env": "^7.13.12", "@babel/preset-typescript": "^7.7.0", "@babel/register": "^7.7.0", "@types/jest": "^24.0.22", @@ -19,7 +29,9 @@ "@types/yaml": "^1.9.7", "@typescript-eslint/eslint-plugin": "^3.6.1", "@typescript-eslint/parser": "^3.6.1", + "babel-jest": "^26.6.3", "babel-loader": "^8.0.6", + "core-js": "3", "eslint": "^6.6.0", "eslint-config-airbnb": "^18.0.1", "eslint-config-airbnb-base": "^14.0.0", @@ -30,26 +42,27 @@ "eslint-plugin-react": "^7.20.5", "eslint-plugin-react-hooks": "^4.0.8", "jest": "^24.9.0", - "onchange": "^7.0.2", - "ts-jest": "^24.1.0", + "openapi-types": "^7.2.3", + "prettier": "^2.2.1", + "ts-jest": "^26.5.4", + "ts-loader": "^8.1.0", "typescript": "^3.6.4", "webpack": "^4.41.2", - "webpack-cli": "^3.3.10" + "webpack-cli": "^4.6.0" }, "config": { - "extension_name": "OpenAPIGenerator", - "extension_identifier": "com.luckymarmot.PawExtensions.OpenAPIGenerator", - "extensions_dir": "/Library/Containers/com.luckymarmot.Paw/Data/Library/Application Support/com.luckymarmot.Paw/Extensions" - }, - "scripts": { - "build": "webpack", - "paw": "webpack && cp -r \"./dist/$npm_package_config_extension_identifier\" \"${HOME}$npm_package_config_extensions_dir\"", - "pawSilently": "webpack --display=errors-only && mkdir -p \"${HOME}$npm_package_config_extensions_dir\" && cp -r \"./dist/$npm_package_config_extension_identifier\" \"${HOME}$npm_package_config_extensions_dir\"", - "archive": "webpack && cd ./dist && zip -r9X \"./$npm_package_config_extension_name\"\".zip\" \"./$npm_package_config_extension_identifier\"", - "tsc": "tsc --noEmit", - "test": "jest", - "buildAndPaw": "echo $(date +'%T') && echo 'Processing...' && npm run --silent pawSilently && echo 'Built and sent to Paw'", - "watch": "onchange 'src/**/*.ts' -- npm run --silent buildAndPaw" + "name": "OpenAPIv3Generator", + "title": "OpenAPI v3.x Generatpr", + "description": "An OpenAPI generator extension for Paw client.", + "identifier": "com.luckymarmot.PawExtensions.OpenAPIv3Generator", + "fileExtensions": [ + "json", + "yaml", + "yml" + ], + "inputs": "json", + "help": "https://github.com/luckymarmot/Paw-OpenAPI3Generator/wiki", + "outputDir": "\"/Library/Containers/com.luckymarmot.Paw/Data/Library/Application Support/com.luckymarmot.Paw/Extensions\"" }, "dependencies": { "md5-typescript": "^1.0.5", diff --git a/src/types/openapi-v3.d.ts b/src/types/openapi-v3.d.ts deleted file mode 100644 index a16cf70..0000000 --- a/src/types/openapi-v3.d.ts +++ /dev/null @@ -1,314 +0,0 @@ -declare namespace OpenAPIV3 { - interface Document { - openapi: string - info: InfoObject - servers?: ServerObject[] - paths: PathsObject - components?: ComponentsObject - security?: SecurityRequirementObject[] - tags?: TagObject[] - externalDocs?: ExternalDocumentationObject - 'x-express-openapi-additional-middleware'?: ( - | ((request: any, response: any, next: any) => Promise) - | ((request: any, response: any, next: any) => void) - )[] - 'x-express-openapi-validation-strict'?: boolean - } - - interface InfoObject { - title: string - description?: string - termsOfService?: string - contact?: ContactObject - license?: LicenseObject - version: string - } - - interface ContactObject { - name?: string - url?: string - email?: string - } - - interface LicenseObject { - name: string - url?: string - } - - interface ServerObject { - url: string - description?: string - variables?: { [variable: string]: ServerVariableObject } - } - - interface ServerVariableObject { - enum?: string[] - default: string - description?: string - } - - interface PathsObject { - [pattern: string]: PathItemObject | undefined - } - - interface PathItemObject { - $ref?: string - summary?: string - description?: string - get?: OperationObject - put?: OperationObject - post?: OperationObject - delete?: OperationObject - options?: OperationObject - head?: OperationObject - patch?: OperationObject - trace?: OperationObject - servers?: ServerObject[] - parameters?: (ReferenceObject | ParameterObject)[] - } - - type OperationObject = { - tags?: string[] - summary?: string - description?: string - externalDocs?: ExternalDocumentationObject - operationId?: string - parameters?: (ReferenceObject | ParameterObject)[] - requestBody?: ReferenceObject | RequestBodyObject - responses?: ResponsesObject - callbacks?: { [callback: string]: ReferenceObject | CallbackObject } - deprecated?: boolean - security?: SecurityRequirementObject[] - servers?: ServerObject[] - } & T - - interface ExternalDocumentationObject { - description?: string - url: string - } - - interface ParameterObject extends ParameterBaseObject { - name: string - in: string - } - - interface HeaderObject extends ParameterBaseObject {} - - interface ParameterBaseObject { - description?: string - required?: boolean - deprecated?: boolean - allowEmptyValue?: boolean - style?: string - explode?: boolean - allowReserved?: boolean - schema?: ReferenceObject | SchemaObject - example?: any - examples?: { [media: string]: ReferenceObject | ExampleObject } - content?: { [media: string]: MediaTypeObject } - } - type NonArraySchemaObjectType = - | 'boolean' - | 'object' - | 'number' - | 'string' - | 'integer' - type ArraySchemaObjectType = 'array' - type SchemaObject = ArraySchemaObject | NonArraySchemaObject - - interface ArraySchemaObject extends BaseSchemaObject { - type: ArraySchemaObjectType - items: ReferenceObject | SchemaObject - } - - interface NonArraySchemaObject extends BaseSchemaObject { - type?: NonArraySchemaObjectType - } - - interface BaseSchemaObject { - // JSON schema allowed properties, adjusted for OpenAPI - title?: string - description?: string - format?: string - default?: any - multipleOf?: number - maximum?: number - exclusiveMaximum?: boolean - minimum?: number - exclusiveMinimum?: boolean - maxLength?: number - minLength?: number - pattern?: string - additionalProperties?: boolean | ReferenceObject | SchemaObject - maxItems?: number - minItems?: number - uniqueItems?: boolean - maxProperties?: number - minProperties?: number - required?: string[] - enum?: any[] - properties?: { - [name: string]: ReferenceObject | SchemaObject - } - allOf?: (ReferenceObject | SchemaObject)[] - oneOf?: (ReferenceObject | SchemaObject)[] - anyOf?: (ReferenceObject | SchemaObject)[] - not?: ReferenceObject | SchemaObject - - // OpenAPI-specific properties - nullable?: boolean - discriminator?: DiscriminatorObject - readOnly?: boolean - writeOnly?: boolean - xml?: XMLObject - externalDocs?: ExternalDocumentationObject - example?: any - deprecated?: boolean - } - - interface DiscriminatorObject { - propertyName: string - mapping?: { [value: string]: string } - } - - interface XMLObject { - name?: string - namespace?: string - prefix?: string - attribute?: boolean - wrapped?: boolean - } - - interface ReferenceObject { - $ref: string - } - - interface ExampleObject { - summary?: string - description?: string - value?: any - externalValue?: string - } - - interface MediaTypeObject { - schema?: ReferenceObject | SchemaObject - example?: any - examples?: { [media: string]: ReferenceObject | ExampleObject } - encoding?: { [media: string]: EncodingObject } - } - - interface EncodingObject { - contentType?: string - headers?: { [header: string]: ReferenceObject | HeaderObject } - style?: string - explode?: boolean - allowReserved?: boolean - } - - interface RequestBodyObject { - description?: string - content: { [media: string]: MediaTypeObject } - required?: boolean - } - - interface ResponsesObject { - [code: string]: ReferenceObject | ResponseObject - } - - interface ResponseObject { - description: string - headers?: { [header: string]: ReferenceObject | HeaderObject } - content?: { [media: string]: MediaTypeObject } - links?: { [link: string]: ReferenceObject | LinkObject } - } - - interface LinkObject { - operationRef?: string - operationId?: string - parameters?: { [parameter: string]: any } - requestBody?: any - description?: string - server?: ServerObject - } - - interface CallbackObject { - [url: string]: PathItemObject - } - - interface SecurityRequirementObject { - [name: string]: string[] - } - - interface ComponentsObject { - schemas?: { [key: string]: ReferenceObject | SchemaObject } - responses?: { [key: string]: ReferenceObject | ResponseObject } - parameters?: { [key: string]: ReferenceObject | ParameterObject } - examples?: { [key: string]: ReferenceObject | ExampleObject } - requestBodies?: { [key: string]: ReferenceObject | RequestBodyObject } - headers?: { [key: string]: ReferenceObject | HeaderObject } - securitySchemes?: { [key: string]: ReferenceObject | SecuritySchemeObject } - links?: { [key: string]: ReferenceObject | LinkObject } - callbacks?: { [key: string]: ReferenceObject | CallbackObject } - } - - type SecuritySchemeObject = - | HttpSecurityScheme - | ApiKeySecurityScheme - | OAuth2SecurityScheme - | OpenIdSecurityScheme - - interface HttpSecurityScheme { - type: 'http' - description?: string - scheme: string - bearerFormat?: string - } - - interface ApiKeySecurityScheme { - type: 'apiKey' - description?: string - name: string - in: string - } - - interface OAuth2SecurityScheme { - type: 'oauth2' - flows: { - implicit?: { - authorizationUrl: string - refreshUrl?: string - scopes: { [scope: string]: string } - } - password?: { - tokenUrl: string - refreshUrl?: string - scopes: { [scope: string]: string } - } - clientCredentials?: { - tokenUrl: string - refreshUrl?: string - scopes: { [scope: string]: string } - } - authorizationCode?: { - authorizationUrl: string - tokenUrl: string - refreshUrl?: string - scopes: { [scope: string]: string } - } - } - } - - interface OpenIdSecurityScheme { - type: 'openIdConnect' - description?: string - openIdConnectUrl: string - } - - interface TagObject { - name: string - description?: string - externalDocs?: ExternalDocumentationObject - } -} - -export default OpenAPIV3 diff --git a/src/types/openapi.d.ts b/src/types/openapi.d.ts deleted file mode 100755 index f1fc054..0000000 --- a/src/types/openapi.d.ts +++ /dev/null @@ -1,311 +0,0 @@ -/* eslint-disable max-classes-per-file */ - -/** - * Helper types - */ -export type MapKeyedWithString = { [key: string]: T } -export const NonRequiredLabel = 'NonRequired' -export const BasicCredentialsLabel = 'Basic credentials' -export const OAuth2CredentialsLabel = 'OAuth2' - -/** - * OpenAPI format - * - * Schemas - * https://swagger.io/specification/#schema - */ - -/** - * Main object - */ -export interface OpenAPIObject { - openapi: string - info: InfoObject - servers?: ServerObject[] - paths: PathsObject - components?: ComponentsObject - security?: SecurityRequirementObject[] - tags?: TagObject[] - externalDocs?: ExternalDocumentationObject -} - -/** - * OpenAPI component objects - */ -export interface InfoObject { - title: string - description?: string - termsOfService?: string - contact?: ContactObject - license?: LicenseObject - version?: string -} - -export interface ContactObject { - name?: string - url?: string - email?: string -} - -export interface LicenseObject { - name: string - url?: string -} - -export interface ServerObject { - url: string - description?: string - variables?: MapKeyedWithString -} - -export interface ServerVariableObject { - enum?: string[] - default: string - description?: string -} - -export interface ComponentsObject { - schemas?: MapKeyedWithString - responses?: MapKeyedWithString - parameters?: MapKeyedWithString - examples?: MapKeyedWithString - requestBodies?: MapKeyedWithString - headers?: MapKeyedWithString - securitySchemes?: MapKeyedWithString - links?: MapKeyedWithString - callbacks?: MapKeyedWithString -} - -export interface PathsObject { - [path: string]: PathItemObject // must starts with "/" => needs some validation to this -} - -export interface PathItemObject { - $ref?: string - summary?: string - description?: string - get?: OperationObject - put?: OperationObject - post?: OperationObject - delete?: OperationObject - options?: OperationObject - head?: OperationObject - patch?: OperationObject - trace?: OperationObject - servers?: ServerObject[] - parameters?: ParameterObject[] | ReferenceObject[] -} - -export interface OperationObject { - tags?: string[] - summary?: string - description?: string - externalDocs?: ExternalDocumentationObject - operationId?: string - parameters?: (ParameterObject | ReferenceObject)[] - requestBody?: RequestBodyObject | ReferenceObject - responses: ResponsesObject - callbacks?: MapKeyedWithString - deprecated?: boolean - security?: SecurityRequirementObject[] - servers?: ServerObject[] -} - -export interface ExternalDocumentationObject { - description?: string - url: string -} - -export interface ParameterObject { - name: string - in: 'query' | 'header' | 'path' | 'cookie' - description?: string - required?: boolean - deprecated?: boolean - allowEmptyValue?: boolean - style?: - | 'matrix' - | 'label' - | 'form' - | 'simple' - | 'spaceDelimited' - | 'pipeDelimited' - | 'depObject' - explode?: boolean - allowReserved?: boolean - schema?: SchemaObject | ReferenceObject - example?: any - examples?: MapKeyedWithString - content?: MapKeyedWithString -} - -export interface RequestBodyObject { - description?: string - content: MapKeyedWithString - required?: boolean -} - -export interface MediaTypeObject { - schema?: SchemaObject | ReferenceObject - example?: any - examples?: MapKeyedWithString - encoding?: MapKeyedWithString -} - -export interface EncodingObject { - contentType?: string - headers?: MapKeyedWithString - style?: string - explode?: boolean - allowReserved?: boolean -} - -export interface ResponsesObject { - [status: string]: ResponseObject | ReferenceObject -} - -export interface ResponseObject { - description: string | null - headers: MapKeyedWithString | null - content: MapKeyedWithString | null - links: MapKeyedWithString | null -} - -export interface CallbackObject { - [callback: string]: PathItemObject -} - -export interface ExampleObject { - summary?: string - description?: string - value?: any - externalValue?: string -} - -export interface LinkObject { - operationRef: string | null - operationId: string | null - parameters: MapKeyedWithString | null - requestBody: any | string | null - description: string | null - server: ServerObject | null -} - -export interface HeaderObject { - description?: string - required?: boolean - deprecated?: boolean - allowEmptyValue?: boolean - style?: 'simple' - explode?: boolean - allowReserved?: boolean - schema?: SchemaObject | ReferenceObject - example?: any - examples?: MapKeyedWithString - content?: MapKeyedWithString -} - -export interface TagObject { - name: string - description?: string - externalDocs?: ExternalDocumentationObject -} - -export interface ReferenceObject { - $ref: string -} - -export interface SchemaObject { - title?: string - multipleOf?: number - maximum?: number - exclusiveMaximum?: number - minimum?: number - exclusiveMinimum?: number - maxLength?: number - minLength?: number - pattern?: string // valid regular expression - maxItems?: number - minItems?: number - uniqueItems?: number - maxProperties?: number - minProperties?: number - required?: boolean - enum?: string[] - - type?: string - allOf?: (SchemaObject | ReferenceObject)[] - oneOf?: (SchemaObject | ReferenceObject)[] - anyOf?: (SchemaObject | ReferenceObject)[] - not?: (SchemaObject | ReferenceObject)[] - items?: SchemaObject | ReferenceObject - properties?: MapKeyedWithString - additionalProperties?: boolean | SchemaObject | ReferenceObject - description?: string - format?: string - default?: any - - nullable?: boolean - discriminator?: DiscriminatorObject - readOnly?: boolean - writeOnly?: boolean - xml?: XMLObject - externalDocs?: ExternalDocumentationObject - example?: any - deprecated?: boolean -} - -export interface DiscriminatorObject { - propertyName: string - mapping?: MapKeyedWithString -} - -export interface XMLObject { - name?: string - namespace?: string - prefix?: string - attribute?: boolean - wrapped?: boolean -} - -export type SecuritySchemeObject = - | { - type: 'apiKey' - description?: string - name: string - in: 'query' | 'header' | 'cookie' - } - | { - type: 'http' - description?: string - scheme: 'basic' | 'bearer' | string - bearerFormat?: string - } - | { - type: 'oauth2' - description?: string - flows: OAuthFlowsObject - } - | { - type: 'openIdConnect' - description?: string - openIdConnectUrl: string - } - -export interface OAuthFlowsObject { - implicit?: OAuthFlowObject - password?: OAuthFlowObject - clientCredentials?: OAuthFlowObject - authorizationCode?: OAuthFlowObject -} - -export interface OAuthFlowObject { - authorizationUrl: string - tokenUrl: string - refreshUrl?: string - scopes: MapKeyedWithString -} - -export interface SecurityRequirementObject { - [name: string]: string[] -} diff --git a/src/types/paw.d.ts b/src/types/paw.d.ts index edd41dd..2be6d6f 100755 --- a/src/types/paw.d.ts +++ b/src/types/paw.d.ts @@ -1,533 +1,525 @@ -/* eslint-disable max-classes-per-file */ +declare module 'json-schema-instantiator' -declare interface RuntimeInfo { - task: string - isMainThread: boolean -} - -declare interface DocumentInfo { - name: string | null - uuid: string | null - isCloudProject: boolean - cloudProjectId: number | null - cloudProject: ({ - id: number | null - currentCommitSha: string | null - currentBranch: string | null - mainBranch: string - isSynced: boolean - }) | null - cloudTeam: ({ - id: number | null - name: string | null - }) | null -} - -declare interface UserInfo { - username: string | null - email: string | null - avatar_url: string | null -} - -declare class Context { - // @TODO definition not finished - - // Create - createRequest( - name?: string | null, - method?: string | DynamicString | null, - url?: string | DynamicString | null, - description?: string | null - ): Request - - createRequestGroup(name: string | null): RequestGroup - - createEnvironmentDomain(name: string | null): EnvironmentDomain - - createSecureValue(name: string | null): DynamicValue - - createJSONDynamicValue(name: string | null): DynamicValue - - // Get objects by name - getCurrentRequest(isRequired?: boolean): Request | null - - getRequestByName(name: string): Request | null - - getRequestGroupByName(name: string): RequestGroup | null - - getEnvironmentDomainByName(name: string): EnvironmentDomain | null - - getEnvironmentVariableByName(name: string): EnvironmentVariable | null - - // Get objects by id - getRequestById(id: string): Request | null - - getRequestGroupById(id: string): RequestGroup | null - - getEnvironmentDomainById(id: string): EnvironmentDomain | null - - getEnvironmentVariableById(id: string): EnvironmentVariable | null - - getEnvironmentById(id: string): Environment | null - - // Get root items - getRootRequests(): Request[] - - getRootGroups(): RequestGroup[] - - getRootRequestTreeItems(): RequestTreeItem[] - - // Get all objects - getAllRequests(): Request[] - - getAllGroups(): RequestGroup[] - - getAllRequestTreeItems(): RequestTreeItem[] - - // Get selected objects - getSelectedRequests(): Request[] - - getSelectedGroups(): RequestGroup[] - - getSelectedRequestTreeItems(): RequestTreeItem[] - - // JSON Serialization - stringifyJSONItems(...items: any[]): string | null - - parseJSONItems(json: string): any[] | null - - // Info - runtimeInfo: RuntimeInfo; - - allowsMutation: boolean; - - document: DocumentInfo; - - user: UserInfo | null; -} - -declare class RequestTreeItem { - // -} - -declare interface BasicAuth { - username: string | DynamicString | null - password: string | DynamicString | null -} - -declare interface OAuth1 { - oauth_consumer_key: string | DynamicString | null - oauth_consumer_secret: string | DynamicString | null - oauth_token: string | DynamicString | null - oauth_token_secret: string | DynamicString | null - oauth_nonce: string | DynamicString | null | undefined - oauth_timestamp: string | DynamicString | null | undefined - oauth_callback: string | DynamicString | null | undefined - oauth_signature: string | DynamicString | null | undefined - oauth_signature_method: string | null | undefined - oauth_version: string | undefined - oauth_additional_parameters: string | DynamicString | null | undefined -} - -declare interface OAuth2 { - client_id: string | DynamicString | null - client_secret: string | DynamicString | null - authorization_uri: string | DynamicString | null - access_token_uri: string | DynamicString | null - redirect_uri: string | DynamicString | null - scope: string | DynamicString | null | undefined - state: string | DynamicString | null | undefined - token: string | DynamicString | null | undefined - token_prefix: string | DynamicString | null | undefined - grant_type: string | undefined -} - -declare class Request extends RequestTreeItem { - readonly id: string; - - readonly parent: RequestTreeItem | null; - - name: string; - - description: string; - - order: number; - - // URL - url: string | DynamicString; - - getUrl(isDynamic?: boolean): string | DynamicString - - // URL Base - readonly urlBase: string; - - getUrlBase(isDynamic?: boolean): string | DynamicString - - // URL Query - readonly urlQuery: string; - - // URL Parameters - urlParameters: { [key: string]: string | DynamicString }; - - getUrlParameters(isDynamic?: boolean): { [key: string]: string | DynamicString } - - getUrlParametersArray(): KeyValue[] - - readonly urlParametersNames: string[]; - - getUrlParametersNames(): string[] - - getUrlParameterByName(name: string, isDynamic?: boolean): string | DynamicString | null - - setUrlParameter(name: string | DynamicString, value: string | DynamicString): KeyValue - - setUrlParameterByName( - name: string | DynamicString, - value: string | DynamicString, - ): KeyValue // alias of setUrlParameter() - addUrlParameter(name: string | DynamicString, value: string | DynamicString): KeyValue - - addRawUrlQuery(query: string | DynamicString): KeyValue - - // Method - method: string | DynamicString; - - getMethod(isDynamic?: boolean): string | DynamicString - - // Headers - headers: { [key: string]: string | DynamicString }; - - getHeaders(isDynamic?: boolean): { [key: string]: string | DynamicString } - - readonly headersNames: string[]; - - getHeadersNames(): string[] - - getHeaderByName(name: string, isDynamic?: boolean): string | DynamicString | null - - getHeadersArray(): KeyValue[] - - setHeader(name: string | DynamicString, value: string | DynamicString): KeyValue - - addHeader(name: string | DynamicString, value: string | DynamicString): KeyValue - - // Body - body: string | DynamicString | null; - - getBody(isDynamic?: boolean): string | DynamicString | null - - // Body (URL Encoded) - urlEncodedBody: { [key: string]: string | DynamicString } | null; - - getUrlEncodedBody(isDynamic?: boolean): { [key: string]: string | DynamicString } | null - - getUrlEncodedBodyKeys(): string[] | null - - readonly urlEncodedBodyKeys: string[] | null; - - getUrlEncodedBodyKey(key: string): string | null - - // Body (Multipart) - multipartBody: { [key: string]: string | DynamicString } | null; - - getMultipartBody(isDynamic?: boolean): { [key: string]: string | DynamicString } | null - - // Body (JSON) - jsonBody: object | null; - - getJsonBodyKeyPath(keyPath: string): object | null - - // Auth - httpBasicAuth: BasicAuth | null; - - getHttpBasicAuth(isDynamic?: boolean): BasicAuth | null - - oauth1: OAuth1 | null; - - getOAuth1(isDynamic?: boolean): OAuth1 | null - - oauth2: OAuth2 | null; - - getOAuth2(isDynamic?: boolean): OAuth2 | null - - // Request Variables - readonly variables: RequestVariable[]; - - getVariablesNames(): string[] - - getVariableByName(name: string): RequestVariable | null - - getVariableById(id: string): RequestVariable | null - - addVariable(name: string, value: string | DynamicString, description: string): RequestVariable - - // Options - timeout: number; - - followRedirects: boolean; - - redirectAuthorization: boolean; - - redirectMethod: boolean; - - sendCookies: boolean; - - storeCookies: boolean; - - clientCertificate: DynamicString | null; - - // HTTP Exchange - getLastExchange(): HTTPExchange | null - - getAllExchanges(): HTTPExchange[] - - // Clone, delete - clone(newName: string): Request - - deleteRequest(): boolean -} - -declare class RequestGroup extends RequestTreeItem { - readonly id: string; - - readonly parent: RequestTreeItem | null; - - name: string | null; - - order: number; - - getChildren(): RequestTreeItem[] - - getChildRequests(): Request[] - - getChildGroups(): RequestGroup[] - - appendChild(child: RequestTreeItem): void - - insertChild(child: RequestTreeItem, index: number): void - - deleteGroup(): boolean -} - -declare enum KeyValueMode { - Normal = 0, - NormalAlwaysAddEqualSign = 1, - Raw = 2, -} - -declare class KeyValue { - readonly id: string; - - readonly request: Request; - - readonly isHeader: boolean; - - readonly isUrlParameter: boolean; - - name: DynamicString; - - value: DynamicString; - - enabled: boolean; - - mode: KeyValueMode; -} - -declare class RequestVariable { - readonly id: string; - - readonly request: Request; - - name: string; - - value: string | DynamicString | null; - - description: string | null; - - required: boolean; - - schema: string | DynamicString | null; - - getCurrentValue(isDynamic?: boolean): string | DynamicString | null - - getSchema(isDynamic?: boolean): string | DynamicString | null - - createDynamicValue(): DynamicValue - - createDynamicString(): DynamicString -} - -declare class EnvironmentDomain { - readonly id: string; - - name: string | null; - - order: number; - - // variables - readonly variables: EnvironmentVariable[]; - - getVariableByName(name: string): EnvironmentVariable | null - - createEnvironmentVariable(name: string): EnvironmentVariable - - // environments - readonly environments: Environment[]; - - getEnvironmentByName(name: string): Environment | null - - createEnvironment(name: string): Environment -} - -declare class Environment { - readonly id: string; - - name: string | null; - - domain: EnvironmentDomain; - - order: number; - - getVariablesValues(isDynamic?: boolean): { [key: string]: string | DynamicString } - - setVariablesValues(values: { [key: string]: string | DynamicString }): void -} - -declare class EnvironmentVariable { - readonly id: string; - - name: string | null; - - domain: EnvironmentDomain; - - order: number; - - getCurrentValue(isDynamic?: boolean): string | DynamicString | null - - getValue(environment: Environment, isDynamic?: boolean): string | DynamicString | null - - setCurrentValue(value: string | DynamicString): void - - setValue(value: string | DynamicString, environment: Environment): void - - createDynamicValue(): DynamicValue - - createDynamicString(): DynamicString -} - -declare class HTTPExchange { - readonly id: string; - - readonly requestMethod: string; - - readonly requestUrl: string; - - readonly requestBody: string; - - readonly requestHeaders: { [headerName: string]: string }; - - readonly requestHeaderString: string; - - readonly responseStatusCode: number; - - readonly responseStatusLine: string; - - readonly responseHeaders: { [headerName: string]: string }; - - readonly responseHeaderString: string; - - readonly responseBody: string; - - readonly responseTime: number; - - readonly downloadTime: number; - - readonly date: Date; +declare global { + function registerImporter(importer: any): void + function registerCodeGenerator(generator: any): void - getRequestHeaderByName(headerName: string): string | null + interface Logger { + log: (..._args: unknown[]) => void + info: (..._args: unknown[]) => void + } - getResponseHeaderByName(headerName: string): string | null -} + type MapKeyedWithString = { [key: string]: T } + type GroupedRequestType = { group: string; path: string } + type CreateRequestGroupType = { + group: string + paths: string[] + } + type TransformStringType = { + defaultValue: string + envManager: EnvironmentManager + stringInput: string + requestInput: Paw.Request + } -declare global { + type DynamicStringComponent = string | DynamicValue class DynamicString { + length: number + components: DynamicStringComponent[] constructor(...components: DynamicStringComponent[]) - - length: number; - - components: DynamicStringComponent[]; - getComponentAtIndex(index: number): DynamicStringComponent | null - getSimpleString(): string - getOnlyString(): string | null - getOnlyDynamicValue(): DynamicValue | null - getEvaluatedString(): string - copy(): DynamicString - appendString(string: string): void - appendDynamicValue(dynamicValue: DynamicValue): void - appendDynamicString(dynamicString: DynamicString): void } class DynamicValue { + public type: string constructor(type: string, properties?: { [key: string]: any }) + getEvaluatedString(): string + copy(): DynamicValue + } - type: string; + class NetworkHTTPRequest {} - getEvaluatedString(): string + class BasicAuth { + username: string | DynamicString | null + password: string | DynamicString | null + } - copy(): DynamicValue + class OAuth1 { + oauth_consumer_key: string | DynamicString | null + oauth_consumer_secret: string | DynamicString | null + oauth_token: string | DynamicString | null + oauth_token_secret: string | DynamicString | null + oauth_nonce: string | DynamicString | null | undefined + oauth_timestamp: string | DynamicString | null | undefined + oauth_callback: string | DynamicString | null | undefined + oauth_signature: string | DynamicString | null | undefined + oauth_signature_method: string | null | undefined + oauth_version: string | undefined + oauth_additional_parameters: string | DynamicString | null | undefined } - class NetworkHTTPRequest { - // @TODO definition not finished + class OAuth2 { + client_id: string | DynamicString | null + client_secret: string | DynamicString | null + authorization_uri: string | DynamicString | null + access_token_uri: string | DynamicString | null + redirect_uri: string | DynamicString | null + scope: string | DynamicString | null | undefined + state: string | DynamicString | null | undefined + token: string | DynamicString | null | undefined + token_prefix: string | DynamicString | null | undefined + grant_type: string | undefined } } -export interface Importer { - canImport(context: Context, items: ExtensionItem[]): number +declare namespace Paw { + interface RuntimeInfo { + task: string + isMainThread: boolean + } - import(context: Context, items: ExtensionItem[], options: ExtensionOption): boolean -} + interface DocumentInfo { + name: string | null + uuid: string | null + isCloudProject: boolean + cloudProjectId: number | null + cloudProject: { + id: number | null + currentCommitSha: string | null + currentBranch: string | null + mainBranch: string + isSynced: boolean + } | null + cloudTeam: { + id: number | null + name: string | null + } | null + } -export interface Generator { - generate(context: Context, requests: Request[], options: ExtensionOption): string -} + interface UserInfo { + username: string | null + email: string | null + avatar_url: string | null + } -export interface ExtensionImportFile { - name: string - path: string -} + class Context { + runtimeInfo: RuntimeInfo + allowsMutation: boolean + document: DocumentInfo + user: UserInfo | null + createRequest( + name?: string | null, + method?: string | DynamicString | null, + url?: string | DynamicString | null, + description?: string | null, + order?: number, + ): Request + createRequestGroup(name: string | null): RequestGroup + createEnvironmentDomain(name: string | null): EnvironmentDomain + createSecureValue(name: string | null): DynamicValue + createJSONDynamicValue(name: string | null): DynamicValue + getCurrentRequest(isRequired?: boolean): Request | null + getRequestByName(name: string): Request | null + getRequestGroupByName(name: string): RequestGroup | null + getEnvironmentDomainByName(name: string): EnvironmentDomain | null + getEnvironmentVariableByName(name: string): EnvironmentVariable | null + getRequestById(id: string): Request | null + getRequestGroupById(id: string): RequestGroup | null + getEnvironmentDomainById(id: string): EnvironmentDomain | null + getEnvironmentVariableById(id: string): EnvironmentVariable | null + getEnvironmentById(id: string): Environment | null + getRootRequests(): Request[] + getRootGroups(): RequestGroup[] + getRootRequestTreeItems(): RequestTreeItem[] + getAllRequests(): Request[] + getAllGroups(): RequestGroup[] + getAllRequestTreeItems(): RequestTreeItem[] + getSelectedRequests(): Request[] + getSelectedGroups(): RequestGroup[] + getSelectedRequestTreeItems(): RequestTreeItem[] + stringifyJSONItems(...items: any[]): string | null + parseJSONItems(json: string): any[] | null + } -export interface ExtensionOption { - inputs: { [key: string]: any } | null - file: ExtensionImportFile | null - hideCredentials: boolean - parent: RequestTreeItem | null - order: number | null -} + class RequestTreeItem { + readonly id: string + readonly parent: RequestTreeItem | null + readonly urlBase: string + readonly urlQuery: string + readonly urlParametersNames: string[] + readonly urlEncodedBodyKeys: string[] | null + readonly headersNames: string[] + readonly variables: RequestVariable[] + name: string + description: string + order: number + url: string | DynamicString + urlParameters: { [key: string]: string | DynamicString } + method: string | DynamicString + headers: { [key: string]: string | DynamicString } + body: string | DynamicString | null + urlEncodedBody: { [key: string]: string | DynamicString } | null + multipartBody: { [key: string]: string | DynamicString } | null + jsonBody: object | null + httpBasicAuth: BasicAuth | null + oauth1: OAuth1 | null + oauth2: OAuth2 | null + timeout: number + followRedirects: boolean + redirectAuthorization: boolean + redirectMethod: boolean + sendCookies: boolean + storeCookies: boolean + clientCertificate: DynamicString | null + + getUrl(isDynamic?: boolean): string | DynamicString + getUrlBase(isDynamic?: boolean): string | DynamicString + getUrlParametersArray(): KeyValue[] + getUrlParametersNames(): string[] + + getUrlParameters( + isDynamic?: boolean, + ): { [key: string]: string | DynamicString } + + getUrlParameterByName( + name: string, + isDynamic?: boolean, + ): string | DynamicString | null + + setUrlParameter( + name: string | DynamicString, + value: string | DynamicString, + ): KeyValue + + setUrlParameterByName( + name: string | DynamicString, + value: string | DynamicString, + ): KeyValue // alias of setUrlParameter() + addUrlParameter( + name: string | DynamicString, + value: string | DynamicString, + ): KeyValue + addRawUrlQuery(query: string | DynamicString): KeyValue + getMethod(isDynamic?: boolean): string | DynamicString + getHeaders(isDynamic?: boolean): { [key: string]: string | DynamicString } + getHeadersNames(): string[] + getHeaderByName( + name: string, + isDynamic?: boolean, + ): string | DynamicString | null + getHeadersArray(): KeyValue[] + setHeader( + name: string | DynamicString, + value: string | DynamicString, + ): KeyValue + addHeader( + name: string | DynamicString, + value: string | DynamicString, + ): KeyValue + getBody(isDynamic?: boolean): string | DynamicString | null + getUrlEncodedBody( + isDynamic?: boolean, + ): { [key: string]: string | DynamicString } | null + getUrlEncodedBodyKeys(): string[] | null + getUrlEncodedBodyKey(key: string): string | null + getMultipartBody( + isDynamic?: boolean, + ): { [key: string]: string | DynamicString } | null + getJsonBodyKeyPath(keyPath: string): object | null + getHttpBasicAuth(isDynamic?: boolean): BasicAuth | null + getOAuth1(isDynamic?: boolean): OAuth1 | null + getOAuth2(isDynamic?: boolean): OAuth2 | null + getVariablesNames(): string[] + getVariableByName(name: string): RequestVariable | null + getVariableById(id: string): RequestVariable | null + addVariable( + name: string, + value: string | DynamicString, + description: string, + ): RequestVariable + getLastExchange(): HTTPExchange | null + getAllExchanges(): HTTPExchange[] + clone(newName: string): Request + deleteRequest(): boolean + } -export interface ExtensionItem { - content: string - name: string - uri: string - url: string | null - file: ExtensionImportFile | null - mimeType: string | null - httpHeaders: object | null - httpStatus: number | null -} + enum KeyValueMode { + Normal = 0, + NormalAlwaysAddEqualSign = 1, + Raw = 2, + } -export type DynamicStringComponent = string | DynamicValue; + class KeyValue { + readonly id: string + readonly request: Request + readonly isHeader: boolean + readonly isUrlParameter: boolean + name: DynamicString + value: DynamicString + enabled: boolean + mode: KeyValueMode + } -declare global { - function registerImporter(importer: any): void; - function registerCodeGenerator(generator: any): void; + class Request extends RequestTreeItem { + readonly id: string + readonly parent: RequestTreeItem | null + readonly urlBase: string + readonly urlQuery: string + readonly urlParametersNames: string[] + readonly headersNames: string[] + readonly urlEncodedBodyKeys: string[] | null + readonly variables: RequestVariable[] + name: string + description: string + order: number + url: string | DynamicString + timeout: number + followRedirects: boolean + redirectAuthorization: boolean + redirectMethod: boolean + sendCookies: boolean + storeCookies: boolean + clientCertificate: DynamicString | null + urlParameters: { [key: string]: string | DynamicString } + method: string | DynamicString + headers: { [key: string]: string | DynamicString } + body: string | DynamicString | null + urlEncodedBody: { [key: string]: string | DynamicString } | null + multipartBody: { [key: string]: string | DynamicString } | null + jsonBody: object | null + httpBasicAuth: BasicAuth | null + oauth1: OAuth1 | null + oauth2: OAuth2 | null + + getUrl(isDynamic?: boolean): string | DynamicString + getUrlBase(isDynamic?: boolean): string | DynamicString + + getUrlParameters( + isDynamic?: boolean, + ): { [key: string]: string | DynamicString } + + getUrlParametersArray(): KeyValue[] + getUrlParametersNames(): string[] + getUrlParameterByName( + name: string, + isDynamic?: boolean, + ): string | DynamicString | null + + setUrlParameter( + name: string | DynamicString, + value: string | DynamicString, + ): KeyValue + + setUrlParameterByName( + name: string | DynamicString, + value: string | DynamicString, + ): KeyValue // alias of setUrlParameter() + + addUrlParameter( + name: string | DynamicString, + value: string | DynamicString, + ): KeyValue + + addRawUrlQuery(query: string | DynamicString): KeyValue + getMethod(isDynamic?: boolean): string | DynamicString + getHeaders(isDynamic?: boolean): { [key: string]: string | DynamicString } + getHeadersNames(): string[] + getHeadersArray(): KeyValue[] + + getHeaderByName( + name: string, + isDynamic?: boolean, + ): string | DynamicString | null + + setHeader( + name: string | DynamicString, + value: string | DynamicString, + ): KeyValue + + addHeader( + name: string | DynamicString, + value: string | DynamicString, + ): KeyValue + + getBody(isDynamic?: boolean): string | DynamicString | null + getUrlEncodedBodyKeys(): string[] | null + getUrlEncodedBodyKey(key: string): string | null + + getUrlEncodedBody( + isDynamic?: boolean, + ): { [key: string]: string | DynamicString } | null + + getMultipartBody( + isDynamic?: boolean, + ): { [key: string]: string | DynamicString } | null + + getJsonBodyKeyPath(keyPath: string): object | null + getHttpBasicAuth(isDynamic?: boolean): BasicAuth | null + getOAuth1(isDynamic?: boolean): OAuth1 | null + getOAuth2(isDynamic?: boolean): OAuth2 | null + getVariablesNames(): string[] + getVariableByName(name: string): RequestVariable | null + getVariableById(id: string): RequestVariable | null + + addVariable( + name: string, + value: string | DynamicString, + description: string, + ): RequestVariable + + getLastExchange(): HTTPExchange | null + getAllExchanges(): HTTPExchange[] + clone(newName: string): Request + deleteRequest(): boolean + } + + class RequestGroup extends RequestTreeItem { + readonly id: string + readonly parent: RequestTreeItem | null + order: number + getChildren(): RequestTreeItem[] + getChildRequests(): Request[] + getChildGroups(): RequestGroup[] + appendChild(child: RequestTreeItem): void + insertChild(child: RequestTreeItem, index: number): void + deleteGroup(): boolean + } + + class RequestVariable { + readonly id: string + readonly request: Request + name: string + value: string | DynamicString | null + description: string | null + required: boolean + schema: string | DynamicString | null + getCurrentValue(isDynamic?: boolean): string | DynamicString | null + getSchema(isDynamic?: boolean): string | DynamicString | null + createDynamicValue(): DynamicValue + createDynamicString(): DynamicString + } + + class EnvironmentDomain { + readonly id: string + readonly variables: EnvironmentVariable[] + readonly environments: Environment[] + name: string | null + order: number + getVariableByName(name: string): EnvironmentVariable | null + createEnvironmentVariable(name: string): EnvironmentVariable + getEnvironmentByName(name: string): Environment | null + createEnvironment(name: string): Environment + } + + class Environment { + readonly id: string + name: string | null + domain: EnvironmentDomain + order: number + getVariablesValues( + isDynamic?: boolean, + ): { [key: string]: string | DynamicString } + setVariablesValues(values: { [key: string]: string | DynamicString }): void + } + + class EnvironmentVariable { + readonly id: string + name: string | null + domain: EnvironmentDomain + order: number + getCurrentValue(isDynamic?: boolean): string | DynamicString | null + getValue( + environment: Environment, + isDynamic?: boolean, + ): string | DynamicString | null + setCurrentValue(value: string | DynamicString): void + setValue(value: string | DynamicString, environment: Environment): void + createDynamicValue(): DynamicValue + createDynamicString(): DynamicString + } + + class HTTPExchange { + readonly id: string + readonly requestMethod: string + readonly requestUrl: string + readonly requestBody: string + readonly requestHeaders: { [headerName: string]: string } + readonly requestHeaderString: string + readonly responseStatusCode: number + readonly responseStatusLine: string + readonly responseHeaders: { [headerName: string]: string } + readonly responseHeaderString: string + readonly responseBody: string + readonly responseTime: number + readonly downloadTime: number + readonly date: Date + getRequestHeaderByName(headerName: string): string | null + getResponseHeaderByName(headerName: string): string | null + } + + interface ExtensionProperties { + identifier: string + title: string + fileExtension?: string[] + languageHighlighter?: string + inputs?: unknown + help?: string + } + + class Importer { + public canImport(context: Context, items: ExtensionItem[]): number + public import( + context: Context, + items: ExtensionItem[], + options: ExtensionOption, + ): boolean | Promise + } + + class Generator { + identifier: string + title: string + fileExtension?: string + languageHighlighter?: string + inputs?: unknown + help?: string + generate( + context: Context, + requests: Request[], + options: ExtensionOption, + ): string + } + + class ExtensionImportFile { + name: string + path: string + } + + class ExtensionOption { + inputs: { [key: string]: any } | null + file: ExtensionImportFile | null + hideCredentials: boolean + parent: RequestTreeItem | null + order: number | null + } + + class ExtensionItem { + content: string + name: string + uri: string + url: string | null + file: ExtensionImportFile + mimeType: string | null + httpHeaders: object | null + httpStatus: number | null + } } + +export default Paw diff --git a/src/utils/__snapshots__/console.test.ts.snap b/src/utils/__snapshots__/console.test.ts.snap new file mode 100644 index 0000000..cd3a4a5 --- /dev/null +++ b/src/utils/__snapshots__/console.test.ts.snap @@ -0,0 +1,53 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`logger utility should log object and nested object 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "a": "hello", + "b": Object { + "c": Object { + "d": "world", + }, + }, + "c": Array [ + 1, + 2, + 3, + 4, + ], + }, + Array [ + 1, + 2, + 3, + 4, + ], + ], + ], + "results": Array [ + Object { + "type": "return", + "value": undefined, + }, + ], +} +`; + +exports[`logger utility should log string 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + "Hello,", + "How are you?", + ], + ], + "results": Array [ + Object { + "type": "return", + "value": undefined, + }, + ], +} +`; diff --git a/src/utils/console.test.ts b/src/utils/console.test.ts new file mode 100644 index 0000000..fdafa8a --- /dev/null +++ b/src/utils/console.test.ts @@ -0,0 +1,22 @@ +import logger from './console' + +describe('logger utility', () => { + it('should log string', () => { + const _logger = jest.spyOn(logger, 'info') + logger.info('Hello,', 'How are you?') + expect(_logger).toHaveBeenCalledWith('Hello,', 'How are you?') + expect(_logger).toMatchSnapshot() + }) + + it('should log object and nested object', () => { + const _logger = jest.spyOn(logger, 'info') + const object = { + a: 'hello', + b: { c: { d: 'world' } }, + c: [1, 2, 3, 4], + } + logger.info(object, object.c) + expect(_logger).toHaveBeenCalledWith(object, object.c) + expect(_logger).toMatchSnapshot() + }) +}) diff --git a/src/utils/console.ts b/src/utils/console.ts new file mode 100644 index 0000000..6d06a3d --- /dev/null +++ b/src/utils/console.ts @@ -0,0 +1,68 @@ +const log = console.log + +/** + * @private + * @function parseObjects + * @summary + * a function that checks whether a string can be parsed as an object, + * will always return a formatted json string. + * @param {unknown|any} data + * @returns {string} + */ +function parseObjects(data: unknown): string { + if (typeof data === 'object') { + return JSON.stringify(data, null, 2) + } + + try { + const context = JSON.parse(data as string) + return parseObjects(context) + } catch (error) { + return data as string + } +} + +/**e + * @function pseudoLog + * @summary + * abstracts the built-in console.log method which, + * also stringify any object passed to it. + * + * @param {Array} _args + * @returns {void} + */ +function pseudoLog(..._args: unknown[]): void { + const args = Array.from(_args).map((arg: unknown): unknown => + typeof arg === 'object' ? parseObjects(arg) : arg, + ) + args.unshift(`${typeof _args}: `) + log.apply(console, args) +} + +/** + * @exports logger + * @summary an environment aware logger + * @returns {Object} + */ +const logger: Logger = { + /** + * @method info + * @summary - abstracts console.info, shows up in production build + * @param _args @ + * @returns {void} + */ + info: pseudoLog, + + /** + * @method log + * @summary - abstracts console.log, does not display in production build + * @param _args @ + * @returns {void} + */ + log: (..._args: unknown[]): void => { + if (process.env.NODE_ENV !== 'development') return + pseudoLog(..._args) + }, +} + +export default logger diff --git a/src/utils/dynamic-values.ts b/src/utils/dynamic-values.ts new file mode 100644 index 0000000..f2269a6 --- /dev/null +++ b/src/utils/dynamic-values.ts @@ -0,0 +1,130 @@ +import EnvironmentManager from './environment' +import Paw from 'types/paw' +import logger from './console' + +const ENVIRONMENT_DYNAMIC_VALUE = + 'com.luckymarmot.EnvironmentVariableDynamicValue' +const REQUEST_DYNAMIC_VALUE = 'com.luckymarmot.RequestVariableDynamicValue' +const FILE_DYNAMIC_VALUE = 'com.luckymarmot.FileContentDynamicValue' + +/** + * @exports createDynamicValue + * @summary + * - renamed from `makeDv` + * + * @param {Object} opts - + * @returns {DynamicValue} class instance + */ +export const createDynamicValue = ( + type: string, + props?: { [key: string]: any }, +): DynamicValue => new DynamicValue(type, props) + +/** + * @exports createDynamicString + * @summary + * - renamed from `makeDs` + * + * @param {Array} prop + * @returns {DynamicString} class instance + */ +export const createDynamicString = ( + ...prop: DynamicStringComponent[] +): DynamicString => new DynamicString(...prop) +/** + * @exports createEnvironmentValues + * @summary + * - renamed from `makeEnvDv` + * + * @param {String} variableUUID - + * @returns {DynamicValue} class instance + */ +export const createEnvDynamicValue = ( + environmentVariable: string, +): DynamicValue => + createDynamicValue(ENVIRONMENT_DYNAMIC_VALUE, { + environmentVariable, + }) + +/** + * @exports createRequestValues + * @summary + * - renamed from `makeRequestDv` + * + * @param {String} variableUUID - + * @returns {DynamicValue} class instance + */ +export const createRequestValues = (variableId: string) => + createDynamicValue(REQUEST_DYNAMIC_VALUE, { variableId }) + +/** + * @exports createFileValues + * @summary + * + * @returns {DynamicValue} class instance + */ +export const createFileValues = (): DynamicValue => + createDynamicValue(FILE_DYNAMIC_VALUE, { bookmarkData: null }) + +/** + * @exports transformString + * @summary + * + * @param {Object} opts + * @param {String} opts.defaultValue + * @param {EnvironmentManager} opts.envManager + * @param {String} opts.stringInput + * @param {Object} opts.requestInput + * + * @returns {DynamicValue} class instance + */ +export function convertEnvString( + s: string, + envManager: EnvironmentManager, + defaultValue: string = '', + request: Paw.Request, +): string | DynamicString { + const re = /\{([^}]+)\}/g + let match + const components: DynamicStringComponent[] = [] + let idx = 0 + + // eslint-disable-next-line no-cond-assign + while ((match = re.exec(s))) { + // push any string here before + if (match.index > idx) { + components.push(s.substr(idx, match.index - idx)) + } + + if (envManager.hasEnvironmentVariable(match[1])) { + envManager.setEnvironmentVariableValue(match[1], defaultValue) + components.push(envManager.getDynamicValue(match[1])) + } else { + let requestVariable = request.getVariableByName(match[1]) + if (requestVariable && requestVariable.id) { + components.push( + new DynamicValue('com.luckymarmot.RequestVariableDynamicValue', { + variableUUID: requestVariable.id, + }), + ) + } + } + + idx = match.index + match[0].length + } + + // add remaining string + if (idx < s.length) { + components.push(s.substr(idx)) + } + + // return + if (components.length === 0) { + return '' + } + if (components.length === 1 && typeof components[0] === 'string') { + return components[0] + } + + return createDynamicString(...components) +} diff --git a/src/utils/environment.ts b/src/utils/environment.ts new file mode 100644 index 0000000..d3eb873 --- /dev/null +++ b/src/utils/environment.ts @@ -0,0 +1,60 @@ +import Paw from 'types/paw' +import { createEnvDynamicValue, createDynamicString } from './dynamic-values' + +export default class EnvironmentManager { + private readonly name: string + private readonly envName: string + private context: Paw.Context + private environmentDomain: Paw.EnvironmentDomain | null + constructor(context: Paw.Context, name?: string | null) { + this.name = name || 'OpenAPI Environment' + this.envName = name || 'Default' + this.context = context + this.environmentDomain = null + } + + private getEnvironmentDomain(): Paw.EnvironmentDomain { + const context = this.context + + if (!this.environmentDomain) { + this.environmentDomain = context.getEnvironmentDomainByName(this.name) + if (!this.environmentDomain) { + this.environmentDomain = context.createEnvironmentDomain(this.name) + this.environmentDomain.createEnvironment(this.envName) + } + } + return this.environmentDomain + } + + public hasEnvironmentVariable(name: string): boolean { + return this.getEnvironmentDomain().getVariableByName(name) !== null + } + + public getEnvironmentVariable(name: string): Paw.EnvironmentVariable { + let variable = this.getEnvironmentDomain().getVariableByName(name) + if (!variable) { + variable = this.getEnvironmentDomain().createEnvironmentVariable(name) + } + return variable + } + + public getDynamicValue(variableName: string): DynamicValue { + const variable = this.getEnvironmentVariable(variableName) + return createEnvDynamicValue(variable.id) + } + + public getDynamicString(variableName: string): DynamicString { + return createDynamicString(this.getDynamicValue(variableName)) + } + + public setEnvironmentVariableValue( + variableName: string, + variableValue: string, + ) { + const env = this.getEnvironmentDomain().getEnvironmentByName(this.envName) + + const varMap: MapKeyedWithString = {} + varMap[variableName] = variableValue + env?.setVariablesValues(varMap) + } +} diff --git a/src/utils/group.ts b/src/utils/group.ts new file mode 100644 index 0000000..3a9a430 --- /dev/null +++ b/src/utils/group.ts @@ -0,0 +1,53 @@ +// grouping utilities +export function mapToGroup(item: string): CreateRequestGroupType | null { + const names = item.split('/') + if (names.length === 0) return null + return { + group: names.filter((str) => str !== '')[0], + paths: [item], + } +} + +export function mapToCapitalize( + item: CreateRequestGroupType, +): CreateRequestGroupType { + return { + group: `${item.group.charAt(0).toUpperCase()}${item.group.slice(1)}`, + paths: [...item.paths], + } +} + +export function createGroup( + accumulator: CreateRequestGroupType[], + current: CreateRequestGroupType, +): CreateRequestGroupType[] { + const occurence = accumulator.reduce( + (acc, item: CreateRequestGroupType, arr) => + item.group === current.group ? arr : acc, + -1, + ) + + let objectvalue = accumulator[occurence] as CreateRequestGroupType + if (occurence >= 0) { + objectvalue.paths = objectvalue.paths.concat(current.paths) + return accumulator + } + + const currentObject: CreateRequestGroupType = { + group: current.group, + paths: Array.isArray(current.paths) ? [...current.paths] : current.paths, + } + + accumulator = accumulator.concat([currentObject as never]) + return accumulator +} + +// request body utility + +// parameter utilities + +export function paramInHeader(): void {} + +export function paramInPath(): void {} + +export function paramInCookie(): void {} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..e866da9 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,6 @@ +export { default as logger } from './console' +export { default as PawURL } from './paw-url' +export { default as EnvironmentManager } from './environment' +export { default as jsonSchemaParser } from './json-schema-parser' +export * from './dynamic-values' +export * as group from './group' diff --git a/src/utils/json-schema-parser.ts b/src/utils/json-schema-parser.ts new file mode 100644 index 0000000..0b13fda --- /dev/null +++ b/src/utils/json-schema-parser.ts @@ -0,0 +1,228 @@ +import { OpenAPIV3 } from 'openapi-types' + +// The JSON Object that defines the default values of certain types. +type typesInstantiatorType = + | 'string' + | 'number' + | 'integer' + | 'null' + | 'boolean' + | 'object' + | 'array' + +type JSPOptions = { + requiredPropertiesOnly: boolean +} + +const typesInstantiator = { + string: '', + number: 0, + integer: 0, + null: null, + boolean: false, // Always stay positive? lol + object: {}, + array: [], +} + +/** + * Checks whether a letiable is a primitive. + * @param obj - an object. + * @returns {boolean} + */ +function isPrimitive(obj: OpenAPIV3.SchemaObject) { + let type = obj.type as typesInstantiatorType + return typesInstantiator[type] !== undefined +} + +/** + * Checks whether a property is on required array. + * @param property - the property to check. + * @param requiredArray - the required array + * @returns {boolean} + */ +function isPropertyRequired(property: string, requiredArray: any[] | any) { + let found = false + requiredArray = requiredArray || [] + requiredArray.forEach(function (requiredProperty: string) { + if (requiredProperty === property) { + found = true + } + }) + return found +} + +function shouldVisit( + property: any, + obj: OpenAPIV3.SchemaObject, + options: JSPOptions, +) { + return ( + !options.requiredPropertiesOnly || + (options.requiredPropertiesOnly && + isPropertyRequired(property, obj.required)) + ) +} + +/** + * Instantiate a primitive. + * @param val - The object that represents the primitive. + * @returns {*} + */ +function instantiatePrimitive(val: OpenAPIV3.SchemaObject): any { + let type = val.type + + // Support for default values in the JSON Schema. + if (val.hasOwnProperty('example')) { + return val.example + } + + return typesInstantiator[type as typesInstantiatorType] +} + +/** + * Checks whether a letiable is an enum. + * @param obj - an object. + * @returns {boolean} + */ +function isEnum(obj: any): boolean { + return Object.prototype.toString.call(obj.enum) === '[object Array]' +} + +/** + * Checks whether a letiable is an array. + * @param obj - an object. + * @returns {boolean} + */ +function isArray(obj: any): boolean { + return Array.isArray(obj) +} + +/** + * Extracts the type of the object. + * If the type is an array, set type to first in list of types. + * If obj.type is not overridden, it will fail the isPrimitive check. + * Which internally also checks obj.type. + * @param obj - An object. + */ +function getObjectType(obj: any): typesInstantiatorType { + // Check if type is array of types. + if (isArray(obj.type)) { + obj.type = obj.type[0] + } + + return obj.type +} + +/** + * Instantiate an enum. + * @param val - The object that represents the primitive. + * @returns {*} + */ +function instantiateEnum(val: any) { + // Support for default values in the JSON Schema. + if (val.default) { + return val.default + } + + if (!val.enum.length) { + return undefined + } + return val.enum[0] +} + +/** + * Finds a definition in a schema. + * Useful for finding references. + * + * @param schema The full schema object. + * @param ref The reference to find. + * @return {*} The object representing the ref. + */ +function findDefinition(schema: any, ref: string) { + let propertyPath = ref.split('/').slice(1) // Ignore the #/uri at the beginning. + let currentProperty = propertyPath.splice(0, 1)[0] + + let currentValue = schema + + while (currentProperty) { + currentValue = currentValue[currentProperty] + currentProperty = propertyPath.splice(0, 1)[0] + } + + return currentValue +} + +/** + * The main function. + * Calls sub-objects recursively, depth first, using the sub-function 'visit'. + * @param schema - The schema to instantiate. + * @returns {*} + */ +function jsonSchemaParser( + schema: OpenAPIV3.SchemaObject, + options: any = {}, +): any { + options = options || {} + + /** + * Visits each sub-object using recursion. + * If it reaches a primitive, instantiate it. + * @param obj - The object that represents the schema. + * @param name - The name of the current object. + * @param data - The instance data that represents the current object. + */ + function visit( + obj: OpenAPIV3.SchemaObject | any, + name: string | number, + data: any, + ): any { + if (!obj) { + return + } + + let i + let type = getObjectType(obj) + + // We want non-primitives objects (primitive === object w/o properties). + if (type === 'object' && obj.properties) { + data[name] = data[name] || {} + + // Visit each property. + for (let property in obj.properties) { + if (obj.properties.hasOwnProperty(property)) { + if (shouldVisit(property, obj, options)) { + visit(obj.properties[property], property, data[name]) + } + } + } + } else if (obj.allOf) { + for (i = 0; i < obj.allOf.length; i++) { + visit(obj.allOf[i], name, data) + } + } else if (obj.$ref) { + obj = findDefinition(schema, obj.$ref) + visit(obj, name, data) + } else if (type === 'array') { + data[name] = [] + let len = 0 + if (obj.minItems || obj.minItems > 0) { + len = obj.minItems + } + + // Instantiate 'len' items. + for (i = 0; i < len; i++) { + visit(obj.items, i, data[name]) + } + } else if (isEnum(obj)) { + data[name] = instantiateEnum(obj) + } else if (isPrimitive(obj)) { + data[name] = instantiatePrimitive(obj) + } + } + + let data = { props: {} } + visit(schema, 'props', data) + return data['props'] as any +} + +export default jsonSchemaParser diff --git a/src/utils/paw-url.ts b/src/utils/paw-url.ts new file mode 100644 index 0000000..8f05ea0 --- /dev/null +++ b/src/utils/paw-url.ts @@ -0,0 +1,107 @@ +import { OpenAPIV3 } from 'openapi-types' +import Paw from 'types/paw' +import EnvironmentManager from './environment' +import { convertEnvString } from './dynamic-values' + +export interface PawURLOptions { + openApi: OpenAPIV3.Document + pathItem: OpenAPIV3.PathItemObject + envManager: EnvironmentManager + pathName: string + request: Paw.Request +} + +export default class PawURL { + hostname: string + pathname: string + port: string + fullUrl: string | DynamicString + serverVariables: MapKeyedWithString + constructor( + pathItem: OpenAPIV3.PathItemObject, + openApi: OpenAPIV3.Document, + pathName: string, + envManager: EnvironmentManager, + request: Paw.Request, + ) { + let server: OpenAPIV3.ServerObject = { url: '' } + let match: RegExpMatchArray | null = [] + + if (pathItem.servers && pathItem.servers.length > 0) { + this.fullUrl = `${PawURL.removeSlashFromEnd( + pathItem.servers[0].url, + )}${pathName}` + // eslint-disable-next-line prefer-destructuring + server = pathItem.servers[0] + } else if (openApi.servers && openApi.servers.length > 0) { + this.fullUrl = `${PawURL.removeSlashFromEnd( + openApi.servers[0].url, + )}${pathName}` + // eslint-disable-next-line prefer-destructuring + server = openApi.servers[0] + } + + if (server.variables) { + this.serverVariables = server.variables + } + + this.fullUrl = convertEnvString( + this.fullUrl as string, + envManager, + '', + request, + ) + + if (typeof this.fullUrl === 'string') { + match = this.fullUrl.match( + /^([^:]+):\/\/([^:/]+)(?::([0-9]*))?(?:(\/.*))?$/i, + ) + } else { + match = (this.fullUrl as DynamicString) + .getEvaluatedString() + .match(/^([^:]+):\/\/([^:/]+)(?::([0-9]*))?(?:(\/.*))?$/i) + } + + if (match) { + if (match[2]) { + let host = 'http' + if (match[1]) { + // eslint-disable-next-line prefer-destructuring + host = match[1] + } + + this.hostname = PawURL.addSlashAtEnd(`${host}://${match[2]}`) + } + + if (match[3]) { + // eslint-disable-next-line prefer-destructuring + this.port = match[3] + } + + if (match[4]) { + this.pathname = PawURL.addSlashAtEnd(match[4]).replace( + new RegExp('//', 'g'), + '/', + ) + } else { + this.pathname = '/' + } + } + } + + static addSlashAtEnd(variable: string): string { + if (variable[variable.length - 1] !== '/') { + return `${variable}/` + } + + return variable + } + + static removeSlashFromEnd(variable: string): string { + if (variable[variable.length - 1] === '/') { + return variable.substr(0, variable.length - 1) + } + + return variable + } +} diff --git a/tsconfig.json b/tsconfig.json index 95f6203..7f01505 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,20 +1,24 @@ { "compilerOptions": { + "resolveJsonModule": true, "outDir": "./dist/", "sourceMap": true, "noImplicitAny": true, "module": "commonjs", - "target": "ES2018", - "resolveJsonModule": true, - "declaration": true, - "allowSyntheticDefaultImports": true, + "target": "es5", + "lib": ["ES2015", "ES2020"], "esModuleInterop": true, "strictNullChecks": true, "noEmit": true, "baseUrl": "src", "paths": { - "lib": ["src/lib"] - } + "~": ["src/*"], + "lib": ["src/lib"], + "types": ["src/types"] + }, + "noErrorTruncation": true, + "skipLibCheck": true, + "pretty": true }, - "include": ["src"] + "include": ["src", "paw.config.json"] } diff --git a/webpack.config.babel.js b/webpack.config.babel.js index 99991a1..cc97bee 100755 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -1,18 +1,22 @@ -const { join } = require('path') -const extensionConfig = require('./src/config.json') +import path from 'path' +import PKG from './package.json' -const { title, identifier } = extensionConfig +const { name, identifier } = PKG.config -const mode = process.env.NODE_ENV || 'production' -const target = process.env.BUILD_TARGET === '4' ? 'web' : 'node-webkit' - -const config = { - mode, - target, +const webpackConfig = { + target: 'webworker', + devtool: 'none', entry: './src/index.ts', + stats: { + outputPath: true, + maxModules: 1, + }, output: { - path: join(__dirname, `./dist/${identifier}`), - filename: `${title}.js`, + path: path.join(__dirname, `dist/${identifier}`), + filename: `${name}.js`, + }, + optimization: { + minimize: false, }, module: { rules: [ @@ -24,13 +28,13 @@ const config = { ], }, resolve: { - modules: ['./src/**'], - extensions: ['.ts', '.js', '.d.ts'], - }, - devtool: 'inline-source-map', - optimization: { - minimize: false, + extensions: ['.ts', '.js', '.json', '.d.ts'], + alias: { + types: path.resolve(__dirname, 'src/types'), + lib: path.resolve(__dirname, 'src/lib'), + utils: path.resolve(__dirname, 'src/utils'), + }, }, } -module.exports = config +export default webpackConfig diff --git a/yarn.lock b/yarn.lock index b6fa391..10ac901 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,404 +3,441 @@ "@babel/cli@^7.7.0": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.10.5.tgz#57df2987c8cf89d0fc7d4b157ec59d7619f1b77a" - integrity sha512-j9H9qSf3kLdM0Ao3aGPbGZ73mEA9XazuupcS6cDGWuiyAcANoguhP0r2Lx32H5JGw4sSSoHG3x/mxVnHgvOoyA== + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.13.16.tgz#9d372e943ced0cc291f068204a9b010fd9cfadbc" + integrity sha512-cL9tllhqvsQ6r1+d9Invf7nNXg/3BlfL1vvvL/AdH9fZ2l5j0CeBcoq6UjsqHpvyN1v5nXSZgqJZoGeK+ZOAbw== dependencies: commander "^4.0.1" convert-source-map "^1.1.0" fs-readdir-recursive "^1.1.0" glob "^7.0.0" - lodash "^4.17.19" make-dir "^2.1.0" slash "^2.0.0" source-map "^0.5.0" optionalDependencies: - chokidar "^2.1.8" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c" - integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ== - dependencies: - browserslist "^4.12.0" - invariant "^2.2.4" - semver "^5.5.0" - -"@babel/core@^7.1.0", "@babel/core@^7.7.0": - version "7.11.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.1.tgz#2c55b604e73a40dc21b0e52650b11c65cf276643" - integrity sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" - "@babel/helper-module-transforms" "^7.11.0" - "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.1" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.0" - "@babel/types" "^7.11.0" + "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents" + chokidar "^3.4.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + dependencies: + "@babel/highlight" "^7.12.13" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8", "@babel/compat-data@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" + integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== + +"@babel/core@^7.1.0", "@babel/core@^7.7.0", "@babel/core@^7.7.5": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.0.tgz#47299ff3ec8d111b493f1a9d04bf88c04e728d88" + integrity sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.14.0" + "@babel/helper-compilation-targets" "^7.13.16" + "@babel/helper-module-transforms" "^7.14.0" + "@babel/helpers" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" + gensync "^1.0.0-beta.2" json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" + semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.11.0", "@babel/generator@^7.4.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" - integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== +"@babel/generator@^7.14.0", "@babel/generator@^7.4.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.0.tgz#0f35d663506c43e4f10898fbda0d752ec75494be" + integrity sha512-C6u00HbmsrNPug6A+CiNl8rEys7TsdcXwg12BHi2ca5rUfAs3+UwZsuDQSXnc+wCElCXMB8gMaJ3YXDdh8fAlg== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.14.0" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" - integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" - integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-compilation-targets@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" - integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ== - dependencies: - "@babel/compat-data" "^7.10.4" - browserslist "^4.12.0" - invariant "^2.2.4" - levenary "^1.1.1" - semver "^5.5.0" - -"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.10.5": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" - integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== - dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-member-expression-to-functions" "^7.10.5" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.10.4" - -"@babel/helper-create-regexp-features-plugin@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" - integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== +"@babel/helper-annotate-as-pure@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" + integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-regex" "^7.10.4" - regexpu-core "^4.7.0" + "@babel/types" "^7.12.13" -"@babel/helper-define-map@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" - integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" + integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/types" "^7.10.5" - lodash "^4.17.19" + "@babel/helper-explode-assignable-expression" "^7.12.13" + "@babel/types" "^7.12.13" -"@babel/helper-explode-assignable-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c" - integrity sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A== - dependencies: - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== - dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-hoist-variables@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" - integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.13.8": + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" + integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== dependencies: - "@babel/types" "^7.10.4" + "@babel/compat-data" "^7.13.15" + "@babel/helper-validator-option" "^7.12.17" + browserslist "^4.14.5" + semver "^6.3.0" -"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" - integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== +"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.0.tgz#38367d3dab125b12f94273de418f4df23a11a15e" + integrity sha512-6pXDPguA5zC40Y8oI5mqr+jEUpjMJonKvknvA+vD8CYDz5uuXEwWBK8sRAsE/t3gfb1k15AQb9RhwpscC4nUJQ== dependencies: - "@babel/types" "^7.11.0" + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-member-expression-to-functions" "^7.13.12" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-split-export-declaration" "^7.12.13" -"@babel/helper-module-imports@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" - integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" - integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/template" "^7.10.4" - "@babel/types" "^7.11.0" - lodash "^4.17.19" - -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - -"@babel/helper-regex@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" - integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== - dependencies: - lodash "^4.17.19" - -"@babel/helper-remap-async-to-generator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz#fce8bea4e9690bbe923056ded21e54b4e8b68ed5" - integrity sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg== +"@babel/helper-create-regexp-features-plugin@^7.12.13": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" + integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-wrap-function" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.12.13" + regexpu-core "^4.7.1" -"@babel/helper-replace-supers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" - integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== +"@babel/helper-define-polyfill-provider@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz#a640051772045fedaaecc6f0c6c69f02bdd34bf1" + integrity sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw== dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" -"@babel/helper-simple-access@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" - integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== +"@babel/helper-explode-assignable-expression@^7.12.13": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" + integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA== dependencies: - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-skip-transparent-expression-wrappers@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729" - integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q== + "@babel/types" "^7.13.0" + +"@babel/helper-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" + integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== dependencies: - "@babel/types" "^7.11.0" + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.12.13" -"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.12.13" + +"@babel/helper-hoist-variables@^7.13.0": + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz#1b1651249e94b51f8f0d33439843e33e39775b30" + integrity sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg== + dependencies: + "@babel/traverse" "^7.13.15" + "@babel/types" "^7.13.16" + +"@babel/helper-member-expression-to-functions@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" + integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== + dependencies: + "@babel/types" "^7.13.12" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" + integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== + dependencies: + "@babel/types" "^7.13.12" + +"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz#8fcf78be220156f22633ee204ea81f73f826a8ad" + integrity sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw== + dependencies: + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-simple-access" "^7.13.12" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.14.0" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" + +"@babel/helper-optimise-call-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" + integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" + integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== + +"@babel/helper-remap-async-to-generator@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" + integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-wrap-function" "^7.13.0" + "@babel/types" "^7.13.0" + +"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" + integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.13.12" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.12" + +"@babel/helper-simple-access@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" + integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== + dependencies: + "@babel/types" "^7.13.12" + +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" + integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== + +"@babel/helper-validator-option@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" + integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== + +"@babel/helper-wrap-function@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" + integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" + +"@babel/helpers@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" + integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== + dependencies: + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" + +"@babel/highlight@^7.12.13": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.0" + chalk "^2.0.0" + js-tokens "^4.0.0" -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.0", "@babel/parser@^7.4.3": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.0.tgz#2f0ebfed92bcddcc8395b91f1895191ce2760380" + integrity sha512-AHbfoxesfBALg33idaTBVUkLnfXtsgvJREf93p4p0Lwsz4ppfE7g1tpEXVm4vrxUcH4DVhAa9Z1m1zqf9WUC7Q== -"@babel/helper-wrap-function@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" - integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" + integrity sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ== dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" -"@babel/helpers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" - integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== +"@babel/plugin-proposal-async-generator-functions@^7.13.15": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz#80e549df273a3b3050431b148c892491df1bcc5b" + integrity sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA== dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== +"@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.7.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" + integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.1", "@babel/parser@^7.4.3": - version "7.11.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.3.tgz#9e1eae46738bcd08e23e867bab43e7b95299a8f9" - integrity sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA== - -"@babel/plugin-proposal-async-generator-functions@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558" - integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.10.4" - "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-proposal-class-properties@^7.10.4", "@babel/plugin-proposal-class-properties@^7.7.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" - integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== +"@babel/plugin-proposal-class-static-block@^7.13.11": + version "7.13.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.13.11.tgz#6fcbba4a962702c17e5371a0c7b39afde186d703" + integrity sha512-fJTdFI4bfnMjvxJyNuaf8i9mVcZ0UhetaGEUHaHV9KEnibLugJkZAtXikR8KcYj+NYmI4DZMS8yQAyg+hvfSqg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-class-static-block" "^7.12.13" -"@babel/plugin-proposal-dynamic-import@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" - integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ== +"@babel/plugin-proposal-dynamic-import@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d" + integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54" - integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg== +"@babel/plugin-proposal-export-namespace-from@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" + integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" - integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw== +"@babel/plugin-proposal-json-strings@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" + integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8" - integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q== +"@babel/plugin-proposal-logical-assignment-operators@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a" + integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" - integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" + integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" - integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== +"@babel/plugin-proposal-numeric-separator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" + integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.11.0", "@babel/plugin-proposal-object-rest-spread@^7.6.2": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" - integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.10.4" - -"@babel/plugin-proposal-optional-catch-binding@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" - integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - -"@babel/plugin-proposal-optional-chaining@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076" - integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - -"@babel/plugin-proposal-private-methods@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" - integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" - integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-async-generators@^7.8.0": +"@babel/plugin-proposal-object-rest-spread@^7.13.8", "@babel/plugin-proposal-object-rest-spread@^7.6.2": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" + integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g== + dependencies: + "@babel/compat-data" "^7.13.8" + "@babel/helper-compilation-targets" "^7.13.8" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.13.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107" + integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866" + integrity sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" + integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-proposal-private-property-in-object@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz#b1a1f2030586b9d3489cc26179d2eb5883277636" + integrity sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.14.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-private-property-in-object" "^7.14.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" + integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" - integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz#8e3d674b0613e67975ceac2776c97b60cafc5c9c" + integrity sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-dynamic-import@^7.8.0": +"@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== @@ -414,417 +451,435 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-json-strings@^7.8.0": +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.4": +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0": +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.8.0": +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.8.0": +"@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d" - integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ== +"@babel/plugin-syntax-private-property-in-object@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz#762a4babec61176fec6c88480dec40372b140c0b" + integrity sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-syntax-typescript@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz#2f55e770d3501e83af217d782cb7517d7bb34d25" - integrity sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ== +"@babel/plugin-syntax-top-level-await@^7.12.13", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" + integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-arrow-functions@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" - integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA== +"@babel/plugin-syntax-typescript@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" + integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-async-to-generator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" - integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ== +"@babel/plugin-transform-arrow-functions@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" + integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg== dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-block-scoped-functions@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" - integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA== +"@babel/plugin-transform-async-to-generator@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" + integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-remap-async-to-generator" "^7.13.0" -"@babel/plugin-transform-block-scoping@^7.10.4": - version "7.11.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz#5b7efe98852bef8d652c0b28144cd93a9e4b5215" - integrity sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew== +"@babel/plugin-transform-block-scoped-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" + integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-classes@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" - integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== +"@babel/plugin-transform-block-scoping@^7.13.16": + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.13.16.tgz#a9c0f10794855c63b1d629914c7dcfeddd185892" + integrity sha512-ad3PHUxGnfWF4Efd3qFuznEtZKoBp0spS+DgqzVzRPV7urEBvPLue3y2j80w4Jf2YLzZHj8TOv/Lmvdmh3b2xg== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-define-map" "^7.10.4" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-transform-classes@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" + integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-split-export-declaration" "^7.12.13" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" - integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw== +"@babel/plugin-transform-computed-properties@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" + integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-destructuring@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" - integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA== +"@babel/plugin-transform-destructuring@^7.13.17": + version "7.13.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz#678d96576638c19d5b36b332504d3fd6e06dea27" + integrity sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" - integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== +"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" + integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-duplicate-keys@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" - integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA== +"@babel/plugin-transform-duplicate-keys@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" + integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-exponentiation-operator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" - integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw== +"@babel/plugin-transform-exponentiation-operator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" + integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-for-of@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9" - integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ== +"@babel/plugin-transform-for-of@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" + integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" - integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg== +"@babel/plugin-transform-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" + integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-literals@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" - integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ== +"@babel/plugin-transform-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" + integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-member-expression-literals@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" - integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw== +"@babel/plugin-transform-member-expression-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" + integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-modules-amd@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1" - integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw== +"@babel/plugin-transform-modules-amd@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.0.tgz#589494b5b290ff76cf7f59c798011f6d77026553" + integrity sha512-CF4c5LX4LQ03LebQxJ5JZes2OYjzBuk1TdiF7cG7d5dK4lAdw9NZmaxq5K/mouUdNeqwz3TNjnW6v01UqUNgpQ== dependencies: - "@babel/helper-module-transforms" "^7.10.5" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-module-transforms" "^7.14.0" + "@babel/helper-plugin-utils" "^7.13.0" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" - integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== +"@babel/plugin-transform-modules-commonjs@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz#52bc199cb581e0992edba0f0f80356467587f161" + integrity sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ== dependencies: - "@babel/helper-module-transforms" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-module-transforms" "^7.14.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-simple-access" "^7.13.12" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85" - integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw== +"@babel/plugin-transform-modules-systemjs@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" + integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A== dependencies: - "@babel/helper-hoist-variables" "^7.10.4" - "@babel/helper-module-transforms" "^7.10.5" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-hoist-variables" "^7.13.0" + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-validator-identifier" "^7.12.11" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" - integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA== +"@babel/plugin-transform-modules-umd@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz#2f8179d1bbc9263665ce4a65f305526b2ea8ac34" + integrity sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw== dependencies: - "@babel/helper-module-transforms" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-module-transforms" "^7.14.0" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" - integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" + integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.12.13" -"@babel/plugin-transform-new-target@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" - integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw== +"@babel/plugin-transform-new-target@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" + integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-object-super@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" - integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ== +"@babel/plugin-transform-object-super@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" + integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" -"@babel/plugin-transform-parameters@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a" - integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw== +"@babel/plugin-transform-parameters@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" + integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw== dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-property-literals@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" - integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g== +"@babel/plugin-transform-property-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" + integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-regenerator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63" - integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw== +"@babel/plugin-transform-regenerator@^7.13.15": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz#e5eb28945bf8b6563e7f818945f966a8d2997f39" + integrity sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" - integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ== +"@babel/plugin-transform-reserved-words@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" + integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-transform-runtime@^7.6.2": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz#e27f78eb36f19448636e05c33c90fd9ad9b8bccf" - integrity sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - resolve "^1.8.1" - semver "^5.5.1" - -"@babel/plugin-transform-shorthand-properties@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" - integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-spread@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc" - integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" - -"@babel/plugin-transform-sticky-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" - integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-regex" "^7.10.4" - -"@babel/plugin-transform-template-literals@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c" - integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-typeof-symbol@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" - integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-typescript@^7.10.4": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz#2b4879676af37342ebb278216dd090ac67f13abb" - integrity sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.5" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-typescript" "^7.10.4" - -"@babel/plugin-transform-unicode-escapes@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007" - integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-unicode-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8" - integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/preset-env@^7.7.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.0.tgz#860ee38f2ce17ad60480c2021ba9689393efb796" - integrity sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg== - dependencies: - "@babel/compat-data" "^7.11.0" - "@babel/helper-compilation-targets" "^7.10.4" - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-proposal-async-generator-functions" "^7.10.4" - "@babel/plugin-proposal-class-properties" "^7.10.4" - "@babel/plugin-proposal-dynamic-import" "^7.10.4" - "@babel/plugin-proposal-export-namespace-from" "^7.10.4" - "@babel/plugin-proposal-json-strings" "^7.10.4" - "@babel/plugin-proposal-logical-assignment-operators" "^7.11.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4" - "@babel/plugin-proposal-numeric-separator" "^7.10.4" - "@babel/plugin-proposal-object-rest-spread" "^7.11.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.10.4" - "@babel/plugin-proposal-optional-chaining" "^7.11.0" - "@babel/plugin-proposal-private-methods" "^7.10.4" - "@babel/plugin-proposal-unicode-property-regex" "^7.10.4" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-class-properties" "^7.10.4" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz#2eddf585dd066b84102517e10a577f24f76a9cd7" + integrity sha512-d+ezl76gx6Jal08XngJUkXM4lFXK/5Ikl9Mh4HKDxSfGJXmZ9xG64XT2oivBzfxb/eQ62VfvoMkaCZUKJMVrBA== + dependencies: + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-plugin-utils" "^7.13.0" + babel-plugin-polyfill-corejs2 "^0.2.0" + babel-plugin-polyfill-corejs3 "^0.2.0" + babel-plugin-polyfill-regenerator "^0.2.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" + integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-spread@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" + integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + +"@babel/plugin-transform-sticky-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" + integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-template-literals@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" + integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-transform-typeof-symbol@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" + integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-typescript@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz#4a498e1f3600342d2a9e61f60131018f55774853" + integrity sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-typescript" "^7.12.13" + +"@babel/plugin-transform-unicode-escapes@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" + integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-unicode-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" + integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/preset-env@^7.13.12": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.0.tgz#236f88cd5da625e625dd40500d4824523f50e6c5" + integrity sha512-GWRCdBv2whxqqaSi7bo/BEXf070G/fWFMEdCnmoRg2CZJy4GK06ovFuEjJrZhDRXYgBsYtxVbG8GUHvw+UWBkQ== + dependencies: + "@babel/compat-data" "^7.14.0" + "@babel/helper-compilation-targets" "^7.13.16" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-validator-option" "^7.12.17" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-async-generator-functions" "^7.13.15" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-class-static-block" "^7.13.11" + "@babel/plugin-proposal-dynamic-import" "^7.13.8" + "@babel/plugin-proposal-export-namespace-from" "^7.12.13" + "@babel/plugin-proposal-json-strings" "^7.13.8" + "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-numeric-separator" "^7.12.13" + "@babel/plugin-proposal-object-rest-spread" "^7.13.8" + "@babel/plugin-proposal-optional-catch-binding" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-private-methods" "^7.13.0" + "@babel/plugin-proposal-private-property-in-object" "^7.14.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.10.4" - "@babel/plugin-transform-arrow-functions" "^7.10.4" - "@babel/plugin-transform-async-to-generator" "^7.10.4" - "@babel/plugin-transform-block-scoped-functions" "^7.10.4" - "@babel/plugin-transform-block-scoping" "^7.10.4" - "@babel/plugin-transform-classes" "^7.10.4" - "@babel/plugin-transform-computed-properties" "^7.10.4" - "@babel/plugin-transform-destructuring" "^7.10.4" - "@babel/plugin-transform-dotall-regex" "^7.10.4" - "@babel/plugin-transform-duplicate-keys" "^7.10.4" - "@babel/plugin-transform-exponentiation-operator" "^7.10.4" - "@babel/plugin-transform-for-of" "^7.10.4" - "@babel/plugin-transform-function-name" "^7.10.4" - "@babel/plugin-transform-literals" "^7.10.4" - "@babel/plugin-transform-member-expression-literals" "^7.10.4" - "@babel/plugin-transform-modules-amd" "^7.10.4" - "@babel/plugin-transform-modules-commonjs" "^7.10.4" - "@babel/plugin-transform-modules-systemjs" "^7.10.4" - "@babel/plugin-transform-modules-umd" "^7.10.4" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4" - "@babel/plugin-transform-new-target" "^7.10.4" - "@babel/plugin-transform-object-super" "^7.10.4" - "@babel/plugin-transform-parameters" "^7.10.4" - "@babel/plugin-transform-property-literals" "^7.10.4" - "@babel/plugin-transform-regenerator" "^7.10.4" - "@babel/plugin-transform-reserved-words" "^7.10.4" - "@babel/plugin-transform-shorthand-properties" "^7.10.4" - "@babel/plugin-transform-spread" "^7.11.0" - "@babel/plugin-transform-sticky-regex" "^7.10.4" - "@babel/plugin-transform-template-literals" "^7.10.4" - "@babel/plugin-transform-typeof-symbol" "^7.10.4" - "@babel/plugin-transform-unicode-escapes" "^7.10.4" - "@babel/plugin-transform-unicode-regex" "^7.10.4" - "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.11.0" - browserslist "^4.12.0" - core-js-compat "^3.6.2" - invariant "^2.2.2" - levenary "^1.1.1" - semver "^5.5.0" - -"@babel/preset-modules@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" - integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.0" + "@babel/plugin-syntax-top-level-await" "^7.12.13" + "@babel/plugin-transform-arrow-functions" "^7.13.0" + "@babel/plugin-transform-async-to-generator" "^7.13.0" + "@babel/plugin-transform-block-scoped-functions" "^7.12.13" + "@babel/plugin-transform-block-scoping" "^7.13.16" + "@babel/plugin-transform-classes" "^7.13.0" + "@babel/plugin-transform-computed-properties" "^7.13.0" + "@babel/plugin-transform-destructuring" "^7.13.17" + "@babel/plugin-transform-dotall-regex" "^7.12.13" + "@babel/plugin-transform-duplicate-keys" "^7.12.13" + "@babel/plugin-transform-exponentiation-operator" "^7.12.13" + "@babel/plugin-transform-for-of" "^7.13.0" + "@babel/plugin-transform-function-name" "^7.12.13" + "@babel/plugin-transform-literals" "^7.12.13" + "@babel/plugin-transform-member-expression-literals" "^7.12.13" + "@babel/plugin-transform-modules-amd" "^7.14.0" + "@babel/plugin-transform-modules-commonjs" "^7.14.0" + "@babel/plugin-transform-modules-systemjs" "^7.13.8" + "@babel/plugin-transform-modules-umd" "^7.14.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" + "@babel/plugin-transform-new-target" "^7.12.13" + "@babel/plugin-transform-object-super" "^7.12.13" + "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-property-literals" "^7.12.13" + "@babel/plugin-transform-regenerator" "^7.13.15" + "@babel/plugin-transform-reserved-words" "^7.12.13" + "@babel/plugin-transform-shorthand-properties" "^7.12.13" + "@babel/plugin-transform-spread" "^7.13.0" + "@babel/plugin-transform-sticky-regex" "^7.12.13" + "@babel/plugin-transform-template-literals" "^7.13.0" + "@babel/plugin-transform-typeof-symbol" "^7.12.13" + "@babel/plugin-transform-unicode-escapes" "^7.12.13" + "@babel/plugin-transform-unicode-regex" "^7.12.13" + "@babel/preset-modules" "^0.1.4" + "@babel/types" "^7.14.0" + babel-plugin-polyfill-corejs2 "^0.2.0" + babel-plugin-polyfill-corejs3 "^0.2.0" + babel-plugin-polyfill-regenerator "^0.2.0" + core-js-compat "^3.9.0" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" @@ -833,82 +888,71 @@ esutils "^2.0.2" "@babel/preset-typescript@^7.7.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.10.4.tgz#7d5d052e52a682480d6e2cc5aa31be61c8c25e36" - integrity sha512-SdYnvGPv+bLlwkF2VkJnaX/ni1sMNetcGI1+nThF1gyv6Ph8Qucc4ZZAjM5yZcE/AKRXIOTZz7eSRDWOEjPyRQ== + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.13.0.tgz#ab107e5f050609d806fbb039bec553b33462c60a" + integrity sha512-LXJwxrHy0N3f6gIJlYbLta1D9BDtHpQeqwzM0LIfjDlr6UE/D5Mc7W4iDiQzaE+ks0sTjT26ArcHWnJVt0QiHw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-typescript" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-validator-option" "^7.12.17" + "@babel/plugin-transform-typescript" "^7.13.0" "@babel/register@^7.7.0": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.10.5.tgz#354f3574895f1307f79efe37a51525e52fd38d89" - integrity sha512-eYHdLv43nyvmPn9bfNfrcC4+iYNwdQ8Pxk1MFJuU/U5LpSYl/PH4dFMazCYZDFVi8ueG3shvO+AQfLrxpYulQw== + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.13.16.tgz#ae3ab0b55c8ec28763877383c454f01521d9a53d" + integrity sha512-dh2t11ysujTwByQjXNgJ48QZ2zcXKQVdV8s0TbeMI0flmtGWCdTwK9tJiACHXPLmncm5+ktNn/diojA45JE4jg== dependencies: + clone-deep "^4.0.1" find-cache-dir "^2.0.0" - lodash "^4.17.19" make-dir "^2.1.0" pirates "^4.0.0" source-map-support "^0.5.16" "@babel/runtime-corejs3@^7.10.2": - version "7.11.2" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz#02c3029743150188edeb66541195f54600278419" - integrity sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A== + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.14.0.tgz#6bf5fbc0b961f8e3202888cb2cd0fb7a0a9a3f66" + integrity sha512-0R0HTZWHLk6G8jIk0FtoX+AatCtKnswS98VhXwGImFc759PJRp4Tru0PQYZofyijTFUr+gT8Mu7sgXVJLQ0ceg== dependencies: core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.10.2", "@babel/runtime@^7.8.4": - version "7.11.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" - integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== +"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.8.4": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" + integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.10.4", "@babel/template@^7.4.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" - integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0", "@babel/traverse@^7.4.3": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" - integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.0" - "@babel/types" "^7.11.0" +"@babel/template@^7.12.13", "@babel/template@^7.3.3", "@babel/template@^7.4.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.15", "@babel/traverse@^7.14.0", "@babel/traverse@^7.4.3": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.0.tgz#cea0dc8ae7e2b1dec65f512f39f3483e8cc95aef" + integrity sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.14.0" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.14.0" + "@babel/types" "^7.14.0" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" - integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.16", "@babel/types@^7.14.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.0.tgz#3fc3fc74e0cdad878182e5f66cc6bcab1915a802" + integrity sha512-O2LVLdcnWplaGxiPBz12d0HcdN8QdxdsWYhz5LSeuukV/5mn2xUUc3gBeU4QBYPJ18g/UToe8F532XJ608prmg== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" + "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" -"@blakeembrey/deque@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@blakeembrey/deque/-/deque-1.0.5.tgz#f4fa17fc5ee18317ec01a763d355782c7b395eaf" - integrity sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg== - -"@blakeembrey/template@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@blakeembrey/template/-/template-1.0.0.tgz#bf8828bc3ae8004d97904d78f64e3cc2cd216438" - integrity sha512-J6WGZqCLdRMHUkyRG6fBSIFJ0rL60/nsQNh5rQvsYZ5u0PsKw6XQcJcA3DWvd9cN3j/IQx5yB1fexhCafwwUUw== - "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -917,6 +961,27 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@discoveryjs/json-ext@^0.5.0": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752" + integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + "@jest/console@^24.7.1", "@jest/console@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" @@ -1056,6 +1121,27 @@ source-map "^0.6.1" write-file-atomic "2.4.1" +"@jest/transform@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" + integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^26.6.2" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-regex-util "^26.0.0" + jest-util "^26.6.2" + micromatch "^4.0.2" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + "@jest/types@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" @@ -1065,10 +1151,38 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" -"@types/babel__core@^7.1.0": - version "7.1.9" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" - integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents": + version "2.1.8-no-fsevents" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz#da7c3996b8e6e19ebd14d82eaced2313e7769f9b" + integrity sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.0", "@types/babel__core@^7.1.7": + version "7.1.14" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" + integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1077,37 +1191,39 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" - integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + version "7.6.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" + integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + version "7.4.0" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.0.tgz#0c888dd70b3ee9eebb6e4f200e809da0076262be" + integrity sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.13" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.13.tgz#1874914be974a492e1b4cb00585cabb274e8ba18" - integrity sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ== + version "7.11.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.1.tgz#654f6c4f67568e24c23b367e947098c6206fa639" + integrity sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw== dependencies: "@babel/types" "^7.3.0" -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== +"@types/graceful-fs@^4.1.2": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" @@ -1128,6 +1244,13 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/istanbul-reports@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" + integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA== + dependencies: + "@types/istanbul-lib-report" "*" + "@types/jest@^24.0.22": version "24.9.1" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.9.1.tgz#02baf9573c78f1b9974a5f36778b366aa77bd534" @@ -1135,20 +1258,25 @@ dependencies: jest-diff "^24.3.0" -"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" - integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== +"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= +"@types/node@*": + version "15.0.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.1.tgz#ef34dea0881028d11398be5bf4e856743e3dc35a" + integrity sha512-TMkXt0Ck1y0KKsGr9gJtWGjttxlZnnvDtphxUOSd0bfaR6Q1jle+sPvrzNR1urqYTWMinoKvjKfXUGsumaO1PA== + "@types/node@^12.12.5": - version "12.12.54" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.54.tgz#a4b58d8df3a4677b6c08bfbc94b7ad7a7a5f82d1" - integrity sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w== + version "12.20.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.11.tgz#980832cd56efafff8c18aa148c4085eb02a483f4" + integrity sha512-gema+apZ6qLQK7k7F0dGkGCWQYsL0qqKORWOQO6tq46q+x+1C0vbOiOqOwRVlh4RAdbQwV/j/ryr3u5NOG1fPQ== "@types/stack-utils@^1.0.1": version "1.0.1" @@ -1163,63 +1291,70 @@ yaml "*" "@types/yargs-parser@*": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" - integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + version "20.2.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" + integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== "@types/yargs@^13.0.0": - version "13.0.10" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.10.tgz#e77bf3fc73c781d48c2eb541f87c453e321e5f4b" - integrity sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ== + version "13.0.11" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.11.tgz#def2f0c93e4bdf2c61d7e34899b17e34be28d3b1" + integrity sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^15.0.0": + version "15.0.13" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" + integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^3.6.1": - version "3.9.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.9.1.tgz#8cf27b6227d12d66dd8dc1f1a4b04d1daad51c2e" - integrity sha512-XIr+Mfv7i4paEdBf0JFdIl9/tVxyj+rlilWIfZ97Be0lZ7hPvUbS5iHt9Glc8kRI53dsr0PcAEudbf8rO2wGgg== + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz#7e061338a1383f59edc204c605899f93dc2e2c8f" + integrity sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ== dependencies: - "@typescript-eslint/experimental-utils" "3.9.1" + "@typescript-eslint/experimental-utils" "3.10.1" debug "^4.1.1" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@3.9.1": - version "3.9.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.9.1.tgz#b140b2dc7a7554a44f8a86fb6fe7cbfe57ca059e" - integrity sha512-lkiZ8iBBaYoyEKhCkkw4SAeatXyBq9Ece5bZXdLe1LWBUwTszGbmbiqmQbwWA8cSYDnjWXp9eDbXpf9Sn0hLAg== +"@typescript-eslint/experimental-utils@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" + integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/types" "3.9.1" - "@typescript-eslint/typescript-estree" "3.9.1" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" eslint-scope "^5.0.0" eslint-utils "^2.0.0" "@typescript-eslint/parser@^3.6.1": - version "3.9.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.9.1.tgz#ab7983abaea0ae138ff5671c7c7739d8a191b181" - integrity sha512-y5QvPFUn4Vl4qM40lI+pNWhTcOWtpZAJ8pOEQ21fTTW4xTJkRplMjMRje7LYTXqVKKX9GJhcyweMz2+W1J5bMg== + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467" + integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "3.9.1" - "@typescript-eslint/types" "3.9.1" - "@typescript-eslint/typescript-estree" "3.9.1" + "@typescript-eslint/experimental-utils" "3.10.1" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/types@3.9.1": - version "3.9.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.9.1.tgz#b2a6eaac843cf2f2777b3f2464fb1fbce5111416" - integrity sha512-15JcTlNQE1BsYy5NBhctnEhEoctjXOjOK+Q+rk8ugC+WXU9rAcS2BYhoh6X4rOaXJEpIYDl+p7ix+A5U0BqPTw== +"@typescript-eslint/types@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" + integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== -"@typescript-eslint/typescript-estree@3.9.1": - version "3.9.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.9.1.tgz#fd81cada74bc8a7f3a2345b00897acb087935779" - integrity sha512-IqM0gfGxOmIKPhiHW/iyAEXwSVqMmR2wJ9uXHNdFpqVvPaQ3dWg302vW127sBpAiqM9SfHhyS40NKLsoMpN2KA== +"@typescript-eslint/typescript-estree@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" + integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== dependencies: - "@typescript-eslint/types" "3.9.1" - "@typescript-eslint/visitor-keys" "3.9.1" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/visitor-keys" "3.10.1" debug "^4.1.1" glob "^7.1.6" is-glob "^4.0.1" @@ -1227,10 +1362,10 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/visitor-keys@3.9.1": - version "3.9.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.9.1.tgz#92af3747cdb71509199a8f7a4f00b41d636551d1" - integrity sha512-zxdtUjeoSh+prCpogswMwVUJfEFmCOjdzK9rpNjNBfm6EyPt99x3RrJoBOGZO23FCt0WPKUCOL5mb/9D5LjdwQ== +"@typescript-eslint/visitor-keys@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" + integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== dependencies: eslint-visitor-keys "^1.1.0" @@ -1379,6 +1514,23 @@ "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" +"@webpack-cli/configtest@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.2.tgz#2a20812bfb3a2ebb0b27ee26a52eeb3e3f000836" + integrity sha512-3OBzV2fBGZ5TBfdW50cha1lHDVf9vlvRXnjpVbJBa20pSZQaSkMJZiwA8V2vD9ogyeXn8nU5s5A6mHyf5jhMzA== + +"@webpack-cli/info@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.2.3.tgz#ef819d10ace2976b6d134c7c823a3e79ee31a92c" + integrity sha512-lLek3/T7u40lTqzCGpC6CAbY6+vXhdhmwFRxZLMnRm6/sIF/7qMpT8MocXCRQfz0JAh63wpbXLMnsQ5162WS7Q== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.3.1.tgz#911d1b3ff4a843304b9c3bacf67bb34672418441" + integrity sha512-0qXvpeYO6vaNoRBI52/UsbcaBydJCggoBBnIo/ovQQdn6fug0BgwsjorV1hVS7fMqGVTZGcVxv8334gjmbj5hw== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -1390,9 +1542,9 @@ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abab@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.4.tgz#6dfa57b417ca06d21b2478f0e638302f99c2405c" - integrity sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ== + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== acorn-globals@^4.1.0: version "4.3.4" @@ -1403,9 +1555,9 @@ acorn-globals@^4.1.0: acorn-walk "^6.0.1" acorn-jsx@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== acorn-walk@^6.0.1: version "6.2.0" @@ -1418,46 +1570,51 @@ acorn@^5.5.3: integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== acorn@^6.0.1, acorn@^6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== acorn@^7.1.1: - version "7.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" - integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3: - version "6.12.4" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" - integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ== +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + ansi-escapes@^3.0.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: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: - type-fest "^0.11.0" + type-fest "^0.21.3" ansi-regex@^3.0.0: version "3.0.0" @@ -1482,11 +1639,10 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: color-convert "^1.9.0" ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@types/color-name" "^1.1.1" color-convert "^2.0.1" anymatch@^2.0.0: @@ -1497,10 +1653,10 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== +anymatch@^3.0.3, anymatch@~3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -1510,11 +1666,6 @@ aproba@^1.1.1: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -arg@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1550,13 +1701,15 @@ array-equal@^1.0.0: resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= -array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== +array-includes@^3.1.1, array-includes@^3.1.2, array-includes@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" + integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0" + es-abstract "^1.18.0-next.2" + get-intrinsic "^1.1.1" is-string "^1.0.5" array-unique@^0.3.2: @@ -1565,20 +1718,22 @@ array-unique@^0.3.2: integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= array.prototype.flat@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.1" -array.prototype.flatmap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443" - integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg== +array.prototype.flatmap@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" + integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.1" function-bind "^1.1.1" asn1.js@^5.2.0: @@ -1652,16 +1807,16 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" - integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axe-core@^3.5.4: - version "3.5.5" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-3.5.5.tgz#84315073b53fa3c0c51676c588d59da09a192227" - integrity sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q== +axe-core@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.2.0.tgz#6594db4ee62f78be79e32a7295d21b099b60668d" + integrity sha512-1uIESzroqpaTzt9uX48HO+6gfnKu3RwvWdCcWSrX4csMInJfCo1yvKPNXCwXFRpJqRW25tiASb6No0YH57PXqg== -axobject-query@^2.1.2: +axobject-query@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== @@ -1679,15 +1834,28 @@ babel-jest@^24.9.0: chalk "^2.4.2" slash "^2.0.0" +babel-jest@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" + integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== + dependencies: + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + babel-loader@^8.0.6: - version "8.1.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" - integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + version "8.2.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" + integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== dependencies: - find-cache-dir "^2.1.0" + find-cache-dir "^3.3.1" loader-utils "^1.4.0" - mkdirp "^0.5.3" - pify "^4.0.1" + make-dir "^3.1.0" schema-utils "^2.6.5" babel-plugin-dynamic-import-node@^2.3.3: @@ -1707,6 +1875,17 @@ babel-plugin-istanbul@^5.1.0: istanbul-lib-instrument "^3.3.0" test-exclude "^5.2.3" +babel-plugin-istanbul@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" + integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^4.0.0" + test-exclude "^6.0.0" + babel-plugin-jest-hoist@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" @@ -1714,6 +1893,58 @@ babel-plugin-jest-hoist@^24.9.0: dependencies: "@types/babel__traverse" "^7.0.6" +babel-plugin-jest-hoist@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" + integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-polyfill-corejs2@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz#686775bf9a5aa757e10520903675e3889caeedc4" + integrity sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.0" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz#f4b4bb7b19329827df36ff56f6e6d367026cb7a2" + integrity sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.0" + core-js-compat "^3.9.1" + +babel-plugin-polyfill-regenerator@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz#853f5f5716f4691d98c84f8069c7636ea8da7ab8" + integrity sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.0" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + babel-preset-jest@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" @@ -1722,15 +1953,23 @@ babel-preset-jest@^24.9.0: "@babel/plugin-syntax-object-rest-spread" "^7.0.0" babel-plugin-jest-hoist "^24.9.0" +babel-preset-jest@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" + integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== + dependencies: + babel-plugin-jest-hoist "^26.6.2" + babel-preset-current-node-syntax "^1.0.0" + balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== base@^0.11.1: version "0.11.2" @@ -1763,9 +2002,9 @@ binary-extensions@^1.0.0: integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== binary-extensions@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" - integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bindings@^1.5.0: version "1.5.0" @@ -1779,15 +2018,15 @@ bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: - version "4.11.9" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" - integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.1.1: - version "5.1.3" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" - integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== brace-expansion@^1.1.7: version "1.1.11" @@ -1813,14 +2052,14 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@~3.0.2: +braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -brorand@^1.0.1: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= @@ -1869,11 +2108,11 @@ browserify-des@^1.0.0: safe-buffer "^5.1.2" browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: - bn.js "^4.1.0" + bn.js "^5.0.0" randombytes "^2.0.1" browserify-sign@^4.0.0: @@ -1898,15 +2137,16 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.12.0, browserslist@^4.8.5: - version "4.14.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.0.tgz#2908951abfe4ec98737b72f34c3bcedc8d43b000" - integrity sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ== +browserslist@^4.14.5, browserslist@^4.16.5: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== dependencies: - caniuse-lite "^1.0.30001111" - electron-to-chromium "^1.3.523" - escalade "^3.0.2" - node-releases "^1.1.60" + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" bs-logger@0.x: version "0.2.6" @@ -1982,25 +2222,28 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001111: - version "1.0.30001116" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001116.tgz#f3a3dea347f9294a3bdc4292309039cc84117fb8" - integrity sha512-f2lcYnmAI5Mst9+g0nkMIznFGsArRmZ0qU+dnq8l91hymdc2J3SFbiPhOJEeDqC1vtE8nc1qNQyklzB8veJefQ== +caniuse-lite@^1.0.30001219: + version "1.0.30001220" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001220.tgz#c080e1c8eefb99f6cc9685da6313840bdbaf4c36" + integrity sha512-pjC2T4DIDyGAKTL4dMvGUQaMUHRmhvPpAgNNTa14jaBWHu+bLQgvpFqElxh9L4829Fdx0PlKiMp3wnYldRtECA== capture-exit@^2.0.0: version "2.0.0" @@ -2023,10 +2266,10 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -2055,10 +2298,10 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.3.1, chokidar@^3.4.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" - integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== +chokidar@^3.4.0, chokidar@^3.4.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -2066,9 +2309,9 @@ chokidar@^3.3.1, chokidar@^3.4.1: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.4.0" + readdirp "~3.5.0" optionalDependencies: - fsevents "~2.1.2" + fsevents "~2.3.1" chownr@^1.1.1: version "1.1.4" @@ -2076,11 +2319,9 @@ chownr@^1.1.1: integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^2.0.0: version "2.0.0" @@ -2126,6 +2367,15 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -2163,6 +2413,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^1.2.1, colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -2180,6 +2435,11 @@ commander@^4.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -2205,10 +2465,10 @@ concat-stream@^1.5.0: readable-stream "^2.2.2" typedarray "^0.0.6" -confusing-browser-globals@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd" - integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw== +confusing-browser-globals@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" + integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== console-browserify@^1.1.0: version "1.2.0" @@ -2249,18 +2509,23 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.6.2: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" - integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== +core-js-compat@^3.9.0, core-js-compat@^3.9.1: + version "3.11.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.11.1.tgz#57a91e9b02d3bb8cf37f82eceaf44a3d646fa614" + integrity sha512-aZ0e4tmlG/aOBHj92/TuOuZwp6jFvn1WNabU5VOVixzhu5t5Ao+JZkQOPlgNXu6ynwLrwJxklT4Gw1G1VGEh+g== dependencies: - browserslist "^4.8.5" + browserslist "^4.16.5" semver "7.0.0" core-js-pure@^3.0.0: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" - integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== + version "3.11.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.11.1.tgz#fd52fa8c8b7b797b3606524b3d97278a8d8e7f09" + integrity sha512-2JukQi8HgAOCD5CSimxWWXVrUBoA9Br796uIA5Z06bIjt7PBBI19ircFaAxplgE1mJf3x2BY6MkT/HWA/UryPg== + +core-js@3: + version "3.11.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.11.1.tgz#f920392bf8ed63a0ec8e4e729857bfa3d121c525" + integrity sha512-k93Isqg7e4txZWMGNYwevZL9MiogLk8pd1PtwrmFmi8IBq4GXqUaVW/a33Llt6amSI36uSjd0GWwc9pTT9ALlQ== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -2309,7 +2574,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.1: +cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -2381,11 +2646,11 @@ debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: ms "2.0.0" debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: - ms "^2.1.1" + ms "2.1.2" decamelize@^1.2.0: version "1.2.0" @@ -2402,7 +2667,7 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -define-properties@^1.1.2, define-properties@^1.1.3: +define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -2444,11 +2709,6 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= - detect-newline@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -2520,23 +2780,23 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -electron-to-chromium@^1.3.523: - version "1.3.538" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.538.tgz#15226638ee9db5d8e74f4c860cef6078d8e1e871" - integrity sha512-rlyYXLlOoZkJuvY4AJXUpP7CHRVtwZz311HPVoEO1UHo/kqDCsP1pNas0A9paZuPEiYGdLwrjllF2hs69NEaTw== +electron-to-chromium@^1.3.723: + version "1.3.725" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.725.tgz#04fc83f9189169aff50f0a00c6b4090b910cba85" + integrity sha512-2BbeAESz7kc6KBzs7WVrMc1BY5waUphk4D4DX5dSQXJhsc3tP5ZFaiyuL0AB7vUKzDYpIeYwTYlEfxyjsGUrhw== elliptic@^6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" - integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" + bn.js "^4.11.9" + brorand "^1.1.0" hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" emoji-regex@^7.0.1: version "7.0.3" @@ -2549,9 +2809,9 @@ emoji-regex@^8.0.0: integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.0.0.tgz#48a2309cc8a1d2e9d23bc6a67c39b63032e76ea4" - integrity sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w== + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== emojis-list@^3.0.0: version "3.0.0" @@ -2565,19 +2825,31 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^4.1.1, enhanced-resolve@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" - integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== +enhanced-resolve@^4.0.0, enhanced-resolve@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== dependencies: graceful-fs "^4.1.2" memory-fs "^0.5.0" tapable "^1.0.0" +enquirer@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" @@ -2588,22 +2860,27 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== +es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: + version "1.18.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" + integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== dependencies: + call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + get-intrinsic "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" - object-inspect "^1.7.0" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.2" + is-string "^1.0.5" + object-inspect "^1.9.0" object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -2614,16 +2891,21 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -escalade@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4" - integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ== +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escodegen@^1.9.1: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" @@ -2636,13 +2918,13 @@ escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" -eslint-config-airbnb-base@^14.0.0, eslint-config-airbnb-base@^14.2.0: - version "14.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz#fe89c24b3f9dc8008c9c0d0d88c28f95ed65e9c4" - integrity sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q== +eslint-config-airbnb-base@^14.0.0, eslint-config-airbnb-base@^14.2.0, eslint-config-airbnb-base@^14.2.1: + version "14.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" + integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== dependencies: - confusing-browser-globals "^1.0.9" - object.assign "^4.1.0" + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" object.entries "^1.1.2" eslint-config-airbnb-typescript@^9.0.0: @@ -2655,22 +2937,22 @@ eslint-config-airbnb-typescript@^9.0.0: eslint-config-airbnb-base "^14.2.0" eslint-config-airbnb@^18.0.1, eslint-config-airbnb@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz#8a82168713effce8fc08e10896a63f1235499dcd" - integrity sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg== + version "18.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz#b7fe2b42f9f8173e825b73c8014b592e449c98d9" + integrity sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg== dependencies: - eslint-config-airbnb-base "^14.2.0" - object.assign "^4.1.0" + eslint-config-airbnb-base "^14.2.1" + object.assign "^4.1.2" object.entries "^1.1.2" eslint-config-prettier@^6.5.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" - integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== + version "6.15.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" + integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== dependencies: get-stdin "^6.0.0" -eslint-import-resolver-node@^0.3.3: +eslint-import-resolver-node@^0.3.4: version "0.3.4" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== @@ -2687,16 +2969,16 @@ eslint-module-utils@^2.6.0: pkg-dir "^2.0.0" eslint-plugin-import@^2.22.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" - integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== + version "2.22.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" + integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== dependencies: array-includes "^3.1.1" array.prototype.flat "^1.2.3" contains-path "^0.1.0" debug "^2.6.9" doctrine "1.5.0" - eslint-import-resolver-node "^0.3.3" + eslint-import-resolver-node "^0.3.4" eslint-module-utils "^2.6.0" has "^1.0.3" minimatch "^3.0.4" @@ -2706,43 +2988,44 @@ eslint-plugin-import@^2.22.0: tsconfig-paths "^3.9.0" eslint-plugin-jsx-a11y@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz#99ef7e97f567cc6a5b8dd5ab95a94a67058a2660" - integrity sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g== + version "6.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" + integrity sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg== dependencies: - "@babel/runtime" "^7.10.2" + "@babel/runtime" "^7.11.2" aria-query "^4.2.2" array-includes "^3.1.1" ast-types-flow "^0.0.7" - axe-core "^3.5.4" - axobject-query "^2.1.2" + axe-core "^4.0.2" + axobject-query "^2.2.0" damerau-levenshtein "^1.0.6" emoji-regex "^9.0.0" has "^1.0.3" - jsx-ast-utils "^2.4.1" + jsx-ast-utils "^3.1.0" language-tags "^1.0.5" eslint-plugin-react-hooks@^4.0.8: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.1.0.tgz#6323fbd5e650e84b2987ba76370523a60f4e7925" - integrity sha512-36zilUcDwDReiORXmcmTc6rRumu9JIM3WjSvV0nclHoUQ0CNrX866EwONvLR/UqaeqFutbAnVu8PEmctdo2SRQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" + integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== eslint-plugin-react@^7.20.5: - version "7.20.6" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.6.tgz#4d7845311a93c463493ccfa0a19c9c5d0fd69f60" - integrity sha512-kidMTE5HAEBSLu23CUDvj8dc3LdBU0ri1scwHBZjI41oDv4tjsWZKU7MQccFzH1QYPYhsnTF2ovh7JlcIcmxgg== + version "7.23.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.23.2.tgz#2d2291b0f95c03728b55869f01102290e792d494" + integrity sha512-AfjgFQB+nYszudkxRkTFu0UR1zEQig0ArVMPloKhxwlwkzaw/fBiH0QWcBBhZONlXqQC51+nfqFrkn4EzHcGBw== dependencies: - array-includes "^3.1.1" - array.prototype.flatmap "^1.2.3" + array-includes "^3.1.3" + array.prototype.flatmap "^1.2.4" doctrine "^2.1.0" has "^1.0.3" - jsx-ast-utils "^2.4.1" - object.entries "^1.1.2" - object.fromentries "^2.0.2" - object.values "^1.1.1" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.0.4" + object.entries "^1.1.3" + object.fromentries "^2.0.4" + object.values "^1.1.3" prop-types "^15.7.2" - resolve "^1.17.0" - string.prototype.matchall "^4.0.2" + resolve "^2.0.0-next.3" + string.prototype.matchall "^4.0.4" eslint-scope@^4.0.3: version "4.0.3" @@ -2753,11 +3036,11 @@ eslint-scope@^4.0.3: estraverse "^4.1.1" eslint-scope@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" - integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" eslint-utils@^1.4.3: @@ -2837,25 +3120,25 @@ esprima@^4.0.0, esprima@^4.0.1: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== +esrecurse@^4.1.0, esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" -estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0: +estraverse@^5.1.0, estraverse@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== @@ -2866,9 +3149,9 @@ esutils@^2.0.2: integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== events@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" - integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -2879,9 +3162,9 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: safe-buffer "^5.1.1" exec-sh@^0.3.2: - version "0.3.4" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" - integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== execa@^1.0.0: version "1.0.0" @@ -2896,6 +3179,21 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" + integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -2914,13 +3212,6 @@ expand-brackets@^2.1.4: 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" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - expect@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" @@ -3001,6 +3292,11 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + fb-watchman@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" @@ -3058,6 +3354,15 @@ find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" +find-cache-dir@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -3072,15 +3377,13 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -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== +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" + locate-path "^5.0.0" + path-exists "^4.0.0" flat-cache@^2.0.1: version "2.0.1" @@ -3104,6 +3407,13 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + 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" @@ -3166,10 +3476,10 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" -fsevents@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== +fsevents@^2.1.2, fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" @@ -3181,16 +3491,30 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + get-stdin@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" @@ -3203,6 +3527,11 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + 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" @@ -3224,9 +3553,9 @@ glob-parent@^3.1.0: path-dirname "^1.0.0" glob-parent@^5.0.0, glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" @@ -3242,42 +3571,6 @@ glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -3290,10 +3583,10 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.2.4: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== growly@^1.3.0: version "1.3.0" @@ -3313,6 +3606,11 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -3323,10 +3621,10 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== has-value@^0.3.1: version "0.3.1" @@ -3383,7 +3681,7 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hmac-drbg@^1.0.0: +hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= @@ -3392,17 +3690,10 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== html-encoding-sniffer@^1.0.2: version "1.0.2" @@ -3430,6 +3721,11 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -3438,9 +3734,9 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: safer-buffer ">= 2.1.2 < 3" ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + 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" @@ -3452,15 +3748,10 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.4: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== - import-fresh@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -3473,6 +3764,14 @@ import-local@^2.0.0: pkg-dir "^3.0.0" resolve-cwd "^2.0.0" +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -3506,11 +3805,6 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - inquirer@^7.0.0: version "7.3.3" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" @@ -3530,21 +3824,21 @@ inquirer@^7.0.0: strip-ansi "^6.0.0" through "^2.3.6" -internal-slot@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" - integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: - es-abstract "^1.17.0-next.1" + get-intrinsic "^1.1.0" has "^1.0.3" - side-channel "^1.0.2" + side-channel "^1.0.4" -interpret@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== -invariant@^2.2.2, invariant@^2.2.4: +invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -3570,6 +3864,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-bigint@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" + integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -3584,15 +3883,22 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" + integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + dependencies: + call-bind "^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.4, is-callable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" - integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== is-ci@^2.0.0: version "2.0.0" @@ -3601,6 +3907,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-core-module@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.3.0.tgz#d341652e3408bca69c4671b79a0954a3d349f887" + integrity sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw== + 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" @@ -3684,6 +3997,16 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" + integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -3703,11 +4026,12 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-regex@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== +is-regex@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== dependencies: + call-bind "^1.0.2" has-symbols "^1.0.1" is-stream@^1.1.0: @@ -3715,24 +4039,29 @@ is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + is-string@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== -is-symbol@^1.0.2: +is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== dependencies: has-symbols "^1.0.1" -is-typedarray@~1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -3774,6 +4103,11 @@ istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" @@ -3787,6 +4121,16 @@ istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: istanbul-lib-coverage "^2.0.5" semver "^6.0.0" +istanbul-lib-instrument@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + istanbul-lib-report@^2.0.4: version "2.0.8" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" @@ -3940,6 +4284,27 @@ jest-haste-map@^24.9.0: optionalDependencies: fsevents "^1.2.7" +jest-haste-map@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" + integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== + dependencies: + "@jest/types" "^26.6.2" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^26.0.0" + jest-serializer "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.1.2" + jest-jasmine2@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" @@ -4011,6 +4376,11 @@ jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== + jest-resolve-dependencies@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" @@ -4090,6 +4460,14 @@ jest-serializer@^24.9.0: resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== +jest-serializer@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" + integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + jest-snapshot@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" @@ -4127,6 +4505,18 @@ jest-util@^24.9.0: slash "^2.0.0" source-map "^0.6.0" +jest-util@^26.1.0, jest-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" + integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + micromatch "^4.0.2" + jest-validate@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" @@ -4160,6 +4550,15 @@ jest-worker@^24.6.0, jest-worker@^24.9.0: merge-stream "^2.0.0" supports-color "^6.1.0" +jest-worker@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + jest@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" @@ -4174,9 +4573,9 @@ jest@^24.9.0: integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -4254,9 +4653,9 @@ json-stringify-safe@~5.0.1: integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json5@2.x, json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" @@ -4277,13 +4676,13 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -jsx-ast-utils@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" - integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w== +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" + integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== dependencies: - array-includes "^3.1.1" - object.assign "^4.1.0" + array-includes "^3.1.2" + object.assign "^4.1.2" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" @@ -4315,9 +4714,9 @@ kleur@^3.0.3: integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== language-subtag-registry@~0.3.2: - version "0.3.20" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz#a00a37121894f224f763268e431c55556b0c0755" - integrity sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg== + version "0.3.21" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" + integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== language-tags@^1.0.5: version "1.0.5" @@ -4336,13 +4735,6 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levenary@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" - integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== - dependencies: - leven "^3.1.0" - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -4385,6 +4777,15 @@ loader-utils@^1.2.3, loader-utils@^1.4.0: emojis-list "^3.0.0" json5 "^1.0.1" +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -4401,20 +4802,27 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +lodash@4.x, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== loose-envify@^1.0.0, loose-envify@^1.4.0: version "1.4.0" @@ -4430,6 +4838,13 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -4438,6 +4853,13 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" +make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + make-error@1.x: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" @@ -4497,7 +4919,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -4516,6 +4938,14 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.0, micromatch@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -4524,17 +4954,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@1.47.0: + version "1.47.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" + integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + version "2.1.30" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" + integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== dependencies: - mime-db "1.44.0" + mime-db "1.47.0" mimic-fn@^2.1.0: version "2.1.0" @@ -4546,7 +4976,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: +minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= @@ -4587,7 +5017,12 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.x, mkdirp@^0.5.1, mkdirp@^0.5.3: +mkdirp@1.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^0.5.1, mkdirp@^0.5.3: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -4611,7 +5046,7 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -4622,9 +5057,9 @@ mute-stream@0.0.8: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.12.1: - version "2.14.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" - integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== nanomatch@^1.2.9: version "1.2.13" @@ -4698,9 +5133,9 @@ node-modules-regexp@^1.0.0: integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= node-notifier@^5.4.2: - version "5.4.3" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" - integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== + version "5.4.5" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.5.tgz#0cbc1a2b0f658493b4025775a13ad938e96091ef" + integrity sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ== dependencies: growly "^1.3.0" is-wsl "^1.1.0" @@ -4708,10 +5143,10 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-releases@^1.1.60: - version "1.1.60" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.60.tgz#6948bdfce8286f0b5d0e5a88e8384e954dfe7084" - integrity sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA== +node-releases@^1.1.71: + version "1.1.71" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" + integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== normalize-package-data@^2.3.2: version "2.5.0" @@ -4742,6 +5177,13 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + nwsapi@^2.0.7: version "2.2.0" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" @@ -4766,12 +5208,12 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== +object-inspect@^1.9.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.2.tgz#b6385a3e2b7cae0b5eafcf90cddf85d128767f30" + integrity sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA== -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -4783,42 +5225,44 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" -object.entries@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" - integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== +object.entries@^1.1.2, object.entries@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" + integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" has "^1.0.3" -object.fromentries@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" - integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== +object.fromentries@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" + integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.2" has "^1.0.3" -object.getownpropertydescriptors@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== +object.getownpropertydescriptors@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.2" object.pick@^1.3.0: version "1.3.0" @@ -4827,14 +5271,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== +object.values@^1.1.1, object.values@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" + integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.2" has "^1.0.3" once@^1.3.0, once@^1.3.1, once@^1.4.0: @@ -4844,26 +5288,18 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onchange@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/onchange/-/onchange-7.0.2.tgz#77f98263cc8412210c1a2d89a55cc5eb32ad33ec" - integrity sha512-pyJroR9gZKilbJtdGsuyxhFhwaeYSpYVle9hAORGJ5vQQH8n7QT+qWpncJTMEk9dlIXI9tOMjdJwbPaTSPTKFA== - dependencies: - "@blakeembrey/deque" "^1.0.5" - "@blakeembrey/template" "^1.0.0" - arg "^4.1.3" - chokidar "^3.3.1" - cross-spawn "^7.0.1" - ignore "^5.1.4" - tree-kill "^1.2.2" - -onetime@^5.1.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" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" +openapi-types@^7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-7.2.3.tgz#83829911a3410a022f0e0cf2b0b2e67232ccf96e" + integrity sha512-olbaNxz12R27+mTyJ/ZAFEfUruauHH27AkeQHDHRq5AF0LdNkK1SSV7EourXQDK+4aX7dv2HtyirAGK06WMAsA== + optionator@^0.8.1, optionator@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -4905,7 +5341,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0: +p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -4926,6 +5362,13 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-reduce@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" @@ -4988,11 +5431,6 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" @@ -5018,6 +5456,11 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -5028,7 +5471,7 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-key@^3.1.0: +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== @@ -5053,9 +5496,9 @@ path-type@^3.0.0: pify "^3.0.0" pbkdf2@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" - integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -5068,10 +5511,10 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" + integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== pify@^2.0.0: version "2.3.0" @@ -5109,6 +5552,13 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" @@ -5124,6 +5574,11 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +prettier@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" + integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== + pretty-format@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" @@ -5155,12 +5610,12 @@ promise-inflight@^1.0.1: integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= prompts@^2.0.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" - integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== + version "2.4.1" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" + integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== dependencies: kleur "^3.0.3" - sisteransi "^1.0.4" + sisteransi "^1.0.5" prop-types@^15.7.2: version "15.7.2" @@ -5333,10 +5788,10 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" - integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== dependencies: picomatch "^2.2.1" @@ -5347,6 +5802,13 @@ realpath-native@^1.1.0: dependencies: util.promisify "^1.0.0" +rechoir@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca" + integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q== + dependencies: + resolve "^1.9.0" + regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -5355,9 +5817,9 @@ regenerate-unicode-properties@^8.2.0: regenerate "^1.4.0" regenerate@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" - integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.13.4: version "0.13.7" @@ -5379,13 +5841,13 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== +regexp.prototype.flags@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" regexpp@^2.0.1: version "2.0.1" @@ -5397,10 +5859,10 @@ regexpp@^3.0.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== -regexpu-core@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" - integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== dependencies: regenerate "^1.4.0" regenerate-unicode-properties "^8.2.0" @@ -5415,9 +5877,9 @@ regjsgen@^0.5.1: integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== regjsparser@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" - integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + version "0.6.9" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" + integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ== dependencies: jsesc "~0.5.0" @@ -5427,9 +5889,9 @@ remove-trailing-separator@^1.0.1: integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + 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" @@ -5495,13 +5957,12 @@ resolve-cwd@^2.0.0: dependencies: resolve-from "^3.0.0" -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" + resolve-from "^5.0.0" resolve-from@^3.0.0: version "3.0.0" @@ -5513,6 +5974,11 @@ resolve-from@^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-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -5523,11 +5989,20 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.x, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.8.1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== +resolve@^1.10.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.9.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== dependencies: + is-core-module "^2.2.0" path-parse "^1.0.6" restore-cursor@^3.1.0: @@ -5583,9 +6058,9 @@ run-queue@^1.0.0, run-queue@^1.0.3: aproba "^1.1.1" rxjs@^6.6.0: - version "6.6.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2" - integrity sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg== + 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" @@ -5641,15 +6116,15 @@ schema-utils@^1.0.0: ajv-keywords "^3.1.0" schema-utils@^2.6.5: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -5659,16 +6134,18 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^6.0.0, semver@^6.1.2, semver@^6.2.0: +semver@7.x, semver@^7.3.2, semver@^7.3.4: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + 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" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -5704,6 +6181,13 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -5733,20 +6217,21 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== -side-channel@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" - integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: - es-abstract "^1.17.0-next.1" - object-inspect "^1.7.0" + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -sisteransi@^1.0.4: +sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== @@ -5756,6 +6241,11 @@ slash@^2.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -5820,9 +6310,9 @@ source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.1 source-map "^0.6.0" source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + 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.0, source-map@^0.5.6: version "0.5.7" @@ -5856,9 +6346,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -5888,16 +6378,18 @@ sshpk@^1.7.0: tweetnacl "~0.14.0" ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== dependencies: figgy-pudding "^3.5.1" stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" + integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== + dependencies: + escape-string-regexp "^2.0.0" static-extend@^0.1.1: version "0.1.2" @@ -5962,41 +6454,42 @@ string-width@^3.0.0, string-width@^3.1.0: strip-ansi "^5.1.0" string-width@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.matchall@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" - integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== +string.prototype.matchall@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz#608f255e93e072107f5de066f81a2dfb78cf6b29" + integrity sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0" + es-abstract "^1.18.0-next.2" has-symbols "^1.0.1" - internal-slot "^1.0.2" - regexp.prototype.flags "^1.3.0" - side-channel "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" -string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.5" -string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.5" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -6043,6 +6536,11 @@ strip-eof@^1.0.0: resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + strip-json-comments@^3.0.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -6062,10 +6560,10 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" @@ -6123,6 +6621,15 @@ test-exclude@^5.2.3: read-pkg-up "^4.0.0" require-main-filename "^2.0.0" +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -6147,9 +6654,9 @@ through@^2.3.6: integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= timers-browserify@^2.0.4: - version "2.0.11" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" - integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== dependencies: setimmediate "^1.0.4" @@ -6222,26 +6729,32 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -ts-jest@^24.1.0: - version "24.3.0" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.3.0.tgz#b97814e3eab359ea840a1ac112deae68aa440869" - integrity sha512-Hb94C/+QRIgjVZlJyiWwouYUF+siNJHJHknyspaOcZ+OQAIdFG/UrdQVXw/0B8Z3No34xkUXZJpOTy9alOWdVQ== +ts-jest@^26.5.4: + version "26.5.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.5.5.tgz#e40481b6ee4dd162626ba481a2be05fa57160ea5" + integrity sha512-7tP4m+silwt1NHqzNRAPjW1BswnAhopTdc2K3HEkRZjF0ZG2F/e/ypVH0xiZIMfItFtD3CX0XFbwPzp9fIEUVg== dependencies: bs-logger "0.x" buffer-from "1.x" fast-json-stable-stringify "2.x" + jest-util "^26.1.0" json5 "2.x" - lodash.memoize "4.x" + lodash "4.x" make-error "1.x" - mkdirp "0.x" - resolve "1.x" - semver "^5.5" - yargs-parser "10.x" + mkdirp "1.x" + semver "7.x" + yargs-parser "20.x" + +ts-loader@^8.1.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.2.0.tgz#6a3aeaa378aecda543e2ed2c332d3123841d52e0" + integrity sha512-ebXBFrNyMSmbWgjnb3WBloUBK+VSx1xckaXsMXxlZRDqce/OPdYBVN5efB0W3V0defq0Gcy4YuzvPGqRgjj85A== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^4.0.0" + loader-utils "^2.0.0" + micromatch "^4.0.0" + semver "^7.3.4" tsconfig-paths@^3.9.0: version "3.9.0" @@ -6254,14 +6767,14 @@ tsconfig-paths@^3.9.0: strip-bom "^3.0.0" tslib@^1.8.1, tslib@^1.9.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tsutils@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" @@ -6289,25 +6802,42 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@^3.6.4: - version "3.9.7" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" - integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== + version "3.9.9" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.9.tgz#e69905c54bc0681d0518bd4d587cc6f2d0b1a674" + integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w== + +unbox-primitive@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -6370,9 +6900,9 @@ upath@^1.1.1: integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -6400,14 +6930,15 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util.promisify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" + integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.2" + for-each "^0.3.3" has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" + object.getownpropertydescriptors "^2.1.1" util@0.10.3: version "0.10.3" @@ -6428,10 +6959,10 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" - integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== +v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== validate-npm-package-license@^3.0.1: version "3.0.4" @@ -6469,45 +7000,56 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" -watchpack-chokidar2@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" - integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== dependencies: chokidar "^2.1.8" watchpack@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" - integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== dependencies: graceful-fs "^4.1.2" neo-async "^2.5.0" optionalDependencies: chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.0" + watchpack-chokidar2 "^2.0.1" webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -webpack-cli@^3.3.10: - version "3.3.12" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a" - integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag== - dependencies: - chalk "^2.4.2" - cross-spawn "^6.0.5" - enhanced-resolve "^4.1.1" - findup-sync "^3.0.0" - global-modules "^2.0.0" - import-local "^2.0.0" - interpret "^1.4.0" - loader-utils "^1.4.0" - supports-color "^6.1.0" - v8-compile-cache "^2.1.1" - yargs "^13.3.2" +webpack-cli@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.6.0.tgz#27ae86bfaec0cf393fcfd58abdc5a229ad32fd16" + integrity sha512-9YV+qTcGMjQFiY7Nb1kmnupvb1x40lfpj8pwdO/bom+sQiP4OBMKjHq29YQrlDWDPZO9r/qWaRRywKaRDKqBTA== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.0.2" + "@webpack-cli/info" "^1.2.3" + "@webpack-cli/serve" "^1.3.1" + colorette "^1.2.1" + commander "^7.0.0" + enquirer "^2.3.6" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + v8-compile-cache "^2.2.0" + webpack-merge "^5.7.3" + +webpack-merge@^5.7.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.7.3.tgz#2a0754e1877a25a8bbab3d2475ca70a052708213" + integrity sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" webpack-sources@^1.4.0, webpack-sources@^1.4.1: version "1.4.3" @@ -6518,9 +7060,9 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1: source-map "~0.6.1" webpack@^4.41.2: - version "4.44.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.1.tgz#17e69fff9f321b8f117d1fda714edfc0b939cc21" - integrity sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ== + version "4.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== dependencies: "@webassemblyjs/ast" "1.9.0" "@webassemblyjs/helper-module-context" "1.9.0" @@ -6530,7 +7072,7 @@ webpack@^4.41.2: ajv "^6.10.2" ajv-keywords "^3.4.1" chrome-trace-event "^1.0.2" - enhanced-resolve "^4.3.0" + enhanced-resolve "^4.5.0" eslint-scope "^4.0.3" json-parse-better-errors "^1.0.2" loader-runner "^2.4.0" @@ -6576,12 +7118,23 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: +which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -6595,6 +7148,11 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -6630,6 +7188,16 @@ write-file-atomic@2.4.1: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + write@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" @@ -6655,26 +7223,29 @@ xtend@^4.0.0, xtend@~4.0.1: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yaml@*, yaml@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" - integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@10.x: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== - dependencies: - camelcase "^4.1.0" +yargs-parser@20.x: + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== yargs-parser@^13.1.2: version "13.1.2" @@ -6684,7 +7255,7 @@ yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^13.3.0, yargs@^13.3.2: +yargs@^13.3.0: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== From 09eb753ac7c343d71d6023107c50919845a49f49 Mon Sep 17 00:00:00 2001 From: Pongstr Date: Mon, 19 Apr 2021 15:22:36 +0300 Subject: [PATCH 03/13] init: update setup --- package.json | 2 +- src/index.ts | 61 +----- src/lib/console.ts | 36 ---- src/lib/converter.ts | 0 src/lib/exporter.ts | 32 ++++ src/lib/index.ts | 1 + .../components/auth-converter.ts | 157 --------------- .../components/body-converter.ts | 47 ----- .../components/parameters-converter.ts | 147 --------------- .../components/responses-converter.ts | 58 ------ .../paw-to-openapi-converter.ts | 178 ------------------ src/lib/paw-utils.ts | 60 ------ src/lib/url.ts | 126 ------------- src/paw.config.ts | 3 + src/types/paw.d.ts | 16 +- 15 files changed, 47 insertions(+), 877 deletions(-) delete mode 100644 src/lib/console.ts create mode 100644 src/lib/converter.ts create mode 100644 src/lib/exporter.ts create mode 100644 src/lib/index.ts delete mode 100644 src/lib/paw-to-openapi-converter/components/auth-converter.ts delete mode 100644 src/lib/paw-to-openapi-converter/components/body-converter.ts delete mode 100644 src/lib/paw-to-openapi-converter/components/parameters-converter.ts delete mode 100644 src/lib/paw-to-openapi-converter/components/responses-converter.ts delete mode 100644 src/lib/paw-to-openapi-converter/paw-to-openapi-converter.ts delete mode 100755 src/lib/paw-utils.ts delete mode 100644 src/lib/url.ts create mode 100644 src/paw.config.ts diff --git a/package.json b/package.json index a839e8d..a1521d1 100755 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ }, "config": { "name": "OpenAPIv3Generator", - "title": "OpenAPI v3.x Generatpr", + "title": "OpenAPI v3.x", "description": "An OpenAPI generator extension for Paw client.", "identifier": "com.luckymarmot.PawExtensions.OpenAPIv3Generator", "fileExtensions": [ diff --git a/src/index.ts b/src/index.ts index 815f707..b1aa081 100755 --- a/src/index.ts +++ b/src/index.ts @@ -1,60 +1,3 @@ -/* eslint-disable class-methods-use-this */ -import Yaml from 'yaml' -// eslint-disable-next-line import/extensions -import Paw from 'types/paw' -import Console from 'lib/console' -import PawToOpenapiConverter from './lib/paw-to-openapi-converter/paw-to-openapi-converter' -import extension from './config.json' +import { OpenAPIv3Generator } from './lib' -const { - title, - identifier, - fileExtension, - languageHighlighter, - debug, - options, -} = extension - -/** - * @TODO - * Can it be done manually from some input? - */ -const exportFormat = 'json' -// const exportFormat = 'yaml' - -class OpenAPIGenerator implements Paw.Generator { - static title = title - static identifier = identifier - static fileExtension = fileExtension - static languageHighlighter = languageHighlighter - public options = options - public context: Paw.Context - public converter: PawToOpenapiConverter = new PawToOpenapiConverter() - public debug: boolean = debug - - public generate( - context: Paw.Context, - requests: Paw.Request[], - options: Paw.ExtensionOption, - ): string { - if (this.debug) { - const allPawData = { - context, - requests, - options, - } - return Console.stringifyWithCyclicSupport(allPawData) - } - - this.context = context - this.converter.convert(context, requests) - - const openApi = this.converter.generateOutput() - if (OpenAPIGenerator.fileExtension === 'json') { - return JSON.stringify(openApi, null, 2) - } - return Yaml.stringify(openApi) - } -} - -registerCodeGenerator(OpenAPIGenerator) +registerCodeGenerator(OpenAPIv3Generator) diff --git a/src/lib/console.ts b/src/lib/console.ts deleted file mode 100644 index f4ad02e..0000000 --- a/src/lib/console.ts +++ /dev/null @@ -1,36 +0,0 @@ -export default class Console { - static parseArgs(args: any[]): any[] { - return args.map((arg) => { - if (Array.isArray(arg)) { - return `Array: [${arg}]`; - } if (typeof arg === 'object') { - return `Object: ${Console.stringifyWithCyclicSupport(arg)}`; - } - return arg; - }); - } - - static stringifyWithCyclicSupport(object: object) { - const seen: any[] = []; - - return JSON.stringify(object, (key, val) => { - if (val != null && typeof val === 'object') { - if (seen.indexOf(val) < 0) { - seen.push(val); - } - } - - return val; - }, 2); - } - - static log(...args: any[]) { - // eslint-disable-next-line no-console - console.log(...Console.parseArgs(args)); - } - - static error(...args: any[]) { - // eslint-disable-next-line no-console - console.error(...Console.parseArgs(args)); - } -} diff --git a/src/lib/converter.ts b/src/lib/converter.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/lib/exporter.ts b/src/lib/exporter.ts new file mode 100644 index 0000000..0f1542f --- /dev/null +++ b/src/lib/exporter.ts @@ -0,0 +1,32 @@ +import Paw from 'types/paw' +import { logger } from 'utils' +import config from '../paw.config' + +const { identifier, title, inputs, fileExtensions } = config + +/** + */ +export default class OpenAPIv3Generator implements Paw.Generator { + public static title = title + public static inputs = inputs + public static identifier = identifier + public static fileExtensions = [...fileExtensions] + public static languageHighlighter = fileExtensions[0] + + /** + * @method generate + * @summary + * - {@link https://paw.cloud/docs/extensions/create-code-generator} + * @param {Object} context - + * @param {Array} requests + * @param {Object} options + */ + public generate( + context: Paw.Context, + requests: Paw.Request[], + options: Paw.ExtensionOption, + ): string { + logger.log(requests) + return '' + } +} diff --git a/src/lib/index.ts b/src/lib/index.ts new file mode 100644 index 0000000..f5a5b41 --- /dev/null +++ b/src/lib/index.ts @@ -0,0 +1 @@ +export { default as OpenAPIv3Generator } from './exporter' diff --git a/src/lib/paw-to-openapi-converter/components/auth-converter.ts b/src/lib/paw-to-openapi-converter/components/auth-converter.ts deleted file mode 100644 index a6489f1..0000000 --- a/src/lib/paw-to-openapi-converter/components/auth-converter.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { Md5 } from 'md5-typescript' -// eslint-disable-next-line import/extensions -import Paw from 'types/paw' -// eslint-disable-next-line import/extensions -import OpenAPI, { - MapKeyedWithString, - BasicCredentialsLabel, - OAuth2CredentialsLabel, -} from 'types/openapi' - -export type AuthConverterType = [ - string, - OpenAPI.SecurityRequirementObject, - OpenAPI.SecuritySchemeObject, -] - -export default class AuthConverter { - private readonly request: Paw.Request - - private authFound: boolean - - private readonly existingSecuritySchemes: MapKeyedWithString - - private key: string - - private requirement: OpenAPI.SecurityRequirementObject - - private scheme: OpenAPI.SecuritySchemeObject - - constructor( - request: Paw.Request, - existingSecuritySchemes: MapKeyedWithString, - ) { - this.request = request - this.authFound = false - this.existingSecuritySchemes = existingSecuritySchemes - - this.parseBasicAuth() - if (!this.authFound) { - this.parseOAuth2Auth() - } - if (!this.authFound) { - this.parseHttpBearerAuth() - } - } - - getOutput(): AuthConverterType { - return [this.key, this.requirement, this.scheme] - } - - private parseBasicAuth(): void { - if (this.request.httpBasicAuth) { - this.key = BasicCredentialsLabel - this.requirement = {} - this.scheme = { - type: 'http', - scheme: 'basic', - } - - this.requirement[this.key] = [] - - this.authFound = true - } - } - - // eslint-disable-next-line class-methods-use-this - private parseHttpBearerAuth(): void { - const authHeader = this.request.getHeaderByName('authorization') - - if (authHeader && (authHeader as string).match(/bearer /i)) { - this.requirement = {} - this.key = 'BearerAuth' - - this.scheme = { - type: 'http', - scheme: 'bearer', - } - - this.requirement[this.key] = [] - - this.authFound = true - } - } - - // eslint-disable-next-line class-methods-use-this - private parseOAuth2Auth(): void { - const { oauth2 } = this.request - - if (oauth2) { - this.requirement = {} - const keyHash = AuthConverter.generateKeyHash( - oauth2.grant_type as string, - oauth2.authorization_uri as string, - oauth2.access_token_uri as string, - oauth2.scope as string, - ) - this.key = `${OAuth2CredentialsLabel} ${keyHash}` - let sameAuthFound = false - - if ( - this.existingSecuritySchemes && - typeof this.existingSecuritySchemes[this.key] !== 'undefined' - ) { - sameAuthFound = true - this.scheme = this.existingSecuritySchemes[this.key] - } - - if (!sameAuthFound) { - const grantType: string = AuthConverter.camelCaseToCapital( - oauth2.grant_type as string, - ) - const scopes = AuthConverter.convertScopes(oauth2.scope as string) - - const flows: MapKeyedWithString = {} - flows[grantType] = { - authorizationUrl: oauth2.authorization_uri, - tokenUrl: oauth2.access_token_uri, - scopes, - } as OpenAPI.OAuthFlowObject - - this.scheme = { - type: 'oauth2', - flows, - } - } - - this.requirement[this.key] = [] - - this.authFound = true - } - } - - static camelCaseToCapital(string: string) { - return string.replace(/[_][a-z]/g, (snakeWithLetter) => - snakeWithLetter.toUpperCase().replace('_', ''), - ) - } - - static convertScopes(pawScopes: string) { - const openAPIScopes: MapKeyedWithString = {} - - pawScopes.split(' ').forEach((singlePawScope) => { - openAPIScopes[singlePawScope] = singlePawScope - }) - - return openAPIScopes - } - - static generateKeyHash( - grantType: string, - authUrl: string, - tokenUrl: string, - scopes: string, - ) { - return Md5.init(grantType + authUrl + tokenUrl + scopes) - } -} diff --git a/src/lib/paw-to-openapi-converter/components/body-converter.ts b/src/lib/paw-to-openapi-converter/components/body-converter.ts deleted file mode 100644 index 9b66266..0000000 --- a/src/lib/paw-to-openapi-converter/components/body-converter.ts +++ /dev/null @@ -1,47 +0,0 @@ -// eslint-disable-next-line import/extensions -import Paw from 'types/paw.d' -// eslint-disable-next-line import/extensions -import OpenAPI from 'types/openapi.d' - -export default class BodyConverter { - private request: Paw.Request - - private body: OpenAPI.RequestBodyObject - - constructor(request: Paw.Request, bodyContentType: string) { - this.request = request - - this.parseBody(bodyContentType) - } - - getOutput(): OpenAPI.RequestBodyObject { - return this.body - } - - private parseBody(bodyContentType: string): void { - let body - - switch (bodyContentType.toLowerCase()) { - case 'application/json': - body = this.request.jsonBody - break - case 'application/x-www-form-urlencoded': - body = this.request.urlEncodedBody - break - case 'multipart/form-data': - body = this.request.multipartBody - break - default: - body = this.request.body - } - - if (body) { - this.body = { content: {} } - this.body.content[bodyContentType] = { - example: { - value: body, - } as OpenAPI.ExampleObject, - } - } - } -} diff --git a/src/lib/paw-to-openapi-converter/components/parameters-converter.ts b/src/lib/paw-to-openapi-converter/components/parameters-converter.ts deleted file mode 100644 index ddb67fc..0000000 --- a/src/lib/paw-to-openapi-converter/components/parameters-converter.ts +++ /dev/null @@ -1,147 +0,0 @@ -// eslint-disable-next-line import/extensions -import Paw from 'types/paw' -// eslint-disable-next-line import/extensions -import OpenAPI, { NonRequiredLabel } from 'types/openapi' - -export default class ParametersConverter { - private request: Paw.Request - - private readonly parameters: OpenAPI.ParameterObject[] - - private bodyContentType: string = 'text/plain' - - constructor(request: Paw.Request) { - this.request = request - this.parameters = [] - - this.parseQueryParams() - this.parseHeaders() - this.parsePathParams() - } - - getBodyContentType() { - return this.bodyContentType - } - - getParameters(): OpenAPI.ParameterObject[] { - return this.parameters - } - - private parseQueryParams(): void { - this.request.urlParametersNames.forEach((paramName: string) => { - const schema: OpenAPI.SchemaObject = { - type: 'string', - default: this.request.urlParameters[paramName] ?? '', - description: - this.request.getVariableByName(paramName)?.description ?? '', - } - - this.parameters.push({ - name: paramName, - in: 'query', - schema, - }) - }) - } - - private parseHeaders(): void { - Object.entries(this.request.headers).forEach( - ([headerName, headerValue]) => { - if (headerName.toLowerCase() === 'cookie') { - this.parseCookies((headerValue ?? '') as string) - } else { - const schema: OpenAPI.SchemaObject = { - type: 'string', - default: headerValue ?? '', - description: - this.request.getVariableByName(headerName)?.description ?? '', - } - - if ( - headerName.toLowerCase() === 'content-type' && - schema.default !== '' - ) { - if (schema.default.toLowerCase().indexOf('application/json') >= 0) { - this.bodyContentType = 'application/json' - } else if ( - schema.default.toLowerCase().indexOf('application/xml') >= 0 - ) { - this.bodyContentType = 'application/xml' - } else if ( - schema.default - .toLowerCase() - .indexOf('application/x-www-form-urlencoded') >= 0 - ) { - this.bodyContentType = 'application/x-www-form-urlencoded' - } else if ( - schema.default.toLowerCase().indexOf('multipart/form-data') >= 0 - ) { - this.bodyContentType = 'multipart/form-data' - } - } - - this.parameters.push({ - name: headerName, - in: 'header', - schema, - }) - } - }, - ) - } - - private parseCookies(cookiesString: string): void { - // eslint-disable-next-line array-callback-return - cookiesString.split('; ').map((cookieString) => { - const [cookieName, cookieValue] = cookieString.split('=') - - const schema: OpenAPI.SchemaObject = { - type: 'string', - default: cookieValue, - } - - const newParam: OpenAPI.ParameterObject = { - name: cookieName, - in: 'cookie', - schema, - } - - this.parameters.push(newParam) - }) - } - - private parsePathParams(): void { - if (this.request.variables.length > 0) { - this.request.variables.forEach((variable) => { - if ( - variable && - !this.parameters.some((param) => param.name === variable.name) - ) { - const newParam: OpenAPI.ParameterObject = { - name: variable.name, - in: 'path', - required: true, - } - - const variableValue = variable.getCurrentValue() - - if (!variable.required) { - newParam.example = { - // just to inform Paw while importing back that exported file - summary: NonRequiredLabel, - value: true, - } - } - - newParam.schema = { - type: 'string', - default: variableValue ?? '', - description: variable.description ?? '', - } - - this.parameters.push(newParam) - } - }) - } - } -} diff --git a/src/lib/paw-to-openapi-converter/components/responses-converter.ts b/src/lib/paw-to-openapi-converter/components/responses-converter.ts deleted file mode 100644 index 0d734ab..0000000 --- a/src/lib/paw-to-openapi-converter/components/responses-converter.ts +++ /dev/null @@ -1,58 +0,0 @@ -// eslint-disable-next-line import/extensions -import Paw from 'types/paw' -// eslint-disable-next-line import/extensions -import OpenAPI, { MapKeyedWithString } from 'types/openapi' - -export default class ResponsesConverter { - private request: Paw.Request - - private readonly responses: OpenAPI.ResponsesObject - - constructor(request: Paw.Request) { - this.request = request - this.responses = { - default: { - description: 'Default response', - } as OpenAPI.ResponseObject, - } as OpenAPI.ResponsesObject - - this.parsePawResponses() - } - - getOutput(): OpenAPI.ResponsesObject { - return this.responses - } - - private parsePawResponses() { - const lastExchange = this.request.getLastExchange() - if (lastExchange) { - const content = {} as MapKeyedWithString - const description = `Response ${lastExchange.responseStatusCode}` - const headers = {} as MapKeyedWithString - - Object.entries(lastExchange.responseHeaders).forEach( - ([headerName, headerContent]) => { - headers[headerName] = { - schema: { - default: headerContent, - }, - } - - if (headerName.toLowerCase() === 'content-type') { - content[headerContent.replace(/;.+/, '')] = { - schema: { - default: lastExchange.responseBody, - }, - } - } - }, - ) - - this.responses[lastExchange.responseStatusCode] = { - content, - description, - headers, - } as OpenAPI.ResponseObject - } - } -} diff --git a/src/lib/paw-to-openapi-converter/paw-to-openapi-converter.ts b/src/lib/paw-to-openapi-converter/paw-to-openapi-converter.ts deleted file mode 100644 index 1815f1a..0000000 --- a/src/lib/paw-to-openapi-converter/paw-to-openapi-converter.ts +++ /dev/null @@ -1,178 +0,0 @@ -// eslint-disable-next-line import/extensions -import Paw from 'types/paw' -// eslint-disable-next-line import/extensions -import OpenAPI, { MapKeyedWithString } from 'types/openapi' -import { convertEnvString } from '../paw-utils' -import URL from '../url' -import AuthConverter, { AuthConverterType } from './components/auth-converter' -import BodyConverter from './components/body-converter' -import ParametersConverter from './components/parameters-converter' -import ResponsesConverter from './components/responses-converter' -import Console from '../console' - -export default class PawToOpenapiConverter { - private readonly info: OpenAPI.InfoObject - - private readonly paths: OpenAPI.PathsObject - - private readonly components: OpenAPI.ComponentsObject - - constructor() { - this.info = { - title: 'OpenAPI export', - version: Date.now().toString(), - } - this.paths = {} - this.components = { - securitySchemes: {}, - } - } - - convert(context: Paw.Context, requests: Paw.Request[]) { - this.generateInfo(context) - requests.forEach((request: Paw.Request) => { - const parametersConverter = new ParametersConverter(request) - - const parameters = parametersConverter.getParameters() - - const url = new URL(request, context, parameters) - - const body = PawToOpenapiConverter.generateBody( - request, - parametersConverter.getBodyContentType(), - ) - const auth = PawToOpenapiConverter.generateAuth( - request, - this.components - .securitySchemes as MapKeyedWithString, - ) - const responses = PawToOpenapiConverter.generateResponses(request) - - this.paths[url.pathname] = this.generatePathItem( - request, - parameters, - url, - body, - auth, - responses, - ) - }) - } - - generateOutput(): OpenAPI.OpenAPIObject { - return { - openapi: '3.0.3', - info: this.info, - paths: this.paths, - components: this.components, - } - } - - private generateInfo(context: Paw.Context): void { - if (context.document.name) { - this.info.title = context.document.name - } - } - - private generatePathItem( - request: Paw.Request, - parameters: OpenAPI.ParameterObject[], - url: URL, - body: OpenAPI.RequestBodyObject | null, - auth: AuthConverterType, - responses: OpenAPI.ResponsesObject, - ): OpenAPI.PathItemObject { - const operation: OpenAPI.OperationObject = { - operationId: request.id, - summary: request.name, - description: request.description, - responses, - } - - if (parameters.length > 0) { - operation.parameters = parameters - } - - if (body) { - operation.requestBody = body - } - - const [authKey, authRequirement, authScheme] = auth - - if (authKey && authRequirement && authScheme) { - if (this.components.securitySchemes) { - this.components.securitySchemes[authKey] = authScheme - } - operation.security = [authRequirement] - } - - let pathItem: OpenAPI.PathItemObject - - if (this.paths[url.pathname]) { - pathItem = this.paths[url.pathname] - if ( - pathItem.servers && - !pathItem.servers.some((server) => server.url === url.hostname) - ) { - pathItem.servers.push({ url: url.hostname }) - } - } else { - pathItem = { - servers: [ - { - url: url.hostname, - }, - ], - } - } - - switch (request.method) { - case 'GET': - pathItem.get = !pathItem.get ? operation : pathItem.get - break - case 'POST': - pathItem.post = !pathItem.post ? operation : pathItem.post - break - case 'DELETE': - pathItem.delete = !pathItem.delete ? operation : pathItem.delete - break - case 'OPTIONS': - pathItem.options = !pathItem.options ? operation : pathItem.options - break - case 'HEAD': - pathItem.head = !pathItem.head ? operation : pathItem.head - break - case 'PATCH': - pathItem.patch = !pathItem.patch ? operation : pathItem.patch - break - case 'TRACE': - pathItem.trace = !pathItem.trace ? operation : pathItem.trace - break - default: - // nothing - } - - return pathItem - } - - static generateBody( - request: Paw.Request, - bodyContentType: string, - ): OpenAPI.RequestBodyObject | null { - const bodyConverter = new BodyConverter(request, bodyContentType) - return bodyConverter.getOutput() - } - - static generateAuth( - request: Paw.Request, - existingSecuritySchemes: MapKeyedWithString, - ): AuthConverterType { - const authConverter = new AuthConverter(request, existingSecuritySchemes) - return authConverter.getOutput() - } - - static generateResponses(request: Paw.Request): OpenAPI.ResponsesObject { - const responsesConverter = new ResponsesConverter(request) - return responsesConverter.getOutput() - } -} diff --git a/src/lib/paw-utils.ts b/src/lib/paw-utils.ts deleted file mode 100755 index 90d53ea..0000000 --- a/src/lib/paw-utils.ts +++ /dev/null @@ -1,60 +0,0 @@ -// eslint-disable-next-line import/extensions -import Paw from 'types/paw' - -const makeDv = ( - type: string, - properties?: { [key: string]: any }, -): DynamicValue => new DynamicValue(type, properties) - -const makeDs = (...components: Paw.DynamicStringComponent[]): DynamicString => - new DynamicString(...components) - -const makeEnvDv = (variableId: string): DynamicValue => - makeDv('com.luckymarmot.EnvironmentVariableDynamicValue', { - environmentVariable: variableId, - }) - -const makeRequestDv = (variableId: string): DynamicValue => - makeDv('com.luckymarmot.RequestVariableDynamicValue', { - variableUUID: variableId, - }) - -const makeFileDv = (): DynamicValue => - makeDv('com.luckymarmot.FileContentDynamicValue', { - bookmarkData: null, - }) - -const convertEnvString = ( - dynamicString: DynamicString, - context: Paw.Context, -): string => { - if (!dynamicString) { - return '' - } - return dynamicString.components - .map((component): string => { - if (typeof component === 'string') { - return component - } - if ( - component.type === 'com.luckymarmot.EnvironmentVariableDynamicValue' - ) { - const envVarId = (component as any).environmentVariable - const envVar = context.getEnvironmentVariableById(envVarId) - if (envVar) { - return `{${envVar.name}}` - } - } - return component.getEvaluatedString() - }) - .join('') -} - -export { - makeDv, - makeDs, - makeEnvDv, - makeRequestDv, - makeFileDv, - convertEnvString, -} diff --git a/src/lib/url.ts b/src/lib/url.ts deleted file mode 100644 index f85d523..0000000 --- a/src/lib/url.ts +++ /dev/null @@ -1,126 +0,0 @@ -// eslint-disable-next-line import/extensions -import OpenAPI from 'types/openapi' -// eslint-disable-next-line import/extensions -import Paw from 'types/paw' -import { convertEnvString } from './paw-utils' - -export default class URL { - hostname: string - - pathname: string - - port: string - - fullUrl: string - - constructor( - request: Paw.Request, - context: Paw.Context, - parameters: OpenAPI.ParameterObject[], - ) { - this.fullUrl = convertEnvString( - request.getUrl(true) as DynamicString, - context, - ) - - const urlRegex = /^([^:]+):\/\/([^:/]+)(?::([0-9]*))?(?:(\/.*))?\??$/i - - let match = this.fullUrl.match(urlRegex) - - if (match) { - this.parseMatches(match) - } else { - this.fullUrl = request.urlBase - match = this.fullUrl.match(urlRegex) - this.parseMatches(match) - } - - this.parseParameters(parameters) - } - - public replacePathParam(variableValue: string, variableName: string): void { - if (this.pathname.indexOf(`/${variableValue}/`) < 0) { - throw new Error('Param cannot be replaced') - } - - this.pathname = this.pathname.replace( - `/${variableValue}/`, - `/{${variableName}}/`, - ) - } - - public addPathParam(variableName: string): void { - this.pathname = `${this.pathname}{${variableName}}/` - } - - private parseMatches(match: RegExpMatchArray | null) { - if (match) { - if (match[2]) { - let host = 'http' - if (match[1]) { - // eslint-disable-next-line prefer-destructuring - host = match[1] - } - - this.hostname = URL.addSlashAtEnd(`${host}://${match[2]}`) - } - - if (match[3]) { - // eslint-disable-next-line prefer-destructuring - this.port = match[3] - } - - if (match[4]) { - this.pathname = decodeURI( - URL.addSlashAtEnd( - match[4] - .replace(new RegExp('//', 'g'), '/') - .replace(new RegExp('\\?.*'), ''), - ), - ) - } else { - this.pathname = '/' - } - } - } - - private parseParameters(parameters: OpenAPI.ParameterObject[]) { - parameters.forEach((param) => { - if ( - param.in === 'path' && - param.name && - typeof (param?.schema as OpenAPI.SchemaObject).default !== - 'undefined' && - this.pathname.indexOf(`{${param.name}}`) < 0 && - this.hostname.indexOf(`{${param.name}}`) < 0 - ) { - const paramName = param.name - const paramValue = (param.schema as OpenAPI.SchemaObject).default - if ( - paramValue !== null && - (paramValue === '0' || (paramValue as string).length > 0) - ) { - try { - this.replacePathParam(paramValue as string, paramName) - } catch (error) { - this.addPathParam(paramName) - } - } else { - try { - this.replacePathParam('', paramName) // hacky way to try insert empty value in correct place in URL -> try replace "//" with "/{param_name}/" - } catch (error) { - this.addPathParam(paramName) - } - } - } - }) - } - - static addSlashAtEnd(variable: string): string { - if (variable[variable.length - 1] !== '/') { - return `${variable}/` - } - - return variable - } -} diff --git a/src/paw.config.ts b/src/paw.config.ts new file mode 100644 index 0000000..01c1bc2 --- /dev/null +++ b/src/paw.config.ts @@ -0,0 +1,3 @@ +import pkg from '../package.json' + +export default { ...pkg.config } diff --git a/src/types/paw.d.ts b/src/types/paw.d.ts index 2be6d6f..25b65d5 100755 --- a/src/types/paw.d.ts +++ b/src/types/paw.d.ts @@ -1,6 +1,12 @@ -declare module 'json-schema-instantiator' +declare module 'promise' declare global { + namespace NodeJS { + interface Global { + location: any + } + } + function registerImporter(importer: any): void function registerCodeGenerator(generator: any): void @@ -484,13 +490,7 @@ declare namespace Paw { } class Generator { - identifier: string - title: string - fileExtension?: string - languageHighlighter?: string - inputs?: unknown - help?: string - generate( + public generate( context: Context, requests: Request[], options: ExtensionOption, From 58a7e6da2cec1c3e483ae6c57c5e7c9d5e524b3d Mon Sep 17 00:00:00 2001 From: Pongstr Date: Thu, 22 Apr 2021 18:58:36 +0300 Subject: [PATCH 04/13] chore(update): simplify converters --- src/lib/converter.ts | 351 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 351 insertions(+) diff --git a/src/lib/converter.ts b/src/lib/converter.ts index e69de29..e46ae07 100644 --- a/src/lib/converter.ts +++ b/src/lib/converter.ts @@ -0,0 +1,351 @@ +import { OpenAPIV3 } from 'openapi-types' +import toJsonSchema from 'to-json-schema' +import Paw from 'types/paw' +import { logger, PawURL } from 'utils' +import ParametersConverter from './param-converter' + +type PawToOAS3 = OpenAPIV3.OperationObject & { + path: string + method: string +} + +/** + * @private + * @function extendToJsonSchema + * @summary + * a function that includes missing key+value that makes up a requestObject schema and + * also includes exampes based. + * + * @todo: add proper typings + * + * @param {Object} refSchema - a schema data + * @param {Object} reference - an object where refSchema is built from + * + * @returns {Object} + */ +function extendToJsonSchema(refSchema: any, reference: any): any { + const schema = { ...refSchema } + if (refSchema.type === 'object') { + const props = schema.properties + + Object.keys(props).forEach((i: string) => { + if (props[i].type === 'array') { + props[i].type = + reference[i].length > 0 ? typeof reference[i][0] : 'string' + + if (props[i].type === 'array') { + props[i].items = { + type: reference[i].length > 0 ? typeof reference[i][0] : 'string', + } + } + } + + if (props[i]['type'] === 'integer') { + props[i].format = 'int64' + props[i].example = reference[i] + } + + if (props[i].type === 'string') { + props[i].example = reference[i] || '' + delete props[i].format + } + + if (props[i].type === 'object') { + extendToJsonSchema(props[i], reference[i]) + } + }) + } + + return schema +} + +function jsonParseCheck(str: string): unknown { + try { + return JSON.parse(str) + } catch (error) { + return str + } +} + +/** + * @function buildDocumentInfoObject + * @summary + * @param {Object} context - an instance of Paw Context object + * @returns {Object} + */ +export function buildDocumentInfoObject( + context: Paw.Context, +): OpenAPIV3.InfoObject { + const { user, document } = context + const { name } = document + return { + title: name || '', + description: '', + version: '1.0.0', + contact: { + name: user!.username || '', + email: user!.email || '', + }, + } +} + +/** + * @function getServers + * @summary + * + * @param {Array} requests - an array of Paw Requests + * @param {Object} context - an instance of Paw Context object + * + * @returns {Array} + */ +export function buildServerObject( + requests: Paw.Request[], + context: Paw.Context, +): OpenAPIV3.ServerObject[] { + /** + * @function mapServers + * - an array map callback function to map servers used in the requests. + */ + function mapServers(item: Paw.Request): OpenAPIV3.ServerObject { + const paramCoverter = new ParametersConverter(item) + const parameters = paramCoverter.getParameters() + const requestURL = new PawURL(item, context, parameters) + + const getBasePath = new RegExp(/(\/api\/v\d+)/, 'g') + const getBaseURL = new URL(requestURL.fullUrl) + + let baseURL = new URL(getBaseURL.origin) + let basePathStr = '' + let variables = null + + if (getBasePath.test(getBaseURL.pathname)) { + const hasBasePath = getBaseURL.pathname.match(getBasePath) || [] + if (hasBasePath.length > 0) { + basePathStr = '{basePath}' + variables = { + ['basePath']: { + default: hasBasePath[0] || '', + }, + } + } + } + return { + url: baseURL.href + basePathStr, + description: '', + variables: variables || undefined, + } + } + + /** + * @function filterDuplicates + * - an array filter callback function to remove recurring server objects. + */ + function filterDuplicates( + item: OpenAPIV3.ServerObject, + index: number, + arr: OpenAPIV3.ServerObject[], + ) { + return ( + index === + arr.findIndex( + (currentObject) => + JSON.stringify(currentObject) === JSON.stringify(item), + ) + ) + } + + return [...requests] + .map(mapServers) + .filter(filterDuplicates) as OpenAPIV3.ServerObject[] +} + +/** + * @function buildRequestObject + * @summary + * @returns {Object} + */ +export function buildRequestBodyObject( + request: Paw.Request, +): OpenAPIV3.RequestBodyObject | undefined { + let output: OpenAPIV3.RequestBodyObject = { + description: request.description, + content: {}, + required: ['post', 'put', 'patch'].includes( + request.method.toString().toLowerCase(), + ), + } + // extract content type, currently we have support to parse the schema for these + // content types: application/x-www-form-urlencoded, application/json + const getContentType = Object.keys(request.headers) + .filter((header) => header.toLowerCase() === 'content-type') + .map((header) => request.headers[header]) + const contentType = + getContentType.length > 0 ? getContentType[0] : 'text/plain' + + if (request.jsonBody && contentType === 'application/json') { + output.content[contentType as string] = { + schema: extendToJsonSchema( + toJsonSchema(request.jsonBody), + request.jsonBody, + ) as OpenAPIV3.SchemaObject, + } + + return output as OpenAPIV3.RequestBodyObject + } + + return undefined +} + +/** + * @function buildResponseObject + * @summary + * @param {Object} request - an instance of Paw request. + * @returns {Object} + */ +export function buildResponseObject( + request: Paw.Request, +): OpenAPIV3.ResponsesObject { + let schema = {} + const getHttpExchange = request.getLastExchange() + + logger.log('getHttpExchange', getHttpExchange) + + if (!getHttpExchange) { + return { + 200: { description: '' }, + } + } + + const getContentType = Object.keys(getHttpExchange.responseHeaders) + .filter((header) => header.toLowerCase() === 'content-type') + .map((header) => getHttpExchange.responseHeaders[header]) + + const statusCode = getHttpExchange.responseStatusCode + const contentType = + getContentType.length > 0 ? getContentType[0] : 'text/plain' + + const responses = { + [statusCode]: { + description: '', + content: {}, + }, + } + + const getResponseType = jsonParseCheck(getHttpExchange.responseBody) + + if ( + contentType === 'application/json' && + typeof getResponseType === 'object' + ) { + const responseBody = toJsonSchema(getResponseType) + schema = extendToJsonSchema(responseBody, getResponseType) + responses[statusCode].content = { + [contentType]: { schema }, + } + } + + if (Object.keys(responses[statusCode].content).length === 0) { + // @ts-ignore + delete responses[statusCode].content + } + + return responses +} + +/** + * @function buildParameterObject + * @summary + * @returns {Array} + */ +export function buildParameterObject(): OpenAPIV3.ParameterObject[] { + return [] +} + +/** + * @function buildOperationObject + * @summary + * @param {Object} request - an extended version of PathItemObject + * @returns {Object} + */ +export function buildOperationObject( + request: PawToOAS3, +): OpenAPIV3.OperationObject { + return {} +} + +/** + * @function buildPathItemObject + * @summary + * + * @param {Array} requests - an array of Paw Requests + * @param {Object} context - an instance of Paw Context object + * + * @returns {Array} + */ +export function buildPathItemObject( + request: Paw.Request[], + context: Paw.Context, +): OpenAPIV3.PathItemObject { + /** + * @function mapRequestData + * - an array map callback that maps paw request data + */ + function mapRequestData(item: Paw.Request): PawToOAS3 { + const { method, description, id, name } = item + + const paramCoverter = new ParametersConverter(item) + const parameters = paramCoverter.getParameters() + const requestURL = new PawURL(item, context, parameters) + + const getRequestPath = requestURL.pathname + const getPathPrefix = new RegExp(/(\/api\/v\d+)/, 'g') + + const requestBody = buildRequestBodyObject(item) + const responses = buildResponseObject(item) + + const output = { + method: method as string, + path: getPathPrefix.test(getRequestPath) + ? getRequestPath.replace(getPathPrefix, '').replace(/\/$/, '') + : getRequestPath, + summary: name, + description, + operationId: id, + parameters, + requestBody, + responses, + security: [], + } + + if (!requestBody) { + delete output.requestBody + } + + return output + } + + /** + * @function mapRequestMethods + * - an array reduce callback that groups requests with the same endpoints. + * - removes null, undefined or empty value keys + */ + function mapRequestMethods( + accumulator: any, + requestItem: PawToOAS3, + ): OpenAPIV3.PathItemObject { + accumulator[requestItem.path] = accumulator[requestItem.path] || {} + + const key = (requestItem.method as string).toLowerCase() + accumulator[requestItem.path][key] = { ...requestItem } + + delete accumulator[requestItem.path][key].path + delete accumulator[requestItem.path][key].method + return accumulator + } + + const a = [...request] + .map(mapRequestData) + .reduce(mapRequestMethods, Object.create({}) as OpenAPIV3.PathItemObject) + + return a +} From 16c423d5bcbd088deb6774559356887fbb1abb26 Mon Sep 17 00:00:00 2001 From: Pongstr Date: Fri, 23 Apr 2021 15:28:36 +0300 Subject: [PATCH 05/13] init: update build configs --- .babelrc | 4 ++- package.json | 10 +++++--- tsconfig.json | 2 +- yarn.lock | 69 ++++++++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 73 insertions(+), 12 deletions(-) diff --git a/.babelrc b/.babelrc index 23dd526..fcc8878 100755 --- a/.babelrc +++ b/.babelrc @@ -1,8 +1,10 @@ { "presets": [ [ - "@babel/env", + "@babel/preset-env", { + "useBuiltIns": "usage", + "corejs": 3, "targets": { "safari": "6" } diff --git a/package.json b/package.json index a1521d1..0a9297d 100755 --- a/package.json +++ b/package.json @@ -21,11 +21,12 @@ "@babel/plugin-proposal-object-rest-spread": "^7.6.2", "@babel/plugin-transform-classes": "^7.13.0", "@babel/plugin-transform-runtime": "^7.6.2", + "@babel/polyfill": "^7.12.1", "@babel/preset-env": "^7.13.12", "@babel/preset-typescript": "^7.7.0", "@babel/register": "^7.7.0", "@types/jest": "^24.0.22", - "@types/node": "^12.12.5", + "@types/to-json-schema": "^0.2.0", "@types/yaml": "^1.9.7", "@typescript-eslint/eslint-plugin": "^3.6.1", "@typescript-eslint/parser": "^3.6.1", @@ -51,10 +52,10 @@ "webpack-cli": "^4.6.0" }, "config": { - "name": "OpenAPIv3Generator", - "title": "OpenAPI v3.x", + "name": "OpenAPIv3xGenerator-beta", + "title": "OpenAPI v3.x Generator (beta)", "description": "An OpenAPI generator extension for Paw client.", - "identifier": "com.luckymarmot.PawExtensions.OpenAPIv3Generator", + "identifier": "com.luckymarmot.PawExtensions.OpenAPIv3xGenerator-beta", "fileExtensions": [ "json", "yaml", @@ -66,6 +67,7 @@ }, "dependencies": { "md5-typescript": "^1.0.5", + "to-json-schema": "^0.2.5", "yaml": "^1.10.0" } } diff --git a/tsconfig.json b/tsconfig.json index 7f01505..c55d501 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "noImplicitAny": true, "module": "commonjs", "target": "es5", - "lib": ["ES2015", "ES2020"], + "lib": ["es6", "dom"], "esModuleInterop": true, "strictNullChecks": true, "noEmit": true, diff --git a/yarn.lock b/yarn.lock index 10ac901..082ae88 100644 --- a/yarn.lock +++ b/yarn.lock @@ -797,6 +797,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" +"@babel/polyfill@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.12.1.tgz#1f2d6371d1261bbd961f3c5d5909150e12d0bd96" + integrity sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.4" + "@babel/preset-env@^7.13.12": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.0.tgz#236f88cd5da625e625dd40500d4824523f50e6c5" @@ -1258,7 +1266,7 @@ dependencies: jest-diff "^24.3.0" -"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5": +"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5": version "7.0.7" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== @@ -1273,16 +1281,18 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.1.tgz#ef34dea0881028d11398be5bf4e856743e3dc35a" integrity sha512-TMkXt0Ck1y0KKsGr9gJtWGjttxlZnnvDtphxUOSd0bfaR6Q1jle+sPvrzNR1urqYTWMinoKvjKfXUGsumaO1PA== -"@types/node@^12.12.5": - version "12.20.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.11.tgz#980832cd56efafff8c18aa148c4085eb02a483f4" - integrity sha512-gema+apZ6qLQK7k7F0dGkGCWQYsL0qqKORWOQO6tq46q+x+1C0vbOiOqOwRVlh4RAdbQwV/j/ryr3u5NOG1fPQ== - "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== +"@types/to-json-schema@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@types/to-json-schema/-/to-json-schema-0.2.0.tgz#6c76736449942aa8a16a522fa2d3fcfd3bcb8d15" + integrity sha512-9fqRjNFSSxJ8dQrE4v8gThS5ftxdFj8Q0y8hAjaF+uN+saJRxLiJdtFaDd9sv3bhzwcB2oDJpT/1ZelHnexbLw== + dependencies: + "@types/json-schema" "*" + "@types/yaml@^1.9.7": version "1.9.7" resolved "https://registry.yarnpkg.com/@types/yaml/-/yaml-1.9.7.tgz#2331f36e0aac91311a63d33eb026c21687729679" @@ -2527,6 +2537,11 @@ core-js@3: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.11.1.tgz#f920392bf8ed63a0ec8e4e729857bfa3d121c525" integrity sha512-k93Isqg7e4txZWMGNYwevZL9MiogLk8pd1PtwrmFmi8IBq4GXqUaVW/a33Llt6amSI36uSjd0GWwc9pTT9ALlQ== +core-js@^2.6.5: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -4814,11 +4829,41 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + +lodash.keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-4.2.0.tgz#a08602ac12e4fb83f91fc1fb7a360a4d9ba35205" + integrity sha1-oIYCrBLk+4P5H8H7ejYKTZujUgU= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.omit@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= +lodash.without@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" + integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= + +lodash.xor@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.xor/-/lodash.xor-4.5.0.tgz#4d48ed7e98095b0632582ba714d3ff8ae8fb1db6" + integrity sha1-TUjtfpgJWwYyWCunFNP/iuj7HbY= + lodash@4.x, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -6682,6 +6727,18 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= +to-json-schema@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/to-json-schema/-/to-json-schema-0.2.5.tgz#ef3c3f11ad64460dcfbdbafd0fd525d69d62a98f" + integrity sha512-jP1ievOee8pec3tV9ncxLSS48Bnw7DIybgy112rhMCEhf3K4uyVNZZHr03iQQBzbV5v5Hos+dlZRRyk6YSMNDw== + dependencies: + lodash.isequal "^4.5.0" + lodash.keys "^4.2.0" + lodash.merge "^4.6.2" + lodash.omit "^4.5.0" + lodash.without "^4.4.0" + lodash.xor "^4.5.0" + 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" From a5cf6b3ff9df61eb6a00733931817cb350b788ee Mon Sep 17 00:00:00 2001 From: Pongstr Date: Sat, 24 Apr 2021 22:28:36 +0300 Subject: [PATCH 06/13] init: update utils to match current flow --- src/config.json | 15 ---- src/utils/console.ts | 29 +++++++- src/utils/dynamic-values.ts | 65 +++++------------ src/utils/paw-url.ts | 136 ++++++++++++++++++++++-------------- 4 files changed, 131 insertions(+), 114 deletions(-) delete mode 100644 src/config.json diff --git a/src/config.json b/src/config.json deleted file mode 100644 index e7c8c71..0000000 --- a/src/config.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "OpenAPI 3.0", - "identifier": "com.luckymarmot.PawExtensions.OpenAPIGenerator", - "fileExtension": "json", - "languageHighlighter": "json", - "debug": false, - "targetPath": "/Library/Containers/com.luckymarmot.Paw/Data/Library/Application Support/com.luckymarmot.Paw/Extensions", - "options": { - "inputs": {}, - "file": { - "name": "", - "path": "" - } - } -} diff --git a/src/utils/console.ts b/src/utils/console.ts index 6d06a3d..e514ae0 100644 --- a/src/utils/console.ts +++ b/src/utils/console.ts @@ -1,5 +1,23 @@ const log = console.log +/** + * @private + * @function cyclicSupport + * @summary + * + * @returns {Object} + */ +function cyclicSupport() { + const seen = new WeakSet() + return function returnValue(key: string, value: unknown) { + if (typeof value === 'object' && value !== null) { + if (seen.has(value)) return + seen.add(value) + } + return value + } +} + /** * @private * @function parseObjects @@ -11,7 +29,16 @@ const log = console.log */ function parseObjects(data: unknown): string { if (typeof data === 'object') { - return JSON.stringify(data, null, 2) + const cyclic = JSON.parse(JSON.stringify(data, cyclicSupport(), 2)) + + if (Array.isArray(cyclic)) { + const arr = cyclic.filter((item) => item !== null) + if (arr.length === 0) return 'null' + if (arr.length === 1) return JSON.stringify(arr[0], null, 2) + return JSON.stringify(arr, null, 2) + } + + return JSON.stringify(data, cyclicSupport(), 2) } try { diff --git a/src/utils/dynamic-values.ts b/src/utils/dynamic-values.ts index f2269a6..581a7ec 100644 --- a/src/utils/dynamic-values.ts +++ b/src/utils/dynamic-values.ts @@ -79,52 +79,23 @@ export const createFileValues = (): DynamicValue => * @returns {DynamicValue} class instance */ export function convertEnvString( - s: string, - envManager: EnvironmentManager, - defaultValue: string = '', - request: Paw.Request, -): string | DynamicString { - const re = /\{([^}]+)\}/g - let match - const components: DynamicStringComponent[] = [] - let idx = 0 - - // eslint-disable-next-line no-cond-assign - while ((match = re.exec(s))) { - // push any string here before - if (match.index > idx) { - components.push(s.substr(idx, match.index - idx)) - } - - if (envManager.hasEnvironmentVariable(match[1])) { - envManager.setEnvironmentVariableValue(match[1], defaultValue) - components.push(envManager.getDynamicValue(match[1])) - } else { - let requestVariable = request.getVariableByName(match[1]) - if (requestVariable && requestVariable.id) { - components.push( - new DynamicValue('com.luckymarmot.RequestVariableDynamicValue', { - variableUUID: requestVariable.id, - }), - ) + dynamicString: DynamicString, + context: Paw.Context, +): string { + if (!dynamicString) return '' + return dynamicString.components + .map((component): string => { + if (typeof component === 'string') { + return component } - } - - idx = match.index + match[0].length - } - - // add remaining string - if (idx < s.length) { - components.push(s.substr(idx)) - } - - // return - if (components.length === 0) { - return '' - } - if (components.length === 1 && typeof components[0] === 'string') { - return components[0] - } - - return createDynamicString(...components) + if (component.type === ENVIRONMENT_DYNAMIC_VALUE) { + const envVarId = (component as any).environmentVariable + const envVar = context.getEnvironmentVariableById(envVarId) + if (envVar) { + return `{${envVar.name}}` + } + } + return component.getEvaluatedString() + }) + .join('') } diff --git a/src/utils/paw-url.ts b/src/utils/paw-url.ts index 8f05ea0..6aece07 100644 --- a/src/utils/paw-url.ts +++ b/src/utils/paw-url.ts @@ -2,6 +2,7 @@ import { OpenAPIV3 } from 'openapi-types' import Paw from 'types/paw' import EnvironmentManager from './environment' import { convertEnvString } from './dynamic-values' +import logger from './console' export interface PawURLOptions { openApi: OpenAPIV3.Document @@ -12,56 +13,54 @@ export interface PawURLOptions { } export default class PawURL { - hostname: string - pathname: string - port: string - fullUrl: string | DynamicString - serverVariables: MapKeyedWithString + public hostname: string = 'https://echo.paw.cloud' + public pathname: string + public port: string + public fullUrl: string + constructor( - pathItem: OpenAPIV3.PathItemObject, - openApi: OpenAPIV3.Document, - pathName: string, - envManager: EnvironmentManager, request: Paw.Request, + context: Paw.Context, + parameters: OpenAPIV3.ParameterObject[], ) { - let server: OpenAPIV3.ServerObject = { url: '' } - let match: RegExpMatchArray | null = [] - - if (pathItem.servers && pathItem.servers.length > 0) { - this.fullUrl = `${PawURL.removeSlashFromEnd( - pathItem.servers[0].url, - )}${pathName}` - // eslint-disable-next-line prefer-destructuring - server = pathItem.servers[0] - } else if (openApi.servers && openApi.servers.length > 0) { - this.fullUrl = `${PawURL.removeSlashFromEnd( - openApi.servers[0].url, - )}${pathName}` - // eslint-disable-next-line prefer-destructuring - server = openApi.servers[0] + const getURL = convertEnvString( + request.getUrl(true) as DynamicString, + context, + ) + + this.fullUrl = this.createValidURL(getURL) + + const urlRegex = /^([^:]+):\/\/([^:/]+)(?::([0-9]*))?(?:(\/.*))?\??$/i + + let match = this.fullUrl.match(urlRegex) + + if (match) { + this.parseMatches(match) + } else { + this.fullUrl = request.urlBase + match = this.fullUrl.match(urlRegex) + this.parseMatches(match) } - if (server.variables) { - this.serverVariables = server.variables + this.parseParameters(parameters) + } + + public replacePathParam(variableValue: string, variableName: string): void { + if (this.pathname.indexOf(`/${variableValue}/`) < 0) { + throw new Error('Param cannot be replaced') } - this.fullUrl = convertEnvString( - this.fullUrl as string, - envManager, - '', - request, + this.pathname = this.pathname.replace( + `/${variableValue}/`, + `/{${variableName}}/`, ) + } - if (typeof this.fullUrl === 'string') { - match = this.fullUrl.match( - /^([^:]+):\/\/([^:/]+)(?::([0-9]*))?(?:(\/.*))?$/i, - ) - } else { - match = (this.fullUrl as DynamicString) - .getEvaluatedString() - .match(/^([^:]+):\/\/([^:/]+)(?::([0-9]*))?(?:(\/.*))?$/i) - } + public addPathParam(variableName: string): void { + this.pathname = `${this.pathname}{${variableName}}/` + } + private parseMatches(match: RegExpMatchArray | null) { if (match) { if (match[2]) { let host = 'http' @@ -79,9 +78,12 @@ export default class PawURL { } if (match[4]) { - this.pathname = PawURL.addSlashAtEnd(match[4]).replace( - new RegExp('//', 'g'), - '/', + this.pathname = decodeURI( + PawURL.addSlashAtEnd( + match[4] + .replace(new RegExp('//', 'g'), '/') + .replace(new RegExp('\\?.*'), ''), + ), ) } else { this.pathname = '/' @@ -89,17 +91,49 @@ export default class PawURL { } } - static addSlashAtEnd(variable: string): string { - if (variable[variable.length - 1] !== '/') { - return `${variable}/` - } + private parseParameters(parameters: OpenAPIV3.ParameterObject[]) { + parameters.forEach((param) => { + if ( + param.in === 'path' && + param.name && + typeof (param?.schema as OpenAPIV3.SchemaObject).default !== + 'undefined' && + this.pathname.indexOf(`{${param.name}}`) < 0 && + this.hostname.indexOf(`{${param.name}}`) < 0 + ) { + const paramName = param.name + const paramValue = (param.schema as OpenAPIV3.SchemaObject).default + if ( + paramValue !== null && + (paramValue === '0' || (paramValue as string).length > 0) + ) { + try { + this.replacePathParam(paramValue as string, paramName) + } catch (error) { + this.addPathParam(paramName) + } + } else { + try { + this.replacePathParam('', paramName) // hacky way to try insert empty value in correct place in URL -> try replace "//" with "/{param_name}/" + } catch (error) { + this.addPathParam(paramName) + } + } + } + }) + } - return variable + private createValidURL(url: string): string { + try { + return new URL(url).href + } catch (error) { + return new URL(url, this.hostname).href + } } - static removeSlashFromEnd(variable: string): string { - if (variable[variable.length - 1] === '/') { - return variable.substr(0, variable.length - 1) + static addSlashAtEnd(variable: string): string { + if (variable[variable.length - 1] !== '/') { + return `${variable}/` } return variable From 433d7ef7da4fbb4b00c1894aeb1b6827f3424d08 Mon Sep 17 00:00:00 2001 From: Pongstr Date: Sun, 25 Apr 2021 22:28:36 +0300 Subject: [PATCH 07/13] init: temp add param converters --- src/lib/exporter.ts | 90 ++++++++++++++++++++++- src/lib/param-converter.ts | 145 +++++++++++++++++++++++++++++++++++++ 2 files changed, 231 insertions(+), 4 deletions(-) create mode 100644 src/lib/param-converter.ts diff --git a/src/lib/exporter.ts b/src/lib/exporter.ts index 0f1542f..c3c95dd 100644 --- a/src/lib/exporter.ts +++ b/src/lib/exporter.ts @@ -1,17 +1,28 @@ +import { OpenAPIV3 } from 'openapi-types' import Paw from 'types/paw' -import { logger } from 'utils' +import { convertEnvString, logger, PawURL } from 'utils' import config from '../paw.config' +import { + buildDocumentInfoObject, + buildPathItemObject, + buildRequestBodyObject, + buildResponseObject, + buildServerObject, +} from './converter' + +import ParametersConverter from './param-converter' const { identifier, title, inputs, fileExtensions } = config /** + * @class OpenAPIv3Generator + * @description */ export default class OpenAPIv3Generator implements Paw.Generator { public static title = title public static inputs = inputs public static identifier = identifier public static fileExtensions = [...fileExtensions] - public static languageHighlighter = fileExtensions[0] /** * @method generate @@ -26,7 +37,78 @@ export default class OpenAPIv3Generator implements Paw.Generator { requests: Paw.Request[], options: Paw.ExtensionOption, ): string { - logger.log(requests) - return '' + const info = buildDocumentInfoObject(context) + const servers = buildServerObject(requests, context) || [] + const paths = buildPathItemObject(requests, context) + + return JSON.stringify( + { + openapi: '3.0.3', + info, + servers, + paths, + }, + null, + 2, + ) + } + + /** + * @method getPathItemObject + * @summary + * + * @param {Object} request + * @returns {Object} + */ + private getPathItemObject( + request: Paw.Request[], + context: Paw.Context, + ): OpenAPIV3.PathItemObject | null { + const getPaths = [...request] + .map((item: Paw.Request) => { + const { method, description, id } = item + + const paramCoverter = new ParametersConverter(item) + const parameters = paramCoverter.getParameters() + const requestURL = new PawURL(item, context, parameters) + + const getRequestPath = requestURL.pathname + const getPathPrefix = new RegExp(/(\/api\/v\d+)/, 'g') + + const requestBody: + | OpenAPIV3.RequestBodyObject + | undefined = buildRequestBodyObject(item) + const responses: + | OpenAPIV3.ResponsesObject + | undefined = buildResponseObject(item) + + const output = { + tags: [], + summary: description, + description, + method, + path: getPathPrefix.test(getRequestPath) + ? getRequestPath.replace(getPathPrefix, '').replace(/\/$/, '') + : getRequestPath, + operationId: id, + parameters, + requestBody, + security: [], + responses, + } + + return output + }) + .reduce((accumulator: any, requestItem) => { + accumulator[requestItem.path] = accumulator[requestItem.path] || {} + + const key = (requestItem.method as string).toLowerCase() + accumulator[requestItem.path][key] = { ...requestItem } + + delete accumulator[requestItem.path][key].path + delete accumulator[requestItem.path][key].method + return accumulator + }, Object.create({})) + return getPaths || null } } diff --git a/src/lib/param-converter.ts b/src/lib/param-converter.ts new file mode 100644 index 0000000..b7ddc80 --- /dev/null +++ b/src/lib/param-converter.ts @@ -0,0 +1,145 @@ +import Paw from 'types/paw.d' +import { OpenAPIV3 } from 'openapi-types' + +export default class ParametersConverter { + private request: Paw.Request + + private readonly parameters: OpenAPIV3.ParameterObject[] + + private bodyContentType: string = 'text/plain' + + constructor(request: Paw.Request) { + this.request = request + this.parameters = [] + + this.parseQueryParams() + this.parseHeaders() + this.parsePathParams() + } + + getBodyContentType() { + return this.bodyContentType + } + + getParameters(): OpenAPIV3.ParameterObject[] { + return this.parameters + } + + private parseQueryParams(): void { + this.request.urlParametersNames.forEach((paramName: string) => { + const schema: OpenAPIV3.SchemaObject = { + type: 'string', + default: this.request.urlParameters[paramName] ?? '', + description: + this.request.getVariableByName(paramName)?.description ?? '', + } + + this.parameters.push({ + name: paramName, + in: 'query', + schema, + }) + }) + } + + private parseHeaders(): void { + Object.entries(this.request.headers).forEach( + ([headerName, headerValue]) => { + if (headerName.toLowerCase() === 'cookie') { + this.parseCookies((headerValue ?? '') as string) + } else { + const schema: OpenAPIV3.SchemaObject = { + type: 'string', + default: headerValue ?? '', + description: + this.request.getVariableByName(headerName)?.description ?? '', + } + + if ( + headerName.toLowerCase() === 'content-type' && + schema.default !== '' + ) { + if (schema.default.toLowerCase().indexOf('application/json') >= 0) { + this.bodyContentType = 'application/json' + } else if ( + schema.default.toLowerCase().indexOf('application/xml') >= 0 + ) { + this.bodyContentType = 'application/xml' + } else if ( + schema.default + .toLowerCase() + .indexOf('application/x-www-form-urlencoded') >= 0 + ) { + this.bodyContentType = 'application/x-www-form-urlencoded' + } else if ( + schema.default.toLowerCase().indexOf('multipart/form-data') >= 0 + ) { + this.bodyContentType = 'multipart/form-data' + } + } + + this.parameters.push({ + name: headerName, + in: 'header', + schema, + }) + } + }, + ) + } + + private parseCookies(cookiesString: string): void { + // eslint-disable-next-line array-callback-return + cookiesString.split('; ').map((cookieString) => { + const [cookieName, cookieValue] = cookieString.split('=') + + const schema: OpenAPIV3.SchemaObject = { + type: 'string', + default: cookieValue, + } + + const newParam: OpenAPIV3.ParameterObject = { + name: cookieName, + in: 'cookie', + schema, + } + + this.parameters.push(newParam) + }) + } + + private parsePathParams(): void { + if (this.request.variables.length > 0) { + this.request.variables.forEach((variable) => { + if ( + variable && + !this.parameters.some((param) => param.name === variable.name) + ) { + const newParam: OpenAPIV3.ParameterObject = { + name: variable.name, + in: 'path', + required: true, + } + + const variableValue = variable.getCurrentValue() + + if (!variable.required) { + newParam.example = { + // just to inform Paw while importing back that exported file + summary: 'NonRequired', + value: true, + } + } + + newParam.schema = { + type: 'string', + default: variableValue ?? '', + description: variable.description ?? '', + } + + this.parameters.push(newParam) + } + }) + } + } +} From 9370958986fd82acc74e2cc240737a140c63cfb1 Mon Sep 17 00:00:00 2001 From: Pongstr Date: Thu, 6 May 2021 15:57:48 +0300 Subject: [PATCH 08/13] init: safe-parse json string --- src/lib/converter.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/lib/converter.ts b/src/lib/converter.ts index e46ae07..d77ca91 100644 --- a/src/lib/converter.ts +++ b/src/lib/converter.ts @@ -59,7 +59,14 @@ function extendToJsonSchema(refSchema: any, reference: any): any { return schema } -function jsonParseCheck(str: string): unknown { +/** + * @private + * @function jsonParseCheck + * @summary safely parse json string + * @param {String} str - a valid json string or not? + * @returns {Object|String} + */ +function jsonParseCheck(str: string): any { try { return JSON.parse(str) } catch (error) { From 78d46f9162a701f49325d7bddd4c20d40620b559 Mon Sep 17 00:00:00 2001 From: Pongstr Date: Fri, 7 May 2021 18:46:27 +0300 Subject: [PATCH 09/13] init: fix for oas3 validation --- package.json | 1 + src/lib/converter.ts | 162 ++++++++++++++++++++++++++++++------------- src/lib/exporter.ts | 69 +----------------- yarn.lock | 25 +++++++ 4 files changed, 142 insertions(+), 115 deletions(-) diff --git a/package.json b/package.json index 0a9297d..8d5817d 100755 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ }, "dependencies": { "md5-typescript": "^1.0.5", + "query-string": "^7.0.0", "to-json-schema": "^0.2.5", "yaml": "^1.10.0" } diff --git a/src/lib/converter.ts b/src/lib/converter.ts index d77ca91..0944a29 100644 --- a/src/lib/converter.ts +++ b/src/lib/converter.ts @@ -1,5 +1,6 @@ import { OpenAPIV3 } from 'openapi-types' import toJsonSchema from 'to-json-schema' +import qs from 'query-string' import Paw from 'types/paw' import { logger, PawURL } from 'utils' import ParametersConverter from './param-converter' @@ -16,11 +17,12 @@ type PawToOAS3 = OpenAPIV3.OperationObject & { * a function that includes missing key+value that makes up a requestObject schema and * also includes exampes based. * - * @todo: add proper typings + * @todo: + * - add proper typings please + * - add mechanism to detect date-time * * @param {Object} refSchema - a schema data * @param {Object} reference - an object where refSchema is built from - * * @returns {Object} */ function extendToJsonSchema(refSchema: any, reference: any): any { @@ -28,6 +30,8 @@ function extendToJsonSchema(refSchema: any, reference: any): any { if (refSchema.type === 'object') { const props = schema.properties + if (!props) return schema + Object.keys(props).forEach((i: string) => { if (props[i].type === 'array') { props[i].type = @@ -62,22 +66,29 @@ function extendToJsonSchema(refSchema: any, reference: any): any { /** * @private * @function jsonParseCheck - * @summary safely parse json string + * @summary + * safely parse json string and or query string into objects. this utility + * fallsback to string, in which should match a `text/plain` content type. * @param {String} str - a valid json string or not? * @returns {Object|String} */ function jsonParseCheck(str: string): any { + // const isQueryString = new RegExp( + // '^?([w-]+(=[w-]*)?(&[w-]+(=[w-]*)?)*)?$', + // 'g', + // ) try { return JSON.parse(str) } catch (error) { + // return isQueryString.test(str) ? qs.parse(str) : str return str } } /** * @function buildDocumentInfoObject - * @summary - * @param {Object} context - an instance of Paw Context object + * @summary a function that builds openapi document info object + * @param {Object} context - an instance of Paw Context object. * @returns {Object} */ export function buildDocumentInfoObject( @@ -100,8 +111,8 @@ export function buildDocumentInfoObject( * @function getServers * @summary * - * @param {Array} requests - an array of Paw Requests - * @param {Object} context - an instance of Paw Context object + * @param {Array} requests - an array of Paw Requests. + * @param {Object} context - an instance of Paw Context object. * * @returns {Array} */ @@ -203,57 +214,113 @@ export function buildRequestBodyObject( return undefined } +/** + * @function buildResponseObject + * @summary + * a function that builds a singline response object based on + * httpexchange's response body content type. + * + * @param {String} contentType - + * @param {Object|String} getResponseType - + * + * @returns {Object} + */ +function buildResponseObject( + media: string, + content: any, +): OpenAPIV3.ResponseObject { + // If the response is an array, build a schema from the first item in the collection. + const responseSchema = + Array.isArray(content) && content.length > 0 + ? toJsonSchema(content[0]) + : toJsonSchema(content) + + // utilize the built schema, extend it to comply with oas3 schema ref + const schema = + Array.isArray(content) && content.length > 0 + ? extendToJsonSchema(responseSchema, content[0]) + : extendToJsonSchema(responseSchema, content) + return { + description: '', + content: { + [media]: { + schema: Array.isArray(content) + ? { type: 'array', items: { ...schema } } + : { ...schema }, + }, + }, + } +} + /** * @function buildResponseObject * @summary * @param {Object} request - an instance of Paw request. * @returns {Object} */ -export function buildResponseObject( +export function buildResponsesObject( request: Paw.Request, ): OpenAPIV3.ResponsesObject { - let schema = {} const getHttpExchange = request.getLastExchange() - logger.log('getHttpExchange', getHttpExchange) - if (!getHttpExchange) { - return { - 200: { description: '' }, - } + return { 200: { description: '' } } } const getContentType = Object.keys(getHttpExchange.responseHeaders) .filter((header) => header.toLowerCase() === 'content-type') .map((header) => getHttpExchange.responseHeaders[header]) - const statusCode = getHttpExchange.responseStatusCode + const getHeaders = Object.keys(getHttpExchange.responseHeaders) + .map((header) => ({ + key: header, + value: { + description: '', + schema: { + type: typeof getHttpExchange.responseHeaders[header], + example: getHttpExchange.responseHeaders[header], + }, + }, + })) + .reduce( + (acc, curr) => ({ ...acc, [curr.key]: curr.value }), + Object.create({}) as OpenAPIV3.HeaderObject, + ) + + const statusCode = getHttpExchange.responseStatusCode.toString() const contentType = getContentType.length > 0 ? getContentType[0] : 'text/plain' - const responses = { + const responses: OpenAPIV3.ResponsesObject = { [statusCode]: { description: '', - content: {}, }, } const getResponseType = jsonParseCheck(getHttpExchange.responseBody) - - if ( - contentType === 'application/json' && - typeof getResponseType === 'object' - ) { - const responseBody = toJsonSchema(getResponseType) - schema = extendToJsonSchema(responseBody, getResponseType) - responses[statusCode].content = { - [contentType]: { schema }, - } - } - - if (Object.keys(responses[statusCode].content).length === 0) { - // @ts-ignore - delete responses[statusCode].content + const isJSON = new RegExp('(application/json)', 'g') + const isURLEncoded = new RegExp('(application/x-www-form-urlencoded)', 'g') + + switch (true) { + case isJSON.test(contentType) && typeof getResponseType === 'object': + case isURLEncoded.test(contentType) && typeof getResponseType === 'object': + responses[statusCode] = { + ...buildResponseObject(contentType, getResponseType), + headers: getHeaders as { [key: string]: OpenAPIV3.HeaderObject }, + } + break + default: + responses[statusCode] = { + description: '', + content: { + [contentType]: { + example: { + value: getResponseType, + }, + }, + }, + } + break } return responses @@ -268,21 +335,11 @@ export function buildParameterObject(): OpenAPIV3.ParameterObject[] { return [] } -/** - * @function buildOperationObject - * @summary - * @param {Object} request - an extended version of PathItemObject - * @returns {Object} - */ -export function buildOperationObject( - request: PawToOAS3, -): OpenAPIV3.OperationObject { - return {} -} - /** * @function buildPathItemObject * @summary + * - is a function where `pathItemObject` and `operationObject` are extracted from paw request. + * - it maps request path and methods which are utilized to build the operationObject. * * @param {Array} requests - an array of Paw Requests * @param {Object} context - an instance of Paw Context object @@ -308,7 +365,7 @@ export function buildPathItemObject( const getPathPrefix = new RegExp(/(\/api\/v\d+)/, 'g') const requestBody = buildRequestBodyObject(item) - const responses = buildResponseObject(item) + const responses = buildResponsesObject(item) const output = { method: method as string, @@ -343,16 +400,25 @@ export function buildPathItemObject( accumulator[requestItem.path] = accumulator[requestItem.path] || {} const key = (requestItem.method as string).toLowerCase() - accumulator[requestItem.path][key] = { ...requestItem } + accumulator[requestItem.path][key] = { + ...requestItem, + } as OpenAPIV3.OperationObject delete accumulator[requestItem.path][key].path delete accumulator[requestItem.path][key].method return accumulator } - const a = [...request] + return [...request] .map(mapRequestData) .reduce(mapRequestMethods, Object.create({}) as OpenAPIV3.PathItemObject) +} - return a +export function buildSecurityScheme( + request: Paw.Request, +): OpenAPIV3.SecuritySchemeObject { + return { + type: 'http', + scheme: 'http', + } } diff --git a/src/lib/exporter.ts b/src/lib/exporter.ts index c3c95dd..bd34f51 100644 --- a/src/lib/exporter.ts +++ b/src/lib/exporter.ts @@ -1,22 +1,16 @@ -import { OpenAPIV3 } from 'openapi-types' import Paw from 'types/paw' -import { convertEnvString, logger, PawURL } from 'utils' import config from '../paw.config' import { buildDocumentInfoObject, buildPathItemObject, - buildRequestBodyObject, - buildResponseObject, buildServerObject, } from './converter' -import ParametersConverter from './param-converter' - const { identifier, title, inputs, fileExtensions } = config /** - * @class OpenAPIv3Generator - * @description + * @class + * OpenAPIv3Generator */ export default class OpenAPIv3Generator implements Paw.Generator { public static title = title @@ -52,63 +46,4 @@ export default class OpenAPIv3Generator implements Paw.Generator { 2, ) } - - /** - * @method getPathItemObject - * @summary - * - * @param {Object} request - * @returns {Object} - */ - private getPathItemObject( - request: Paw.Request[], - context: Paw.Context, - ): OpenAPIV3.PathItemObject | null { - const getPaths = [...request] - .map((item: Paw.Request) => { - const { method, description, id } = item - - const paramCoverter = new ParametersConverter(item) - const parameters = paramCoverter.getParameters() - const requestURL = new PawURL(item, context, parameters) - - const getRequestPath = requestURL.pathname - const getPathPrefix = new RegExp(/(\/api\/v\d+)/, 'g') - - const requestBody: - | OpenAPIV3.RequestBodyObject - | undefined = buildRequestBodyObject(item) - const responses: - | OpenAPIV3.ResponsesObject - | undefined = buildResponseObject(item) - - const output = { - tags: [], - summary: description, - description, - method, - path: getPathPrefix.test(getRequestPath) - ? getRequestPath.replace(getPathPrefix, '').replace(/\/$/, '') - : getRequestPath, - operationId: id, - parameters, - requestBody, - security: [], - responses, - } - - return output - }) - .reduce((accumulator: any, requestItem) => { - accumulator[requestItem.path] = accumulator[requestItem.path] || {} - - const key = (requestItem.method as string).toLowerCase() - accumulator[requestItem.path][key] = { ...requestItem } - - delete accumulator[requestItem.path][key].path - delete accumulator[requestItem.path][key].method - return accumulator - }, Object.create({})) - return getPaths || null - } } diff --git a/yarn.lock b/yarn.lock index 082ae88..accb70d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3360,6 +3360,11 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= + find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" @@ -5738,6 +5743,16 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +query-string@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.0.0.tgz#aaad2c8d5c6a6d0c6afada877fecbd56af79e609" + integrity sha512-Iy7moLybliR5ZgrK/1R3vjrXq03S13Vz4Rbm5Jg3EFq1LUmQppto0qtXz4vqZ386MSRjZgnTSZ9QC+NZOSd/XA== + dependencies: + decode-uri-component "^0.2.0" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -6395,6 +6410,11 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== +split-on-first@^1.0.0: + version "1.1.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" @@ -6481,6 +6501,11 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + string-length@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" From 814d41f644f9390b99c38937f3ee686571daf526 Mon Sep 17 00:00:00 2001 From: Pongstr Date: Fri, 7 May 2021 19:22:49 +0300 Subject: [PATCH 10/13] updates --- src/lib/converter.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib/converter.ts b/src/lib/converter.ts index 0944a29..8c5a3df 100644 --- a/src/lib/converter.ts +++ b/src/lib/converter.ts @@ -289,7 +289,9 @@ export function buildResponsesObject( const statusCode = getHttpExchange.responseStatusCode.toString() const contentType = - getContentType.length > 0 ? getContentType[0] : 'text/plain' + getContentType.length > 0 + ? getContentType[0].replace(/(; .*)$/g, '') + : 'text/plain' const responses: OpenAPIV3.ResponsesObject = { [statusCode]: { From c284052cb72ae3a0207bbeb65f94297af25c4631 Mon Sep 17 00:00:00 2001 From: Pongstr Date: Sun, 9 May 2021 23:46:07 +0300 Subject: [PATCH 11/13] init: security schema (oauth2) - updated: nullable types - updated: safe parse json string or query string --- src/lib/converter.ts | 133 +++++++++++++++++++++++++++++++++++++++---- src/lib/exporter.ts | 9 +++ 2 files changed, 130 insertions(+), 12 deletions(-) diff --git a/src/lib/converter.ts b/src/lib/converter.ts index 8c5a3df..bda1d9a 100644 --- a/src/lib/converter.ts +++ b/src/lib/converter.ts @@ -10,6 +10,8 @@ type PawToOAS3 = OpenAPIV3.OperationObject & { method: string } +const OAUTH2_DEFAULT_LABEL = 'oauth2_auth' + /** * @private * @function extendToJsonSchema @@ -33,6 +35,11 @@ function extendToJsonSchema(refSchema: any, reference: any): any { if (!props) return schema Object.keys(props).forEach((i: string) => { + if (props[i].type === 'null' || props[i].type === 'undefined') { + props[i].nullable = true + delete props[i].type + } + if (props[i].type === 'array') { props[i].type = reference[i].length > 0 ? typeof reference[i][0] : 'string' @@ -73,14 +80,22 @@ function extendToJsonSchema(refSchema: any, reference: any): any { * @returns {Object|String} */ function jsonParseCheck(str: string): any { - // const isQueryString = new RegExp( - // '^?([w-]+(=[w-]*)?(&[w-]+(=[w-]*)?)*)?$', - // 'g', - // ) + const isQueryString = new RegExp( + /^\?([\w-]+(=[\w-]*)?(&[\w-]+(=[\w-]*)?)*)?$/, + 'g', + ) + try { return JSON.parse(str) } catch (error) { - // return isQueryString.test(str) ? qs.parse(str) : str + if (/^(\?.*)/g.test(str) && isQueryString.test(str)) { + return qs.parse(str) + } + + if (isQueryString.test(`?${str}`)) { + return qs.parse(str) + } + return str } } @@ -368,6 +383,22 @@ export function buildPathItemObject( const requestBody = buildRequestBodyObject(item) const responses = buildResponsesObject(item) + const security: OpenAPIV3.SecurityRequirementObject[] = [] + + /** + * @todo: + * - oauth2: placing this security requirement here for now because it's the only + * security type that is identifiable in Paw.Request instance. + * + * - `apiKey` and `openIdConnect` types doesn't seem to be supported in `Paw.Request` + * which doesn't allow the extension to evaluate a request's security scheme. + * + * - `http` type is evaluated from the request parameters. + */ + if (item.oauth2) { + const getOauth2Scopes = (item.oauth2.scope as string).split(',') || [] + security.push({ [OAUTH2_DEFAULT_LABEL]: [...getOauth2Scopes] }) + } const output = { method: method as string, @@ -380,7 +411,7 @@ export function buildPathItemObject( parameters, requestBody, responses, - security: [], + security, } if (!requestBody) { @@ -416,11 +447,89 @@ export function buildPathItemObject( .reduce(mapRequestMethods, Object.create({}) as OpenAPIV3.PathItemObject) } -export function buildSecurityScheme( - request: Paw.Request, -): OpenAPIV3.SecuritySchemeObject { - return { - type: 'http', - scheme: 'http', +/** + * @function buildSecuritySchemeAndRequirementsObject + * @summary + * @returns {Object} + */ +export function buildSecurityShemeObject(requests: Paw.Request[]): any { + type SecuritySchemeMapping = { + label: string + value: OpenAPIV3.SecuritySchemeObject | null } + + /** + * @function getOauth2Schema + * a helper function that extracts oauth2 `SecurityDefinitionsObject` from Paw.Request. + * @todo: + * - shouldn't we be able to set different types of oauth flows? + * see `OpenAPIV3.SecurityDefinitionsObject`, Paw.Request doesn't change/update + * `grant_type` value. + */ + function getOauth2Schema(auth: OAuth2) { + const scopes = (auth.scope as string).split(',') || [] + const oauth2Object = { + type: 'oauth2', + flows: { + implicit: { + authorizationUrl: auth.authorization_uri, + scopes: scopes.reduce( + (acc, curr) => ({ + ...acc, + [curr]: 'scope description', + }), + {}, + ), + }, + }, + } + + return { + label: OAUTH2_DEFAULT_LABEL, + value: oauth2Object as OpenAPIV3.SecuritySchemeObject, + } + } + + /** + * @function mapRequestSecurityData + */ + function mapRequestSecurityData( + request: Paw.Request, + ): SecuritySchemeMapping | null { + let builtSchema = null + + if (request.oauth2) { + builtSchema = getOauth2Schema(request.oauth2) + } + + return builtSchema + } + + function filterDuplicates( + item: SecuritySchemeMapping, + index: number, + array: SecuritySchemeMapping[], + ): boolean { + return array.findIndex((i) => i.label === item.label) === index + } + + /** + * @function mapSecuritySchema + */ + function mapSecuritySchema(acc: any, curr: any) { + const schema = { ...acc, [curr.label]: { ...curr } } + delete schema[curr.label].label + return schema + } + + const output = [...requests] + .map(mapRequestSecurityData) + .filter((item: SecuritySchemeMapping) => item !== null) + .filter(filterDuplicates) + .reduce( + mapSecuritySchema, + {} as { [key: string]: OpenAPIV3.SecuritySchemeObject }, + ) + + return output } diff --git a/src/lib/exporter.ts b/src/lib/exporter.ts index bd34f51..af7e539 100644 --- a/src/lib/exporter.ts +++ b/src/lib/exporter.ts @@ -1,8 +1,10 @@ +import { OpenAPIV3 } from 'openapi-types' import Paw from 'types/paw' import config from '../paw.config' import { buildDocumentInfoObject, buildPathItemObject, + buildSecurityShemeObject, buildServerObject, } from './converter' @@ -34,6 +36,12 @@ export default class OpenAPIv3Generator implements Paw.Generator { const info = buildDocumentInfoObject(context) const servers = buildServerObject(requests, context) || [] const paths = buildPathItemObject(requests, context) + const securitySchemes = buildSecurityShemeObject(requests) + + const components: OpenAPIV3.ComponentsObject = {} + if (Object.keys(securitySchemes).length > 0) { + components.securitySchemes = { ...securitySchemes } + } return JSON.stringify( { @@ -41,6 +49,7 @@ export default class OpenAPIv3Generator implements Paw.Generator { info, servers, paths, + components, }, null, 2, From 821000e74331b404b269cfebe76c62e25d1ff675 Mon Sep 17 00:00:00 2001 From: Pongstr Date: Mon, 10 May 2021 20:41:40 +0300 Subject: [PATCH 12/13] updates --- src/lib/converter.ts | 152 +++++++++++++++++++++++++++++++++---- src/lib/exporter.ts | 4 +- src/lib/param-converter.ts | 145 ----------------------------------- src/types/paw.d.ts | 1 + 4 files changed, 142 insertions(+), 160 deletions(-) delete mode 100644 src/lib/param-converter.ts diff --git a/src/lib/converter.ts b/src/lib/converter.ts index bda1d9a..ec97bac 100644 --- a/src/lib/converter.ts +++ b/src/lib/converter.ts @@ -3,7 +3,6 @@ import toJsonSchema from 'to-json-schema' import qs from 'query-string' import Paw from 'types/paw' import { logger, PawURL } from 'utils' -import ParametersConverter from './param-converter' type PawToOAS3 = OpenAPIV3.OperationObject & { path: string @@ -100,6 +99,27 @@ function jsonParseCheck(str: string): any { } } +/** + * @private + * @function isVariableInString + * @summary + * + * @param {Object} dynamicString + * @param variable + * @returns + */ +function isVariableInString( + dynamicString: DynamicString, + variable: Paw.RequestVariable, +) { + return !!dynamicString.components.find( + (component: DynamicStringComponent) => + typeof component === 'object' && + component.type === 'com.luckymarmot.RequestVariableDynamicValue' && + component.variableUUID === variable.id, + ) +} + /** * @function buildDocumentInfoObject * @summary a function that builds openapi document info object @@ -140,8 +160,7 @@ export function buildServerObject( * - an array map callback function to map servers used in the requests. */ function mapServers(item: Paw.Request): OpenAPIV3.ServerObject { - const paramCoverter = new ParametersConverter(item) - const parameters = paramCoverter.getParameters() + const parameters = buildParameterObjectArray(item) const requestURL = new PawURL(item, context, parameters) const getBasePath = new RegExp(/(\/api\/v\d+)/, 'g') @@ -344,12 +363,115 @@ export function buildResponsesObject( } /** - * @function buildParameterObject + * @function buildParameterObjectArray * @summary * @returns {Array} */ -export function buildParameterObject(): OpenAPIV3.ParameterObject[] { - return [] +export function buildParameterObjectArray( + request: Paw.Request, +): OpenAPIV3.ParameterObject[] { + type RequestParameter = { [key: string]: string | DynamicString } + + /** + * @function fromHeaderParams + * a helper function that converts Paw.Request headers to + * an openapi parameter object. + * + * @todo - find a way to access request variable type to avoid using conditional checks. + */ + function fromHeaderParams( + headers: RequestParameter, + ): OpenAPIV3.ParameterObject[] { + if (Object.keys(headers).length === 0) return [] + return Object.keys(headers).map((name) => ({ + name, + in: 'header', + schema: { + type: + toJsonSchema(headers[name]).type !== null + ? toJsonSchema(headers[name]).type + : 'string', + default: headers[name], + description: '', + }, + })) as OpenAPIV3.ParameterObject[] + } + + /** + * @function fromPathParams + * a helper function that converts Paw.Request path variables to + * an openapi parameter object. + * + * @todo - find a way to access request variable type to avoid using conditional checks. + */ + function fromPathParams(request: Paw.Request): OpenAPIV3.ParameterObject[] { + const variables = request.getVariablesNames() || [] + if (variables.length === 0) return [] + + const createObject = variables + .map((name: string) => { + const variable = request.getVariableByName(name) as Paw.RequestVariable + const isTruthy = isVariableInString( + request.getUrlBase(true) as DynamicString, + variable, + ) + + if (!isTruthy) return null + + const currentValue = variable.getCurrentValue() + + return { + name, + in: 'path', + required: variable.required, + schema: { + /** + * @todo + * how to access request variable type? all types will fall back to string + */ + type: + toJsonSchema(currentValue).type !== null + ? toJsonSchema(currentValue).type + : 'string', + default: currentValue || '', + description: variable.description || '', + }, + } + }) + .filter((item) => item !== null) + return createObject as OpenAPIV3.ParameterObject[] + } + + /** + * @function fromQueryParams + * a helper function that converts Paw.Request query params to + * an openapi parameter object. + * + * @todo - find a way to access request variable type to avoid using conditional checks. + */ + function fromQueryParams(queryString: string): OpenAPIV3.ParameterObject[] { + if (queryString.trim() === '') return [] + const createQsObject = qs.parse(queryString) + logger.log(toJsonSchema(createQsObject['additionalMetadata'])) + return Object.keys(createQsObject).map((name) => ({ + name, + in: 'query', + schema: { + type: + toJsonSchema(createQsObject[name]).type !== 'null' + ? toJsonSchema(createQsObject[name]).type + : 'string', + default: createQsObject[name] !== 'null' ? createQsObject[name] : '', + description: '', + }, + })) as OpenAPIV3.ParameterObject[] + } + + return ([] as OpenAPIV3.ParameterObject[]).concat( + fromQueryParams(request.urlQuery), + fromHeaderParams(request.headers), + fromPathParams(request), + ) } /** @@ -374,8 +496,7 @@ export function buildPathItemObject( function mapRequestData(item: Paw.Request): PawToOAS3 { const { method, description, id, name } = item - const paramCoverter = new ParametersConverter(item) - const parameters = paramCoverter.getParameters() + const parameters = buildParameterObjectArray(item) const requestURL = new PawURL(item, context, parameters) const getRequestPath = requestURL.pathname @@ -396,7 +517,8 @@ export function buildPathItemObject( * - `http` type is evaluated from the request parameters. */ if (item.oauth2) { - const getOauth2Scopes = (item.oauth2.scope as string).split(',') || [] + const getOauth2Scopes = + (item.oauth2.scope as string).replace(/\'/gi, '').split(',') || [] security.push({ [OAUTH2_DEFAULT_LABEL]: [...getOauth2Scopes] }) } @@ -467,7 +589,7 @@ export function buildSecurityShemeObject(requests: Paw.Request[]): any { * `grant_type` value. */ function getOauth2Schema(auth: OAuth2) { - const scopes = (auth.scope as string).split(',') || [] + const scopes = (auth.scope as string).replace(/\'/gi, '').split(',') || [] const oauth2Object = { type: 'oauth2', flows: { @@ -492,6 +614,7 @@ export function buildSecurityShemeObject(requests: Paw.Request[]): any { /** * @function mapRequestSecurityData + * an array callback that builds security scheme object based off paw request object. */ function mapRequestSecurityData( request: Paw.Request, @@ -505,6 +628,10 @@ export function buildSecurityShemeObject(requests: Paw.Request[]): any { return builtSchema } + /** + * @function filterDuplicates + * an array callback that removes null objects from an array + */ function filterDuplicates( item: SecuritySchemeMapping, index: number, @@ -515,11 +642,10 @@ export function buildSecurityShemeObject(requests: Paw.Request[]): any { /** * @function mapSecuritySchema + * - an array reduce callback to produce a proper SecuritySchemeObject */ function mapSecuritySchema(acc: any, curr: any) { - const schema = { ...acc, [curr.label]: { ...curr } } - delete schema[curr.label].label - return schema + return { ...acc, [curr.label]: { ...curr.value } } } const output = [...requests] diff --git a/src/lib/exporter.ts b/src/lib/exporter.ts index af7e539..12a0030 100644 --- a/src/lib/exporter.ts +++ b/src/lib/exporter.ts @@ -36,9 +36,9 @@ export default class OpenAPIv3Generator implements Paw.Generator { const info = buildDocumentInfoObject(context) const servers = buildServerObject(requests, context) || [] const paths = buildPathItemObject(requests, context) - const securitySchemes = buildSecurityShemeObject(requests) - const components: OpenAPIV3.ComponentsObject = {} + + const securitySchemes = buildSecurityShemeObject(requests) if (Object.keys(securitySchemes).length > 0) { components.securitySchemes = { ...securitySchemes } } diff --git a/src/lib/param-converter.ts b/src/lib/param-converter.ts deleted file mode 100644 index b7ddc80..0000000 --- a/src/lib/param-converter.ts +++ /dev/null @@ -1,145 +0,0 @@ -import Paw from 'types/paw.d' -import { OpenAPIV3 } from 'openapi-types' - -export default class ParametersConverter { - private request: Paw.Request - - private readonly parameters: OpenAPIV3.ParameterObject[] - - private bodyContentType: string = 'text/plain' - - constructor(request: Paw.Request) { - this.request = request - this.parameters = [] - - this.parseQueryParams() - this.parseHeaders() - this.parsePathParams() - } - - getBodyContentType() { - return this.bodyContentType - } - - getParameters(): OpenAPIV3.ParameterObject[] { - return this.parameters - } - - private parseQueryParams(): void { - this.request.urlParametersNames.forEach((paramName: string) => { - const schema: OpenAPIV3.SchemaObject = { - type: 'string', - default: this.request.urlParameters[paramName] ?? '', - description: - this.request.getVariableByName(paramName)?.description ?? '', - } - - this.parameters.push({ - name: paramName, - in: 'query', - schema, - }) - }) - } - - private parseHeaders(): void { - Object.entries(this.request.headers).forEach( - ([headerName, headerValue]) => { - if (headerName.toLowerCase() === 'cookie') { - this.parseCookies((headerValue ?? '') as string) - } else { - const schema: OpenAPIV3.SchemaObject = { - type: 'string', - default: headerValue ?? '', - description: - this.request.getVariableByName(headerName)?.description ?? '', - } - - if ( - headerName.toLowerCase() === 'content-type' && - schema.default !== '' - ) { - if (schema.default.toLowerCase().indexOf('application/json') >= 0) { - this.bodyContentType = 'application/json' - } else if ( - schema.default.toLowerCase().indexOf('application/xml') >= 0 - ) { - this.bodyContentType = 'application/xml' - } else if ( - schema.default - .toLowerCase() - .indexOf('application/x-www-form-urlencoded') >= 0 - ) { - this.bodyContentType = 'application/x-www-form-urlencoded' - } else if ( - schema.default.toLowerCase().indexOf('multipart/form-data') >= 0 - ) { - this.bodyContentType = 'multipart/form-data' - } - } - - this.parameters.push({ - name: headerName, - in: 'header', - schema, - }) - } - }, - ) - } - - private parseCookies(cookiesString: string): void { - // eslint-disable-next-line array-callback-return - cookiesString.split('; ').map((cookieString) => { - const [cookieName, cookieValue] = cookieString.split('=') - - const schema: OpenAPIV3.SchemaObject = { - type: 'string', - default: cookieValue, - } - - const newParam: OpenAPIV3.ParameterObject = { - name: cookieName, - in: 'cookie', - schema, - } - - this.parameters.push(newParam) - }) - } - - private parsePathParams(): void { - if (this.request.variables.length > 0) { - this.request.variables.forEach((variable) => { - if ( - variable && - !this.parameters.some((param) => param.name === variable.name) - ) { - const newParam: OpenAPIV3.ParameterObject = { - name: variable.name, - in: 'path', - required: true, - } - - const variableValue = variable.getCurrentValue() - - if (!variable.required) { - newParam.example = { - // just to inform Paw while importing back that exported file - summary: 'NonRequired', - value: true, - } - } - - newParam.schema = { - type: 'string', - default: variableValue ?? '', - description: variable.description ?? '', - } - - this.parameters.push(newParam) - } - }) - } - } -} diff --git a/src/types/paw.d.ts b/src/types/paw.d.ts index 25b65d5..0af51d5 100755 --- a/src/types/paw.d.ts +++ b/src/types/paw.d.ts @@ -49,6 +49,7 @@ declare global { constructor(type: string, properties?: { [key: string]: any }) getEvaluatedString(): string copy(): DynamicValue + variableUUID: string } class NetworkHTTPRequest {} From 2b313cb3df2599fa0fbf9a5db9d881a196f841c4 Mon Sep 17 00:00:00 2001 From: Pongstr Date: Mon, 10 May 2021 20:54:40 +0300 Subject: [PATCH 13/13] init: refactor param converter --- src/lib/converter.ts | 82 +++++------- src/utils/dynamic-values.ts | 2 - src/utils/group.ts | 12 +- src/utils/index.ts | 1 - src/utils/json-schema-parser.ts | 228 -------------------------------- src/utils/paw-url.ts | 1 - 6 files changed, 36 insertions(+), 290 deletions(-) delete mode 100644 src/utils/json-schema-parser.ts diff --git a/src/lib/converter.ts b/src/lib/converter.ts index ec97bac..1f442bf 100644 --- a/src/lib/converter.ts +++ b/src/lib/converter.ts @@ -2,7 +2,7 @@ import { OpenAPIV3 } from 'openapi-types' import toJsonSchema from 'to-json-schema' import qs from 'query-string' import Paw from 'types/paw' -import { logger, PawURL } from 'utils' +import { PawURL } from 'utils' type PawToOAS3 = OpenAPIV3.OperationObject & { path: string @@ -31,7 +31,7 @@ function extendToJsonSchema(refSchema: any, reference: any): any { if (refSchema.type === 'object') { const props = schema.properties - if (!props) return schema + if (!props) return { ...schema } Object.keys(props).forEach((i: string) => { if (props[i].type === 'null' || props[i].type === 'undefined') { @@ -206,9 +206,7 @@ export function buildServerObject( ) } - return [...requests] - .map(mapServers) - .filter(filterDuplicates) as OpenAPIV3.ServerObject[] + return [...requests].map(mapServers).filter(filterDuplicates) } /** @@ -242,7 +240,7 @@ export function buildRequestBodyObject( ) as OpenAPIV3.SchemaObject, } - return output as OpenAPIV3.RequestBodyObject + return output } return undefined @@ -383,18 +381,18 @@ export function buildParameterObjectArray( headers: RequestParameter, ): OpenAPIV3.ParameterObject[] { if (Object.keys(headers).length === 0) return [] - return Object.keys(headers).map((name) => ({ - name, - in: 'header', - schema: { - type: - toJsonSchema(headers[name]).type !== null - ? toJsonSchema(headers[name]).type - : 'string', - default: headers[name], - description: '', - }, - })) as OpenAPIV3.ParameterObject[] + return Object.keys(headers).map((name) => { + const getType = toJsonSchema(headers[name]) + return { + name, + in: 'header', + schema: { + type: getType && getType.type !== 'null' ? getType.type : 'string', + default: headers[name].toString() || '', + description: '', + }, + } + }) as OpenAPIV3.ParameterObject[] } /** @@ -404,35 +402,28 @@ export function buildParameterObjectArray( * * @todo - find a way to access request variable type to avoid using conditional checks. */ - function fromPathParams(request: Paw.Request): OpenAPIV3.ParameterObject[] { - const variables = request.getVariablesNames() || [] + function fromPathParams(req: Paw.Request): OpenAPIV3.ParameterObject[] { + const variables = req.getVariablesNames() || [] if (variables.length === 0) return [] const createObject = variables .map((name: string) => { - const variable = request.getVariableByName(name) as Paw.RequestVariable + const variable = req.getVariableByName(name) as Paw.RequestVariable const isTruthy = isVariableInString( - request.getUrlBase(true) as DynamicString, + req.getUrlBase(true) as DynamicString, variable, ) if (!isTruthy) return null const currentValue = variable.getCurrentValue() - + const getType = toJsonSchema(currentValue) return { name, in: 'path', required: variable.required, schema: { - /** - * @todo - * how to access request variable type? all types will fall back to string - */ - type: - toJsonSchema(currentValue).type !== null - ? toJsonSchema(currentValue).type - : 'string', + type: getType && getType.type !== 'null' ? getType.type : 'string', default: currentValue || '', description: variable.description || '', }, @@ -452,19 +443,18 @@ export function buildParameterObjectArray( function fromQueryParams(queryString: string): OpenAPIV3.ParameterObject[] { if (queryString.trim() === '') return [] const createQsObject = qs.parse(queryString) - logger.log(toJsonSchema(createQsObject['additionalMetadata'])) - return Object.keys(createQsObject).map((name) => ({ - name, - in: 'query', - schema: { - type: - toJsonSchema(createQsObject[name]).type !== 'null' - ? toJsonSchema(createQsObject[name]).type - : 'string', - default: createQsObject[name] !== 'null' ? createQsObject[name] : '', - description: '', - }, - })) as OpenAPIV3.ParameterObject[] + return Object.keys(createQsObject).map((name) => { + const getType = toJsonSchema(createQsObject[name]) + return { + name, + in: 'query', + schema: { + type: getType && getType.type !== 'null' ? getType.type : 'string', + default: createQsObject[name]?.toString() || '', + description: '', + }, + } + }) as OpenAPIV3.ParameterObject[] } return ([] as OpenAPIV3.ParameterObject[]).concat( @@ -648,7 +638,7 @@ export function buildSecurityShemeObject(requests: Paw.Request[]): any { return { ...acc, [curr.label]: { ...curr.value } } } - const output = [...requests] + return [...requests] .map(mapRequestSecurityData) .filter((item: SecuritySchemeMapping) => item !== null) .filter(filterDuplicates) @@ -656,6 +646,4 @@ export function buildSecurityShemeObject(requests: Paw.Request[]): any { mapSecuritySchema, {} as { [key: string]: OpenAPIV3.SecuritySchemeObject }, ) - - return output } diff --git a/src/utils/dynamic-values.ts b/src/utils/dynamic-values.ts index 581a7ec..e56cb68 100644 --- a/src/utils/dynamic-values.ts +++ b/src/utils/dynamic-values.ts @@ -1,6 +1,4 @@ -import EnvironmentManager from './environment' import Paw from 'types/paw' -import logger from './console' const ENVIRONMENT_DYNAMIC_VALUE = 'com.luckymarmot.EnvironmentVariableDynamicValue' diff --git a/src/utils/group.ts b/src/utils/group.ts index 3a9a430..8fbfb1a 100644 --- a/src/utils/group.ts +++ b/src/utils/group.ts @@ -27,7 +27,7 @@ export function createGroup( -1, ) - let objectvalue = accumulator[occurence] as CreateRequestGroupType + let objectvalue = accumulator[occurence] if (occurence >= 0) { objectvalue.paths = objectvalue.paths.concat(current.paths) return accumulator @@ -41,13 +41,3 @@ export function createGroup( accumulator = accumulator.concat([currentObject as never]) return accumulator } - -// request body utility - -// parameter utilities - -export function paramInHeader(): void {} - -export function paramInPath(): void {} - -export function paramInCookie(): void {} diff --git a/src/utils/index.ts b/src/utils/index.ts index e866da9..a31854b 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,6 +1,5 @@ export { default as logger } from './console' export { default as PawURL } from './paw-url' export { default as EnvironmentManager } from './environment' -export { default as jsonSchemaParser } from './json-schema-parser' export * from './dynamic-values' export * as group from './group' diff --git a/src/utils/json-schema-parser.ts b/src/utils/json-schema-parser.ts deleted file mode 100644 index 0b13fda..0000000 --- a/src/utils/json-schema-parser.ts +++ /dev/null @@ -1,228 +0,0 @@ -import { OpenAPIV3 } from 'openapi-types' - -// The JSON Object that defines the default values of certain types. -type typesInstantiatorType = - | 'string' - | 'number' - | 'integer' - | 'null' - | 'boolean' - | 'object' - | 'array' - -type JSPOptions = { - requiredPropertiesOnly: boolean -} - -const typesInstantiator = { - string: '', - number: 0, - integer: 0, - null: null, - boolean: false, // Always stay positive? lol - object: {}, - array: [], -} - -/** - * Checks whether a letiable is a primitive. - * @param obj - an object. - * @returns {boolean} - */ -function isPrimitive(obj: OpenAPIV3.SchemaObject) { - let type = obj.type as typesInstantiatorType - return typesInstantiator[type] !== undefined -} - -/** - * Checks whether a property is on required array. - * @param property - the property to check. - * @param requiredArray - the required array - * @returns {boolean} - */ -function isPropertyRequired(property: string, requiredArray: any[] | any) { - let found = false - requiredArray = requiredArray || [] - requiredArray.forEach(function (requiredProperty: string) { - if (requiredProperty === property) { - found = true - } - }) - return found -} - -function shouldVisit( - property: any, - obj: OpenAPIV3.SchemaObject, - options: JSPOptions, -) { - return ( - !options.requiredPropertiesOnly || - (options.requiredPropertiesOnly && - isPropertyRequired(property, obj.required)) - ) -} - -/** - * Instantiate a primitive. - * @param val - The object that represents the primitive. - * @returns {*} - */ -function instantiatePrimitive(val: OpenAPIV3.SchemaObject): any { - let type = val.type - - // Support for default values in the JSON Schema. - if (val.hasOwnProperty('example')) { - return val.example - } - - return typesInstantiator[type as typesInstantiatorType] -} - -/** - * Checks whether a letiable is an enum. - * @param obj - an object. - * @returns {boolean} - */ -function isEnum(obj: any): boolean { - return Object.prototype.toString.call(obj.enum) === '[object Array]' -} - -/** - * Checks whether a letiable is an array. - * @param obj - an object. - * @returns {boolean} - */ -function isArray(obj: any): boolean { - return Array.isArray(obj) -} - -/** - * Extracts the type of the object. - * If the type is an array, set type to first in list of types. - * If obj.type is not overridden, it will fail the isPrimitive check. - * Which internally also checks obj.type. - * @param obj - An object. - */ -function getObjectType(obj: any): typesInstantiatorType { - // Check if type is array of types. - if (isArray(obj.type)) { - obj.type = obj.type[0] - } - - return obj.type -} - -/** - * Instantiate an enum. - * @param val - The object that represents the primitive. - * @returns {*} - */ -function instantiateEnum(val: any) { - // Support for default values in the JSON Schema. - if (val.default) { - return val.default - } - - if (!val.enum.length) { - return undefined - } - return val.enum[0] -} - -/** - * Finds a definition in a schema. - * Useful for finding references. - * - * @param schema The full schema object. - * @param ref The reference to find. - * @return {*} The object representing the ref. - */ -function findDefinition(schema: any, ref: string) { - let propertyPath = ref.split('/').slice(1) // Ignore the #/uri at the beginning. - let currentProperty = propertyPath.splice(0, 1)[0] - - let currentValue = schema - - while (currentProperty) { - currentValue = currentValue[currentProperty] - currentProperty = propertyPath.splice(0, 1)[0] - } - - return currentValue -} - -/** - * The main function. - * Calls sub-objects recursively, depth first, using the sub-function 'visit'. - * @param schema - The schema to instantiate. - * @returns {*} - */ -function jsonSchemaParser( - schema: OpenAPIV3.SchemaObject, - options: any = {}, -): any { - options = options || {} - - /** - * Visits each sub-object using recursion. - * If it reaches a primitive, instantiate it. - * @param obj - The object that represents the schema. - * @param name - The name of the current object. - * @param data - The instance data that represents the current object. - */ - function visit( - obj: OpenAPIV3.SchemaObject | any, - name: string | number, - data: any, - ): any { - if (!obj) { - return - } - - let i - let type = getObjectType(obj) - - // We want non-primitives objects (primitive === object w/o properties). - if (type === 'object' && obj.properties) { - data[name] = data[name] || {} - - // Visit each property. - for (let property in obj.properties) { - if (obj.properties.hasOwnProperty(property)) { - if (shouldVisit(property, obj, options)) { - visit(obj.properties[property], property, data[name]) - } - } - } - } else if (obj.allOf) { - for (i = 0; i < obj.allOf.length; i++) { - visit(obj.allOf[i], name, data) - } - } else if (obj.$ref) { - obj = findDefinition(schema, obj.$ref) - visit(obj, name, data) - } else if (type === 'array') { - data[name] = [] - let len = 0 - if (obj.minItems || obj.minItems > 0) { - len = obj.minItems - } - - // Instantiate 'len' items. - for (i = 0; i < len; i++) { - visit(obj.items, i, data[name]) - } - } else if (isEnum(obj)) { - data[name] = instantiateEnum(obj) - } else if (isPrimitive(obj)) { - data[name] = instantiatePrimitive(obj) - } - } - - let data = { props: {} } - visit(schema, 'props', data) - return data['props'] as any -} - -export default jsonSchemaParser diff --git a/src/utils/paw-url.ts b/src/utils/paw-url.ts index 6aece07..789062d 100644 --- a/src/utils/paw-url.ts +++ b/src/utils/paw-url.ts @@ -2,7 +2,6 @@ import { OpenAPIV3 } from 'openapi-types' import Paw from 'types/paw' import EnvironmentManager from './environment' import { convertEnvString } from './dynamic-values' -import logger from './console' export interface PawURLOptions { openApi: OpenAPIV3.Document