diff --git a/.eslintrc.js b/.eslintrc.js index 0ddd139f..3b560249 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,79 +1,5 @@ +require("@rushstack/eslint-patch/modern-module-resolution"); + module.exports = { - root: true, - env: { - mocha: true, - node: true, - es6: true, - }, - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint', 'eslint-plugin-import', 'prettier'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'prettier/@typescript-eslint', - 'plugin:prettier/recommended', - ], - rules: { - 'prettier/prettier': ['error', {}, { usePrettierrc: true }], - '@typescript-eslint/no-require-imports': 'error', - '@typescript-eslint/no-unused-vars': [ - 'error', - { - varsIgnorePattern: '^_', - }, - ], - '@typescript-eslint/explicit-function-return-type': [ - 'error', - { - allowExpressions: true, - }, - ], - '@typescript-eslint/ban-ts-comment': 'error', - '@typescript-eslint/no-explicit-any': 'error', - '@typescript-eslint/explicit-module-boundary-types': 'error', - '@typescript-eslint/no-use-before-define': 'off', - 'prefer-const': 'error', - 'no-consecutive-blank-lines': 0, - 'no-console': 'error', - '@typescript-eslint/naming-convention': [ - 'error', - { selector: 'default', format: ['camelCase'] }, - { - selector: ['classProperty', 'parameterProperty', 'objectLiteralProperty', 'classMethod', 'parameter'], - format: ['camelCase'], - leadingUnderscore: 'allow', - }, - //variable must be in camel or upper case - { selector: 'variable', format: ['camelCase', 'UPPER_CASE'], leadingUnderscore: 'allow' }, - // {selector: "variable", modifiers: ["global"], format: ["PascalCase", "UPPER_CASE"]}, - //classes and types must be in PascalCase - { selector: ['typeLike', 'enum'], format: ['PascalCase'] }, - { selector: 'enumMember', format: null }, - { selector: 'typeProperty', format: ['PascalCase', 'camelCase'] }, - //ignore rules on destructured params - { - selector: 'variable', - modifiers: ['destructured'], - format: null, - }, - ], - 'import/order': [ - 'error', - { - groups: ['builtin', 'external', 'parent', 'internal', 'sibling'], - 'newlines-between': 'always', - alphabetize: { - order: 'asc', - }, - }, - ], - }, - overrides: [ - { - files: ['**/test/**/*.ts'], - rules: { - 'no-console': 'off', - }, - }, - ], -}; + extends: "@chainsafe", +} \ No newline at end of file diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index f567fb48..00000000 --- a/.prettierrc.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - semi: true, - trailingComma: "all", - singleQuote: true, - printWidth: 120, - arrowParens: "always", -}; diff --git a/package.json b/package.json index bef510d5..f230908e 100644 --- a/package.json +++ b/package.json @@ -43,16 +43,14 @@ "node-stream-zip": "^1.13.0" }, "devDependencies": { + "@chainsafe/eslint-config": "^1.0.0", "@jest/types": "^27.1.1", + "@rushstack/eslint-patch": "^1.2.0", "@types/chai": "^4.2.22", "@types/mocha": "^9.1.1", - "@typescript-eslint/eslint-plugin": "^4.15.0", - "@typescript-eslint/parser": "^4.15.0", + "@types/serve-handler": "^6.1.1", "chai": "^4.3.4", - "eslint": "^7.20.0", - "eslint-config-prettier": "^7.2.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-prettier": "^3.3.1", + "eslint": "^8.24.0", "ganache": "^7.4.3", "jest-environment-node": "^27.1.1", "mocha": "^10.0.0", diff --git a/src/helpers/actions.ts b/src/helpers/actions.ts index e3a54673..1ef55cd1 100644 --- a/src/helpers/actions.ts +++ b/src/helpers/actions.ts @@ -1,47 +1,70 @@ -import { Page } from 'puppeteer'; +import { ElementHandle, Page } from "puppeteer"; -import { getAccountMenuButton, getElementByContent, getInputByLabel, getSettingsSwitch } from './selectors'; +import { + getAccountMenuButton, + getElementByContent, + getInputByLabel, + getSettingsSwitch, +} from "./selectors"; -export const clickOnSettingsSwitch = async (page: Page, text: string): Promise => { +export const clickOnSettingsSwitch = async ( + page: Page, + text: string +): Promise => { const button = await getSettingsSwitch(page, text); await button.click(); }; export const openNetworkDropdown = async (page: Page): Promise => { - const networkSwitcher = await page.waitForSelector('.network-display', { visible: true }); + const networkSwitcher = await page.waitForSelector(".network-display", { + visible: true, + }); try { await networkSwitcher.click(); - await page.waitForSelector('.network-dropdown-list', { visible: true, timeout: 1000 }); + await page.waitForSelector(".network-dropdown-list", { + visible: true, + timeout: 1000, + }); } catch (e) { //retry on fail await networkSwitcher.click(); - await page.waitForSelector('.network-dropdown-list', { visible: true, timeout: 1000 }); + await page.waitForSelector(".network-dropdown-list", { + visible: true, + timeout: 1000, + }); } }; export const openProfileDropdown = async (page: Page): Promise => { - const accountSwitcher = await page.waitForSelector('.identicon'); + const accountSwitcher = await page.waitForSelector(".identicon"); await accountSwitcher.click(); }; export const openAccountDropdown = async (page: Page): Promise => { const accMenu = await getAccountMenuButton(page); await accMenu.click(); - await page.waitForSelector('.menu__container.account-options-menu'); + await page.waitForSelector(".menu__container.account-options-menu"); }; -export const clickOnElement = async (page: Page, text: string, type?: string): Promise => { +export const clickOnElement = async ( + page: Page, + text: string, + type?: string +): Promise => { const element = await getElementByContent(page, text, type); await element.click(); }; -export const clickOnButton = async (page: Page, text: string): Promise => { - const button = await getElementByContent(page, text, 'button'); +export const clickOnButton = async ( + page: Page, + text: string +): Promise => { + const button = await getElementByContent(page, text, "button"); await button.click(); }; export const clickOnLogo = async (page: Page): Promise => { - const header = await page.waitForSelector('.app-header__logo-container'); + const header = await page.waitForSelector(".app-header__logo-container"); await header.click(); }; @@ -61,9 +84,9 @@ export const typeOnInputField = async ( text: string, clear = false, excludeSpan = false, - optional = false, + optional = false ): Promise => { - let input; + let input: ElementHandle; try { input = await getInputByLabel(page, label, excludeSpan, 1000); } catch (e) { @@ -72,8 +95,8 @@ export const typeOnInputField = async ( } if (clear) - await page.evaluate((node) => { - node.value = ''; + await page.evaluate((node: HTMLInputElement) => { + node.value = ""; }, input); await input.type(text); return true; diff --git a/src/helpers/index.ts b/src/helpers/index.ts index f230fb1e..2fc3d904 100644 --- a/src/helpers/index.ts +++ b/src/helpers/index.ts @@ -1,2 +1,2 @@ -export * from './actions'; -export * from './selectors'; +export * from "./actions"; +export * from "./selectors"; diff --git a/src/helpers/selectors.ts b/src/helpers/selectors.ts index d0d7672b..2f1b41e7 100644 --- a/src/helpers/selectors.ts +++ b/src/helpers/selectors.ts @@ -1,14 +1,21 @@ -import { ElementHandle, Page } from 'puppeteer'; +import { ElementHandle, Page } from "puppeteer"; // TODO: change text() with '.'; -export const getElementByContent = (page: Page, text: string, type = '*'): Promise => - page.waitForXPath(`//${type}[contains(text(), '${text}')]`, { timeout: 20000, visible: true }); +export const getElementByContent = ( + page: Page, + text: string, + type = "*" +): Promise => + page.waitForXPath(`//${type}[contains(text(), '${text}')]`, { + timeout: 20000, + visible: true, + }); export const getInputByLabel = ( page: Page, text: string, excludeSpan = false, - timeout = 1000, + timeout = 1000 ): Promise => page.waitForXPath( [ @@ -22,30 +29,36 @@ export const getInputByLabel = ( `//span[contains(.,'${text}')]/following-sibling::*//input`, ] : []), - ].join('|'), - { timeout, visible: true }, + ].join("|"), + { timeout, visible: true } ); -export const getSettingsSwitch = (page: Page, text: string): Promise => +export const getSettingsSwitch = ( + page: Page, + text: string +): Promise => page.waitForXPath( [ `//span[contains(.,'${text}')]/parent::div/following-sibling::div/div/div/div`, `//span[contains(.,'${text}')]/parent::div/following-sibling::div/div/label/div`, - ].join('|'), - { visible: true }, + ].join("|"), + { visible: true } ); export const getErrorMessage = async (page: Page): Promise => { - const options: Parameters[1] = { timeout: 1000 }; + const options: Parameters[1] = { timeout: 1000 }; - const errorElement = await Promise.race([ + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const errorElement: ElementHandle | null = await Promise.race([ page.waitForSelector(`span.error`, options), page.waitForSelector(`.typography--color-error-1`, options), page.waitForSelector(`.typography--color-error-default`, options), ]).catch(() => null); if (!errorElement) return false; - return page.evaluate((node) => node.textContent, errorElement); + return page.evaluate((node: HTMLElement) => node.textContent, errorElement); }; -export const getAccountMenuButton = (page: Page): Promise => +export const getAccountMenuButton = ( + page: Page +): Promise => page.waitForXPath(`//button[contains(@title,'Account options')]`); diff --git a/src/index.ts b/src/index.ts index 0823c566..8eeec86c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,8 +1,8 @@ // re-export -export { getMetaMask, getMetaMaskWindow } from './metamask'; -export * from './types'; -export * from './setup'; -export { DappateerJestConfig } from './jest/global'; +export { getMetaMask, getMetaMaskWindow } from "./metamask"; +export * from "./types"; +export * from "./setup"; +export { DapeteerJestConfig as DappateerJestConfig } from "./jest/global"; // default constants -export const RECOMMENDED_METAMASK_VERSION = 'v10.20.0'; +export const RECOMMENDED_METAMASK_VERSION = "v10.20.0"; diff --git a/src/jest/DappeteerEnvironment.ts b/src/jest/DappeteerEnvironment.ts index 77927645..439f168f 100644 --- a/src/jest/DappeteerEnvironment.ts +++ b/src/jest/DappeteerEnvironment.ts @@ -1,10 +1,11 @@ -import NodeEnvironment from 'jest-environment-node'; -import puppeteer from 'puppeteer'; +import { Config } from "@jest/types"; +import NodeEnvironment from "jest-environment-node"; +import puppeteer from "puppeteer"; -import { getMetaMaskWindow } from '../index'; +import { getMetaMaskWindow } from "../index"; class DappeteerEnvironment extends NodeEnvironment { - constructor(config) { + constructor(config: Config.ProjectConfig) { super(config); } @@ -14,7 +15,7 @@ class DappeteerEnvironment extends NodeEnvironment { // get the wsEndpoint const wsEndpoint = process.env.PUPPETEER_WS_ENDPOINT; if (!wsEndpoint) { - throw new Error('wsEndpoint not found'); + throw new Error("wsEndpoint not found"); } // connect to puppeteer diff --git a/src/jest/config.ts b/src/jest/config.ts index 9dfa743d..0fca8c6c 100644 --- a/src/jest/config.ts +++ b/src/jest/config.ts @@ -1,17 +1,19 @@ -import path from 'path'; +import path from "path"; -import { existsSync } from 'node:fs'; -import { cwd } from 'node:process'; +import { existsSync } from "node:fs"; +import { cwd } from "node:process"; -import { RECOMMENDED_METAMASK_VERSION } from '../index'; -import { LaunchOptions } from '../types'; +import { RECOMMENDED_METAMASK_VERSION } from "../index"; +import { LaunchOptions } from "../types"; -import { DappateerJestConfig } from './global'; +import { DapeteerJestConfig } from "./global"; -export const DAPPETEER_DEFAULT_CONFIG: LaunchOptions = { metaMaskVersion: RECOMMENDED_METAMASK_VERSION }; +export const DAPPETEER_DEFAULT_CONFIG: LaunchOptions = { + metaMaskVersion: RECOMMENDED_METAMASK_VERSION, +}; -export async function getDappeteerConfig(): Promise { - const configPath = 'dappeteer.config.js'; +export async function getDappeteerConfig(): Promise { + const configPath = "dappeteer.config.js"; const filePath = path.resolve(cwd(), configPath); if (!existsSync(filePath)) @@ -20,8 +22,8 @@ export async function getDappeteerConfig(): Promise { metaMask: {}, }; - // eslint-disable-next-line @typescript-eslint/no-require-imports - const config = await require(filePath); + // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-unsafe-assignment + const config: Partial = await require(filePath); return { dappeteer: { diff --git a/src/jest/global.ts b/src/jest/global.ts index aaee67b4..0a779cd7 100644 --- a/src/jest/global.ts +++ b/src/jest/global.ts @@ -1,6 +1,6 @@ -import { Browser, Page } from 'puppeteer'; +import { Browser, Page } from "puppeteer"; -import { Dappeteer, LaunchOptions, MetaMaskOptions } from '..'; +import { Dappeteer, LaunchOptions, MetaMaskOptions } from ".."; declare global { // eslint-disable-next-line @typescript-eslint/no-namespace @@ -13,7 +13,7 @@ declare global { } } -export type DappateerJestConfig = Partial<{ +export type DapeteerJestConfig = Partial<{ dappeteer: LaunchOptions; metaMask: MetaMaskOptions; }>; diff --git a/src/jest/setup.ts b/src/jest/setup.ts index 90fd02f1..7642ee89 100644 --- a/src/jest/setup.ts +++ b/src/jest/setup.ts @@ -1,8 +1,8 @@ -import puppeteer from 'puppeteer'; +import puppeteer from "puppeteer"; -import { launch, setupMetaMask } from '../index'; +import { launch, setupMetaMask } from "../index"; -import { getDappeteerConfig } from './config'; +import { getDappeteerConfig } from "./config"; export default async function (): Promise { const { dappeteer, metaMask } = await getDappeteerConfig(); diff --git a/src/metamask/addNetwork.ts b/src/metamask/addNetwork.ts index 515be654..53c8de5d 100644 --- a/src/metamask/addNetwork.ts +++ b/src/metamask/addNetwork.ts @@ -1,38 +1,39 @@ -import { Page } from 'puppeteer'; +import { Page } from "puppeteer"; -import { clickOnButton, getErrorMessage, openNetworkDropdown, typeOnInputField } from '../helpers'; -import { AddNetwork } from '../index'; +import { + clickOnButton, + getErrorMessage, + openNetworkDropdown, + typeOnInputField, +} from "../helpers"; +import { AddNetwork } from "../index"; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export const addNetwork = (page: Page, version?: string) => async ({ - networkName, - rpc, - chainId, - symbol, -}: AddNetwork): Promise => { - await page.bringToFront(); - await openNetworkDropdown(page); - await clickOnButton(page, 'Add network'); +export const addNetwork = + (page: Page) => + async ({ networkName, rpc, chainId, symbol }: AddNetwork): Promise => { + await page.bringToFront(); + await openNetworkDropdown(page); + await clickOnButton(page, "Add network"); - const responsePromise = page.waitForResponse( - (response) => new URL(response.url()).pathname === new URL(rpc).pathname, - ); + const responsePromise = page.waitForResponse( + (response) => new URL(response.url()).pathname === new URL(rpc).pathname + ); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - await typeOnInputField(page, 'Network name', networkName); - await typeOnInputField(page, 'New RPC URL', rpc); - await typeOnInputField(page, 'Chain ID', String(chainId)); - await typeOnInputField(page, 'Currency symbol', symbol); + await typeOnInputField(page, "Network name", networkName); + await typeOnInputField(page, "New RPC URL", rpc); + await typeOnInputField(page, "Chain ID", String(chainId)); + await typeOnInputField(page, "Currency symbol", symbol); - await responsePromise; - await page.waitForTimeout(500); + await responsePromise; + await page.waitForTimeout(500); - const errorMessage = await getErrorMessage(page); - if (errorMessage) throw new SyntaxError(errorMessage); + const errorMessage = await getErrorMessage(page); + if (errorMessage) throw new SyntaxError(errorMessage); - await clickOnButton(page, 'Save'); + await clickOnButton(page, "Save"); - await page.waitForXPath(`//*[text() = '${networkName}']`); - await clickOnButton(page, 'Got it'); -}; + await page.waitForXPath(`//*[text() = '${networkName}']`); + await clickOnButton(page, "Got it"); + }; diff --git a/src/metamask/addToken.ts b/src/metamask/addToken.ts index c39c9174..b32770ab 100644 --- a/src/metamask/addToken.ts +++ b/src/metamask/addToken.ts @@ -1,28 +1,31 @@ -import { Page } from 'puppeteer'; +import { Page } from "puppeteer"; -import { clickOnButton, clickOnElement, clickOnLogo, getElementByContent, typeOnInputField } from '../helpers'; -import { AddToken } from '../index'; +import { + clickOnButton, + clickOnElement, + clickOnLogo, + getElementByContent, + typeOnInputField, +} from "../helpers"; +import { AddToken } from "../index"; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export const addToken = (page: Page, version?: string) => async ({ - tokenAddress, - symbol, - decimals = 0, -}: AddToken): Promise => { - await page.bringToFront(); - await clickOnButton(page, 'Assets'); - await page.waitForSelector('.asset-list-item__token-button'); - await clickOnElement(page, 'import tokens'); - await clickOnButton(page, 'Custom token'); +export const addToken = + (page: Page) => + async ({ tokenAddress, symbol, decimals = 0 }: AddToken): Promise => { + await page.bringToFront(); + await clickOnButton(page, "Assets"); + await page.waitForSelector(".asset-list-item__token-button"); + await clickOnElement(page, "import tokens"); + await clickOnButton(page, "Custom token"); - await typeOnInputField(page, 'Token decimal', String(decimals), true); - await typeOnInputField(page, 'Token contract address', tokenAddress); - await page.waitForTimeout(333); - await typeOnInputField(page, 'Token symbol', symbol, true); + await typeOnInputField(page, "Token decimal", String(decimals), true); + await typeOnInputField(page, "Token contract address", tokenAddress); + await page.waitForTimeout(333); + await typeOnInputField(page, "Token symbol", symbol, true); - await clickOnButton(page, 'Add custom token'); - await clickOnButton(page, 'Import tokens'); + await clickOnButton(page, "Add custom token"); + await clickOnButton(page, "Import tokens"); - await getElementByContent(page, symbol); - await clickOnLogo(page); -}; + await getElementByContent(page, symbol); + await clickOnLogo(page); + }; diff --git a/src/metamask/approve.ts b/src/metamask/approve.ts index 443b5beb..43350cd1 100644 --- a/src/metamask/approve.ts +++ b/src/metamask/approve.ts @@ -1,14 +1,13 @@ -import { Page } from 'puppeteer'; +import { Page } from "puppeteer"; -import { clickOnButton } from '../helpers'; +import { clickOnButton } from "../helpers"; // TODO: thing about renaming this method? -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export const approve = (page: Page, version?: string) => async (): Promise => { +export const approve = (page: Page) => async (): Promise => { await page.bringToFront(); await page.reload(); // TODO: step 1 of connect chose account to connect? - await clickOnButton(page, 'Next'); - await clickOnButton(page, 'Connect'); + await clickOnButton(page, "Next"); + await clickOnButton(page, "Connect"); }; diff --git a/src/metamask/confirmTransaction.ts b/src/metamask/confirmTransaction.ts index 4cdc6a2b..0ba658fa 100644 --- a/src/metamask/confirmTransaction.ts +++ b/src/metamask/confirmTransaction.ts @@ -1,37 +1,53 @@ -import { Page } from 'puppeteer'; +import { Page } from "puppeteer"; -import { TransactionOptions } from '..'; -import { clickOnButton, typeOnInputField } from '../helpers'; +import { TransactionOptions } from ".."; +import { clickOnButton, typeOnInputField } from "../helpers"; -import { GetSingedIn } from './index'; +import { GetSingedIn } from "./index"; const MIN_GAS = 21000; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export const confirmTransaction = (page: Page, getSingedIn: GetSingedIn, version?: string) => async ( - options?: TransactionOptions, -): Promise => { - await page.bringToFront(); - if (!(await getSingedIn())) { - throw new Error("You haven't signed in yet"); - } - await page.waitForTimeout(500); - await page.reload(); - - if (options) { - await clickOnButton(page, 'Edit'); - await clickOnButton(page, 'Edit suggested gas fee'); - //non EIP1559 networks don't have priority fee. TODO: run separate Ganache with older hardfork to test this - let priority = false; - if (options.priority) { - priority = await typeOnInputField(page, 'Max priority fee', String(options.priority), true, true, true); +export const confirmTransaction = + (page: Page, getSingedIn: GetSingedIn) => + async (options?: TransactionOptions): Promise => { + await page.bringToFront(); + if (!(await getSingedIn())) { + throw new Error("You haven't signed in yet"); } - if (options.gasLimit && options.gasLimit >= MIN_GAS) - await typeOnInputField(page, 'Gas Limit', String(options.gasLimit), true); - if (options.gas && options.gasLimit >= MIN_GAS) - await typeOnInputField(page, priority ? 'Max fee' : 'Gas Limit', String(options.gasLimit), true); + await page.waitForTimeout(500); + await page.reload(); + + if (options) { + await clickOnButton(page, "Edit"); + await clickOnButton(page, "Edit suggested gas fee"); + //non EIP1559 networks don't have priority fee. TODO: run separate Ganache with older hardfork to test this + let priority = false; + if (options.priority) { + priority = await typeOnInputField( + page, + "Max priority fee", + String(options.priority), + true, + true, + true + ); + } + if (options.gasLimit && options.gasLimit >= MIN_GAS) + await typeOnInputField( + page, + "Gas Limit", + String(options.gasLimit), + true + ); + if (options.gas && options.gasLimit >= MIN_GAS) + await typeOnInputField( + page, + priority ? "Max fee" : "Gas Limit", + String(options.gasLimit), + true + ); - await clickOnButton(page, 'Save'); - } - await clickOnButton(page, 'Confirm'); -}; + await clickOnButton(page, "Save"); + } + await clickOnButton(page, "Confirm"); + }; diff --git a/src/metamask/helpers/deleteAccount.ts b/src/metamask/helpers/deleteAccount.ts index bf6f68b0..3bec9ce5 100644 --- a/src/metamask/helpers/deleteAccount.ts +++ b/src/metamask/helpers/deleteAccount.ts @@ -1,16 +1,23 @@ -import { Page } from 'puppeteer'; +import { Page } from "puppeteer"; -import { clickOnButton, clickOnElement, openAccountDropdown } from '../../helpers'; -import { switchAccount } from '../switchAccount'; +import { + clickOnButton, + clickOnElement, + openAccountDropdown, +} from "../../helpers"; +import { switchAccount } from "../switchAccount"; -export const deleteAccount = (page: Page, version?: string) => async (accountNumber: number): Promise => { - await page.bringToFront(); +export const deleteAccount = + (page: Page) => + async (accountNumber: number): Promise => { + await page.bringToFront(); - if (accountNumber === 1) throw new SyntaxError('Account 1 cannot be deleted'); - await switchAccount(page, version)(accountNumber); + if (accountNumber === 1) + throw new SyntaxError("Account 1 cannot be deleted"); + await switchAccount(page)(accountNumber); - await openAccountDropdown(page); - await clickOnElement(page, 'Remove account'); - await clickOnButton(page, 'Remove'); - await page.reload(); -}; + await openAccountDropdown(page); + await clickOnElement(page, "Remove account"); + await clickOnButton(page, "Remove"); + await page.reload(); + }; diff --git a/src/metamask/helpers/deleteNetwork.ts b/src/metamask/helpers/deleteNetwork.ts index 6a1e950f..b75756aa 100644 --- a/src/metamask/helpers/deleteNetwork.ts +++ b/src/metamask/helpers/deleteNetwork.ts @@ -1,18 +1,26 @@ -import { Page } from 'puppeteer'; +import { Page } from "puppeteer"; -import { clickOnButton, clickOnLogo, getElementByContent, openNetworkDropdown } from '../../helpers'; +import { + clickOnButton, + clickOnLogo, + getElementByContent, + openNetworkDropdown, +} from "../../helpers"; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export const deleteNetwork = (page: Page, version?: string) => async (name: string): Promise => { - await page.bringToFront(); +export const deleteNetwork = + (page: Page) => + async (name: string): Promise => { + await page.bringToFront(); - await openNetworkDropdown(page); - const network = await getElementByContent(page, name); - await network.hover(); + await openNetworkDropdown(page); + const network = await getElementByContent(page, name); + await network.hover(); - const deleteButton = await page.waitForXPath(`//*[contains(text(), '${name}')]/following-sibling::i`); - await deleteButton.click(); + const deleteButton = await page.waitForXPath( + `//*[contains(text(), '${name}')]/following-sibling::i` + ); + await deleteButton.click(); - await clickOnButton(page, 'Delete'); - await clickOnLogo(page); -}; + await clickOnButton(page, "Delete"); + await clickOnLogo(page); + }; diff --git a/src/metamask/helpers/getTokenBalance.ts b/src/metamask/helpers/getTokenBalance.ts index a7506384..087cb524 100644 --- a/src/metamask/helpers/getTokenBalance.ts +++ b/src/metamask/helpers/getTokenBalance.ts @@ -1,23 +1,31 @@ -import { Page } from 'puppeteer'; +import { Page } from "puppeteer"; -import { clickOnButton } from '../../helpers'; +import { clickOnButton } from "../../helpers"; -export const getTokenBalance = (page: Page) => async (tokenSymbol: string): Promise => { - await page.bringToFront(); - await clickOnButton(page, 'Assets'); - await page.waitForSelector('.asset-list-item__token-button'); - const assetListItems = await page.$$('.asset-list-item__token-button'); +export const getTokenBalance = + (page: Page) => + async (tokenSymbol: string): Promise => { + await page.bringToFront(); + await clickOnButton(page, "Assets"); + await page.waitForSelector(".asset-list-item__token-button"); + const assetListItems = await page.$$(".asset-list-item__token-button"); - for (let index = 0; index < assetListItems.length; index++) { - const assetListItem = assetListItems[index]; + for (let index = 0; index < assetListItems.length; index++) { + const assetListItem = assetListItems[index]; - const titleAttributeValue: string = await page.evaluate((item) => item.getAttribute('title'), assetListItem); + const titleAttributeValue: string = await page.evaluate( + (item: HTMLButtonElement) => item.getAttribute("title"), + assetListItem + ); - if (titleAttributeValue.split(' ')[1].toUpperCase() === tokenSymbol.toUpperCase()) { - const balance = titleAttributeValue.split(' ')[0]; - return parseFloat(balance); + if ( + titleAttributeValue.split(" ")[1].toUpperCase() === + tokenSymbol.toUpperCase() + ) { + const balance = titleAttributeValue.split(" ")[0]; + return parseFloat(balance); + } } - } - return 0; -}; + return 0; + }; diff --git a/src/metamask/helpers/index.ts b/src/metamask/helpers/index.ts index 20533a8e..77ab5f99 100644 --- a/src/metamask/helpers/index.ts +++ b/src/metamask/helpers/index.ts @@ -1,3 +1,3 @@ -export * from './getTokenBalance'; -export * from './deleteAccount'; -export * from './deleteNetwork'; +export * from "./getTokenBalance"; +export * from "./deleteAccount"; +export * from "./deleteNetwork"; diff --git a/src/metamask/importPk.ts b/src/metamask/importPk.ts index 17e69fad..63557b36 100644 --- a/src/metamask/importPk.ts +++ b/src/metamask/importPk.ts @@ -1,16 +1,23 @@ -import { Page } from 'puppeteer'; +import { Page } from "puppeteer"; -import { clickOnButton, clickOnElement, getErrorMessage, openProfileDropdown, typeOnInputField } from '../helpers'; +import { + clickOnButton, + clickOnElement, + getErrorMessage, + openProfileDropdown, + typeOnInputField, +} from "../helpers"; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export const importPk = (page: Page, version?: string) => async (privateKey: string): Promise => { - await page.bringToFront(); - await openProfileDropdown(page); +export const importPk = + (page: Page) => + async (privateKey: string): Promise => { + await page.bringToFront(); + await openProfileDropdown(page); - await clickOnElement(page, 'Import account'); - await typeOnInputField(page, 'your private key', privateKey); - await clickOnButton(page, 'Import'); + await clickOnElement(page, "Import account"); + await typeOnInputField(page, "your private key", privateKey); + await clickOnButton(page, "Import"); - const errorMessage = await getErrorMessage(page); - if (errorMessage) throw new SyntaxError(errorMessage); -}; + const errorMessage = await getErrorMessage(page); + if (errorMessage) throw new SyntaxError(errorMessage); + }; diff --git a/src/metamask/index.ts b/src/metamask/index.ts index e6b2bd22..47142828 100644 --- a/src/metamask/index.ts +++ b/src/metamask/index.ts @@ -1,67 +1,74 @@ -import { Browser, Page } from 'puppeteer'; +import { Browser, Page } from "puppeteer"; -import { Dappeteer } from '..'; +import { Dappeteer } from ".."; -import { addNetwork } from './addNetwork'; -import { addToken } from './addToken'; -import { approve } from './approve'; -import { confirmTransaction } from './confirmTransaction'; -import { deleteAccount, getTokenBalance, deleteNetwork } from './helpers'; -import { importPk } from './importPk'; -import { lock } from './lock'; -import { sign } from './sign'; -import { switchAccount } from './switchAccount'; -import { switchNetwork } from './switchNetwork'; -import { unlock } from './unlock'; +import { addNetwork } from "./addNetwork"; +import { addToken } from "./addToken"; +import { approve } from "./approve"; +import { confirmTransaction } from "./confirmTransaction"; +import { deleteAccount, getTokenBalance, deleteNetwork } from "./helpers"; +import { importPk } from "./importPk"; +import { lock } from "./lock"; +import { sign } from "./sign"; +import { switchAccount } from "./switchAccount"; +import { switchNetwork } from "./switchNetwork"; +import { unlock } from "./unlock"; export type SetSignedIn = (state: boolean) => Promise; export type GetSingedIn = () => Promise; -export const getMetaMask = async (page: Page, version?: string): Promise => { +export const getMetaMask = (page: Page): Promise => { // modified window object to kep state between tests const setSignedIn = async (state: boolean): Promise => { await page.evaluate((s: boolean) => { - ((window as unknown) as { signedIn: boolean }).signedIn = s; + (window as unknown as { signedIn: boolean }).signedIn = s; }, state); }; const getSingedIn = (): Promise => page.evaluate(() => - ((window as unknown) as { signedIn: boolean | undefined }).signedIn !== undefined - ? ((window as unknown) as { signedIn: boolean }).signedIn - : true, + (window as unknown as { signedIn: boolean | undefined }).signedIn !== + undefined + ? (window as unknown as { signedIn: boolean }).signedIn + : true ); - return { - addNetwork: addNetwork(page, version), - approve: approve(page, version), - confirmTransaction: confirmTransaction(page, getSingedIn, version), - importPK: importPk(page, version), - lock: lock(page, setSignedIn, getSingedIn, version), - sign: sign(page, getSingedIn, version), - switchAccount: switchAccount(page, version), - switchNetwork: switchNetwork(page, version), - unlock: unlock(page, setSignedIn, getSingedIn, version), - addToken: addToken(page), - helpers: { - getTokenBalance: getTokenBalance(page), - deleteAccount: deleteAccount(page), - deleteNetwork: deleteNetwork(page), - }, - page, - }; + return new Promise((resolve) => + resolve({ + addNetwork: addNetwork(page), + approve: approve(page), + confirmTransaction: confirmTransaction(page, getSingedIn), + importPK: importPk(page), + lock: lock(page, setSignedIn, getSingedIn), + sign: sign(page, getSingedIn), + switchAccount: switchAccount(page), + switchNetwork: switchNetwork(page), + unlock: unlock(page, setSignedIn, getSingedIn), + addToken: addToken(page), + helpers: { + getTokenBalance: getTokenBalance(page), + deleteAccount: deleteAccount(page), + deleteNetwork: deleteNetwork(page), + }, + page, + }) + ); }; /** * Return MetaMask instance * */ -export async function getMetaMaskWindow(browser: Browser, version?: string): Promise { - const metaMaskPage = await new Promise((resolve) => { - browser.pages().then((pages) => { - for (const page of pages) { - if (page.url().includes('chrome-extension')) resolve(page); - } - }); +export async function getMetaMaskWindow(browser: Browser): Promise { + const metaMaskPage = await new Promise((resolve, reject) => { + browser + .pages() + .then((pages) => { + for (const page of pages) { + if (page.url().includes("chrome-extension")) resolve(page); + } + reject("Metamask extension not found"); + }) + .catch((e) => reject(e)); }); - return getMetaMask(metaMaskPage, version); + return getMetaMask(metaMaskPage); } diff --git a/src/metamask/lock.ts b/src/metamask/lock.ts index 84d52312..4f7e8fac 100644 --- a/src/metamask/lock.ts +++ b/src/metamask/lock.ts @@ -1,23 +1,19 @@ -import { Page } from 'puppeteer'; +import { Page } from "puppeteer"; -import { clickOnButton, openProfileDropdown } from '../helpers'; +import { clickOnButton, openProfileDropdown } from "../helpers"; -import { GetSingedIn, SetSignedIn } from './index'; +import { GetSingedIn, SetSignedIn } from "./index"; -export const lock = ( - page: Page, - setSignedIn: SetSignedIn, - getSingedIn: GetSingedIn, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - version?: string, -) => async (): Promise => { - if (!(await getSingedIn())) { - throw new Error("You can't sign out because you haven't signed in yet"); - } - await page.bringToFront(); +export const lock = + (page: Page, setSignedIn: SetSignedIn, getSingedIn: GetSingedIn) => + async (): Promise => { + if (!(await getSingedIn())) { + throw new Error("You can't sign out because you haven't signed in yet"); + } + await page.bringToFront(); - await openProfileDropdown(page); - await clickOnButton(page, 'Lock'); + await openProfileDropdown(page); + await clickOnButton(page, "Lock"); - await setSignedIn(false); -}; + await setSignedIn(false); + }; diff --git a/src/metamask/sign.ts b/src/metamask/sign.ts index 87a3eb35..013bb77f 100644 --- a/src/metamask/sign.ts +++ b/src/metamask/sign.ts @@ -1,18 +1,18 @@ -import { Page } from 'puppeteer'; +import { Page } from "puppeteer"; -import { clickOnButton } from '../helpers'; +import { clickOnButton } from "../helpers"; -import { GetSingedIn } from '.'; +import { GetSingedIn } from "."; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export const sign = (page: Page, getSingedIn: GetSingedIn, version?: string) => async (): Promise => { - await page.bringToFront(); - if (!(await getSingedIn())) { - throw new Error("You haven't signed in yet"); - } +export const sign = + (page: Page, getSingedIn: GetSingedIn) => async (): Promise => { + await page.bringToFront(); + if (!(await getSingedIn())) { + throw new Error("You haven't signed in yet"); + } - await page.waitForTimeout(500); - await page.reload(); + await page.waitForTimeout(500); + await page.reload(); - await clickOnButton(page, 'Sign'); -}; + await clickOnButton(page, "Sign"); + }; diff --git a/src/metamask/switchAccount.ts b/src/metamask/switchAccount.ts index 1188b7cd..65c83f79 100644 --- a/src/metamask/switchAccount.ts +++ b/src/metamask/switchAccount.ts @@ -1,12 +1,14 @@ -import { Page } from 'puppeteer'; +import { Page } from "puppeteer"; -import { clickOnElement, openProfileDropdown } from '../helpers'; +import { clickOnElement, openProfileDropdown } from "../helpers"; // eslint-disable-next-line @typescript-eslint/no-unused-vars -export const switchAccount = (page: Page, version?: string) => async (accountNumber: number): Promise => { - await page.bringToFront(); - await openProfileDropdown(page); +export const switchAccount = + (page: Page) => + async (accountNumber: number): Promise => { + await page.bringToFront(); + await openProfileDropdown(page); - // TODO: use different approach? maybe change param to account name - await clickOnElement(page, `Account ${accountNumber}`); -}; + // TODO: use different approach? maybe change param to account name + await clickOnElement(page, `Account ${accountNumber}`); + }; diff --git a/src/metamask/switchNetwork.ts b/src/metamask/switchNetwork.ts index 6d48662d..436b8269 100644 --- a/src/metamask/switchNetwork.ts +++ b/src/metamask/switchNetwork.ts @@ -1,30 +1,35 @@ -import { Page } from 'puppeteer'; +import { Page } from "puppeteer"; -import { openNetworkDropdown } from '../helpers'; +import { openNetworkDropdown } from "../helpers"; // TODO: validate - for now works fine as it is. -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export const switchNetwork = (page: Page, version?: string) => async (network = 'main'): Promise => { - await page.bringToFront(); - await openNetworkDropdown(page); +export const switchNetwork = + (page: Page) => + async (network: string = "main"): Promise => { + await page.bringToFront(); + await openNetworkDropdown(page); - const networkIndex = await page.evaluate((network) => { - const elements = document.querySelectorAll('.network-name-item'); - for (let i = 0; i < elements.length; i++) { - const element = elements[i]; - if ((element as HTMLLIElement).innerText.toLowerCase().includes(network.toLowerCase())) { - return i; + const networkIndex = await page.evaluate((network: string) => { + const elements = document.querySelectorAll(".network-name-item"); + for (let i = 0; i < elements.length; i++) { + const element = elements[i]; + if ( + (element as HTMLLIElement).innerText + .toLowerCase() + .includes(network.toLowerCase()) + ) { + return i; + } } - } - return 0; - }, network); + return 0; + }, network); - const networkFullName = await page.evaluate((index) => { - const elements = document.querySelectorAll(`.network-name-item`); - return (elements[index] as HTMLLIElement).innerText; - }, networkIndex); + const networkFullName = await page.evaluate((index: number) => { + const elements = document.querySelectorAll(`.network-name-item`); + return (elements[index] as HTMLLIElement).innerText; + }, networkIndex); - const networkButton = (await page.$$('.network-name-item'))[networkIndex]; - await networkButton.click(); - await page.waitForXPath(`//*[text() = '${networkFullName}']`); -}; + const networkButton = (await page.$$(".network-name-item"))[networkIndex]; + await networkButton.click(); + await page.waitForXPath(`//*[text() = '${networkFullName}']`); + }; diff --git a/src/metamask/unlock.ts b/src/metamask/unlock.ts index 3ffc9d41..17d194c2 100644 --- a/src/metamask/unlock.ts +++ b/src/metamask/unlock.ts @@ -1,20 +1,19 @@ -import { Page } from 'puppeteer'; +import { Page } from "puppeteer"; -import { clickOnButton, typeOnInputField } from '../helpers'; +import { clickOnButton, typeOnInputField } from "../helpers"; -import { GetSingedIn, SetSignedIn } from '.'; +import { GetSingedIn, SetSignedIn } from "."; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export const unlock = (page: Page, setSignedIn: SetSignedIn, getSingedIn: GetSingedIn, version?: string) => async ( - password = 'password1234', -): Promise => { - if (await getSingedIn()) { - throw new Error("You can't sign in because you are already signed in"); - } - await page.bringToFront(); +export const unlock = + (page: Page, setSignedIn: SetSignedIn, getSingedIn: GetSingedIn) => + async (password = "password1234"): Promise => { + if (await getSingedIn()) { + throw new Error("You can't sign in because you are already signed in"); + } + await page.bringToFront(); - await typeOnInputField(page, 'Password', password); - await clickOnButton(page, 'Unlock'); + await typeOnInputField(page, "Password", password); + await clickOnButton(page, "Unlock"); - await setSignedIn(true); -}; + await setSignedIn(true); + }; diff --git a/src/setup/index.ts b/src/setup/index.ts index 70b9aff0..953c9b58 100644 --- a/src/setup/index.ts +++ b/src/setup/index.ts @@ -1,19 +1,28 @@ -import puppeteer, { Browser, Page } from 'puppeteer'; +import puppeteer, { Browser, Page } from "puppeteer"; -import { Dappeteer, MetaMaskOptions, OfficialOptions } from '../types'; +import { Dappeteer, MetaMaskOptions, OfficialOptions } from "../types"; -import { launch } from './launch'; -import { setupMetaMask } from './setupMetaMask'; +import { launch } from "./launch"; +import { setupMetaMask } from "./setupMetaMask"; -export * from './launch'; -export * from './setupMetaMask'; +export * from "./launch"; +export * from "./setupMetaMask"; export const bootstrap = async ( puppeteerLib: typeof puppeteer, - { seed, password, showTestNets, ...launchOptions }: OfficialOptions & MetaMaskOptions, + { + seed, + password, + showTestNets, + ...launchOptions + }: OfficialOptions & MetaMaskOptions ): Promise<[Dappeteer, Page, Browser]> => { const browser = await launch(puppeteerLib, launchOptions); - const dappeteer = await setupMetaMask(browser, { seed, password, showTestNets }); + const dappeteer = await setupMetaMask(browser, { + seed, + password, + showTestNets, + }); const pages = await browser.pages(); return [dappeteer, pages[0], browser]; diff --git a/src/setup/isNewerVersion.ts b/src/setup/isNewerVersion.ts index c0a7aa34..287ba02a 100644 --- a/src/setup/isNewerVersion.ts +++ b/src/setup/isNewerVersion.ts @@ -1,14 +1,28 @@ -export const isNewerVersion = (current: string, comparingWith: string): boolean => { +export const isNewerVersion = ( + current: string, + comparingWith: string +): boolean => { if (current === comparingWith) return false; - const currentFragments = current.replace(/[^\d.-]/g, '').split('.'); - const comparingWithFragments = comparingWith.replace(/[^\d.-]/g, '').split('.'); + const currentFragments = current.replace(/[^\d.-]/g, "").split("."); + const comparingWithFragments = comparingWith + .replace(/[^\d.-]/g, "") + .split("."); const length = - currentFragments.length > comparingWithFragments.length ? currentFragments.length : comparingWithFragments.length; + currentFragments.length > comparingWithFragments.length + ? currentFragments.length + : comparingWithFragments.length; for (let i = 0; i < length; i++) { - if ((Number(currentFragments[i]) || 0) === (Number(comparingWithFragments[i]) || 0)) continue; - return (Number(comparingWithFragments[i]) || 0) > (Number(currentFragments[i]) || 0); + if ( + (Number(currentFragments[i]) || 0) === + (Number(comparingWithFragments[i]) || 0) + ) + continue; + return ( + (Number(comparingWithFragments[i]) || 0) > + (Number(currentFragments[i]) || 0) + ); } return true; }; diff --git a/src/setup/launch.ts b/src/setup/launch.ts index c2b89734..808712b6 100644 --- a/src/setup/launch.ts +++ b/src/setup/launch.ts @@ -1,44 +1,54 @@ -import puppeteer from 'puppeteer'; +import puppeteer from "puppeteer"; -import { CustomOptions, OfficialOptions, RECOMMENDED_METAMASK_VERSION } from '../index'; -import { LaunchOptions } from '../types'; +import { + CustomOptions, + OfficialOptions, + RECOMMENDED_METAMASK_VERSION, +} from "../index"; +import { LaunchOptions } from "../types"; -import { isNewerVersion } from './isNewerVersion'; -import downloader from './metaMaskDownloader'; +import { isNewerVersion } from "./isNewerVersion"; +import downloader from "./metaMaskDownloader"; /** * Launch Puppeteer chromium instance with MetaMask plugin installed * */ -export async function launch(puppeteerLib: typeof puppeteer, options: LaunchOptions): Promise { - if (!options || (!options.metaMaskVersion && !(options as CustomOptions).metaMaskPath)) +export async function launch( + puppeteerLib: typeof puppeteer, + options: LaunchOptions +): Promise { + if ( + !options || + (!options.metaMaskVersion && !(options as CustomOptions).metaMaskPath) + ) throw new Error( - `Please provide "metaMaskVersion" (recommended "${RECOMMENDED_METAMASK_VERSION}" or "latest" to always get latest release of MetaMask)`, + `Please provide "metaMaskVersion" (recommended "${RECOMMENDED_METAMASK_VERSION}" or "latest" to always get latest release of MetaMask)` ); const { args, ...rest } = options; // eslint-disable-next-line @typescript-eslint/naming-convention - let METAMASK_PATH; + let METAMASK_PATH: string; if (options.metaMaskVersion) { const { metaMaskVersion, metaMaskLocation } = rest as OfficialOptions; /* eslint-disable no-console */ console.log(); // new line - if (metaMaskVersion === 'latest') + if (metaMaskVersion === "latest") console.warn( - '\x1b[33m%s\x1b[0m', - `It is not recommended to run MetaMask with "latest" version. Use it at your own risk or set to the recommended version "${RECOMMENDED_METAMASK_VERSION}".`, + "\x1b[33m%s\x1b[0m", + `It is not recommended to run MetaMask with "latest" version. Use it at your own risk or set to the recommended version "${RECOMMENDED_METAMASK_VERSION}".` ); else if (isNewerVersion(RECOMMENDED_METAMASK_VERSION, metaMaskVersion)) console.warn( - '\x1b[33m%s\x1b[0m', + "\x1b[33m%s\x1b[0m", `Seems you are running newer version of MetaMask that recommended by dappeteer team. - Use it at your own risk or set to the recommended version "${RECOMMENDED_METAMASK_VERSION}".`, + Use it at your own risk or set to the recommended version "${RECOMMENDED_METAMASK_VERSION}".` ); else if (isNewerVersion(metaMaskVersion, RECOMMENDED_METAMASK_VERSION)) console.warn( - '\x1b[33m%s\x1b[0m', + "\x1b[33m%s\x1b[0m", `Seems you are running older version of MetaMask that recommended by dappeteer team. - Use it at your own risk or set the recommended version "${RECOMMENDED_METAMASK_VERSION}".`, + Use it at your own risk or set the recommended version "${RECOMMENDED_METAMASK_VERSION}".` ); else console.log(`Running tests on MetaMask version ${metaMaskVersion}`); @@ -54,7 +64,11 @@ export async function launch(puppeteerLib: typeof puppeteer, options: LaunchOpti return puppeteerLib.launch({ headless: false, - args: [`--disable-extensions-except=${METAMASK_PATH}`, `--load-extension=${METAMASK_PATH}`, ...(args || [])], + args: [ + `--disable-extensions-except=${METAMASK_PATH}`, + `--load-extension=${METAMASK_PATH}`, + ...(args || []), + ], ...rest, }); } diff --git a/src/setup/metaMaskDownloader.ts b/src/setup/metaMaskDownloader.ts index b779235e..9b3458dd 100644 --- a/src/setup/metaMaskDownloader.ts +++ b/src/setup/metaMaskDownloader.ts @@ -1,11 +1,12 @@ -import * as fs from 'fs'; -import { IncomingMessage } from 'http'; -import { get } from 'https'; -import * as path from 'path'; +/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */ +import * as fs from "fs"; +import { IncomingMessage } from "http"; +import { get } from "https"; +import * as path from "path"; -import StreamZip from 'node-stream-zip'; +import StreamZip from "node-stream-zip"; -const defaultDirectory = path.resolve(__dirname, '..', '..', 'metamask'); +const defaultDirectory = path.resolve(__dirname, "..", "..", "metamask"); export type Path = | string @@ -15,18 +16,33 @@ export type Path = }; export default async (version: string, location?: Path): Promise => { - const metaMaskDirectory = typeof location === 'string' ? location : location?.extract || defaultDirectory; + const metaMaskDirectory = + typeof location === "string" + ? location + : location?.extract || defaultDirectory; const downloadDirectory = - typeof location === 'string' ? location : location?.download || path.resolve(defaultDirectory, 'download'); + typeof location === "string" + ? location + : location?.download || path.resolve(defaultDirectory, "download"); - if (version !== 'latest') { - const extractDestination = path.resolve(metaMaskDirectory, version.replace(/\./g, '_')); + if (version !== "latest") { + const extractDestination = path.resolve( + metaMaskDirectory, + version.replace(/\./g, "_") + ); if (fs.existsSync(extractDestination)) return extractDestination; } const { filename, downloadUrl, tag } = await getMetaMaskReleases(version); - const extractDestination = path.resolve(metaMaskDirectory, tag.replace(/\./g, '_')); + const extractDestination = path.resolve( + metaMaskDirectory, + tag.replace(/\./g, "_") + ); if (!fs.existsSync(extractDestination)) { - const downloadedFile = await downloadMetaMaskReleases(filename, downloadUrl, downloadDirectory); + const downloadedFile = await downloadMetaMaskReleases( + filename, + downloadUrl, + downloadDirectory + ); const zip = new StreamZip.async({ file: downloadedFile }); fs.mkdirSync(extractDestination); await zip.extract(null, extractDestination); @@ -40,24 +56,28 @@ const request = (url: string): Promise => const request = get(url, (response) => { if (response.statusCode == 302) { const redirectRequest = get(response.headers.location, resolve); - redirectRequest.on('error', (error) => { + redirectRequest.on("error", (error) => { // eslint-disable-next-line no-console - console.warn('request redirected error:', error.message); + console.warn("request redirected error:", error.message); throw error; }); } else { resolve(response); } }); - request.on('error', (error) => { + request.on("error", (error) => { // eslint-disable-next-line no-console - console.warn('request error:', error.message); + console.warn("request error:", error.message); throw error; }); }); -const downloadMetaMaskReleases = (name: string, url: string, location: string): Promise => - // eslint-disable-next-line no-async-promise-executor +const downloadMetaMaskReleases = ( + name: string, + url: string, + location: string +): Promise => + // eslint-disable-next-line no-async-promise-executor, @typescript-eslint/no-misused-promises new Promise(async (resolve) => { if (!fs.existsSync(location)) { fs.mkdirSync(location, { recursive: true }); @@ -66,43 +86,54 @@ const downloadMetaMaskReleases = (name: string, url: string, location: string): const file = fs.createWriteStream(fileLocation); const stream = await request(url); stream.pipe(file); - stream.on('end', () => { + stream.on("end", () => { resolve(fileLocation); }); }); type MetaMaskReleases = { downloadUrl: string; filename: string; tag: string }; -const metaMaskReleasesUrl = 'https://api.github.com/repos/metamask/metamask-extension/releases'; +const metaMaskReleasesUrl = + "https://api.github.com/repos/metamask/metamask-extension/releases"; const getMetaMaskReleases = (version: string): Promise => new Promise((resolve, reject) => { // eslint-disable-next-line @typescript-eslint/naming-convention - const request = get(metaMaskReleasesUrl, { headers: { 'User-Agent': 'Mozilla/5.0' } }, (response) => { - let body = ''; - response.on('data', (chunk) => { - body += chunk; - }); - response.on('end', () => { - const data = JSON.parse(body); - if (data.message) return reject(data.message); - for (const result of data) { - if (result.draft) continue; - if (version === 'latest' || result.name.includes(version) || result.tag_name.includes(version)) { - for (const asset of result.assets) { - if (asset.name.includes('chrome')) - resolve({ - downloadUrl: asset.browser_download_url, - filename: asset.name, - tag: result.tag_name, - }); + const request = get( + metaMaskReleasesUrl, + { headers: { "User-Agent": "Mozilla/5.0" } }, + (response) => { + let body = ""; + response.on("data", (chunk) => { + body += chunk; + }); + response.on("end", () => { + const data = JSON.parse(body); + if (data.message) return reject(data.message); + for (const result of data) { + if (result.draft) continue; + if ( + version === "latest" || + result.name.includes(version) || + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + result.tag_name.includes(version) + ) { + for (const asset of result.assets) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + if (asset.name.includes("chrome")) + resolve({ + downloadUrl: asset.browser_download_url, + filename: asset.name, + tag: result.tag_name, + }); + } } } - } - reject(`Version ${version} not found!`); - }); - }); - request.on('error', (error) => { + reject(`Version ${version} not found!`); + }); + } + ); + request.on("error", (error) => { // eslint-disable-next-line no-console - console.warn('getMetaMaskReleases error:', error.message); + console.warn("getMetaMaskReleases error:", error.message); throw error; }); }); diff --git a/src/setup/setupActions.ts b/src/setup/setupActions.ts index 18bd29dd..39d85a53 100644 --- a/src/setup/setupActions.ts +++ b/src/setup/setupActions.ts @@ -1,4 +1,4 @@ -import { Page } from 'puppeteer'; +import { Page } from "puppeteer"; import { clickOnButton, @@ -7,59 +7,66 @@ import { clickOnSettingsSwitch, openNetworkDropdown, typeOnInputField, -} from '../helpers'; -import { MetaMaskOptions } from '../types'; +} from "../helpers"; +import { MetaMaskOptions } from "../types"; export async function showTestNets(metaMaskPage: Page): Promise { await openNetworkDropdown(metaMaskPage); - await clickOnElement(metaMaskPage, 'Show/hide'); - await clickOnSettingsSwitch(metaMaskPage, 'Show test networks'); + await clickOnElement(metaMaskPage, "Show/hide"); + await clickOnSettingsSwitch(metaMaskPage, "Show test networks"); await clickOnLogo(metaMaskPage); } export async function confirmWelcomeScreen(metaMaskPage: Page): Promise { - await clickOnButton(metaMaskPage, 'Get started'); + await clickOnButton(metaMaskPage, "Get started"); } export async function declineAnalytics(metaMaskPage: Page): Promise { - await clickOnButton(metaMaskPage, 'No thanks'); + await clickOnButton(metaMaskPage, "No thanks"); } export async function importAccount( metaMaskPage: Page, { - seed = 'already turtle birth enroll since owner keep patch skirt drift any dinner', - password = 'password1234', - }: MetaMaskOptions, + seed = "already turtle birth enroll since owner keep patch skirt drift any dinner", + password = "password1234", + }: MetaMaskOptions ): Promise { - await clickOnButton(metaMaskPage, 'Import wallet'); + await clickOnButton(metaMaskPage, "Import wallet"); - for (const [index, seedPart] of seed.split(' ').entries()) + for (const [index, seedPart] of seed.split(" ").entries()) await typeOnInputField(metaMaskPage, `${index + 1}.`, seedPart); - await typeOnInputField(metaMaskPage, 'New password', password); - await typeOnInputField(metaMaskPage, 'Confirm password', password); + await typeOnInputField(metaMaskPage, "New password", password); + await typeOnInputField(metaMaskPage, "Confirm password", password); // select checkbox "I have read and agree to the" - const acceptTerms = await metaMaskPage.waitForSelector('.create-new-vault__terms-label'); + const acceptTerms = await metaMaskPage.waitForSelector( + ".create-new-vault__terms-label" + ); await acceptTerms.click(); - await clickOnButton(metaMaskPage, 'Import'); - await clickOnButton(metaMaskPage, 'All done'); + await clickOnButton(metaMaskPage, "Import"); + await clickOnButton(metaMaskPage, "All done"); } export const closePopup = async (page: Page): Promise => { /* For some reason popup deletes close button and then create new one (react stuff) * hacky solution can be found here => https://github.com/puppeteer/puppeteer/issues/3496 */ await new Promise((resolve) => setTimeout(resolve, 1000)); - await page.$eval('.popover-header__button', (node: HTMLElement) => node.click()); + await page.$eval(".popover-header__button", (node: HTMLElement) => + node.click() + ); }; export const closePortfolioTooltip = async (page: Page): Promise => { - const closeButton = await page.waitForSelector(`div.home__subheader-link--tooltip-content-header > button`, { - timeout: 20000, - }); + const closeButton = await page.waitForSelector( + `div.home__subheader-link--tooltip-content-header > button`, + { + timeout: 20000, + } + ); await closeButton.click(); await page.waitForTimeout(333); }; diff --git a/src/setup/setupMetaMask.ts b/src/setup/setupMetaMask.ts index 52f342e0..eb82fa59 100644 --- a/src/setup/setupMetaMask.ts +++ b/src/setup/setupMetaMask.ts @@ -1,7 +1,7 @@ -import { Browser, BrowserContext, Page } from 'puppeteer'; +import { Browser, BrowserContext, Page, Target } from "puppeteer"; -import { getMetaMask } from '../metamask'; -import { Dappeteer, MetaMaskOptions } from '../types'; +import { getMetaMask } from "../metamask"; +import { Dappeteer, MetaMaskOptions } from "../types"; import { closePortfolioTooltip, @@ -10,12 +10,12 @@ import { declineAnalytics, importAccount, showTestNets, -} from './setupActions'; +} from "./setupActions"; /** * Setup MetaMask with base account * */ -type Step = (page: Page, options?: Options) => void; +type Step = (page: Page, options?: Options) => void | Promise; const defaultMetaMaskSteps: Step[] = [ confirmWelcomeScreen, declineAnalytics, @@ -29,10 +29,10 @@ const defaultMetaMaskSteps: Step[] = [ export async function setupMetaMask( browser: Browser | BrowserContext, options?: Options, - steps: Step[] = defaultMetaMaskSteps, + steps: Step[] = defaultMetaMaskSteps ): Promise { const page = await getMetamaskPage(browser); - page.setViewport({ height: 1200, width: 800 }); + await page.setViewport({ height: 1200, width: 800 }); // goes through the installation steps required by MetaMask for (const step of steps) { await step(page, options); @@ -41,16 +41,19 @@ export async function setupMetaMask( return getMetaMask(page); } -async function getMetamaskPage(browser: Browser | BrowserContext): Promise { +async function getMetamaskPage( + browser: Browser | BrowserContext +): Promise { const pages = await browser.pages(); for (const page of pages) { - if (page.url().match('chrome-extension://[a-z]+/home.html')) { + if (page.url().match("chrome-extension://[a-z]+/home.html")) { return page; } } return new Promise((resolve, reject) => { - browser.on('targetcreated', async (target) => { - if (target.url().match('chrome-extension://[a-z]+/home.html')) { + // eslint-disable-next-line @typescript-eslint/no-misused-promises + browser.on("targetcreated", async (target: Target) => { + if (target.url().match("chrome-extension://[a-z]+/home.html")) { try { const page = await target.page(); resolve(page); diff --git a/src/types.ts b/src/types.ts index c62a3dfc..52be7627 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,8 +1,8 @@ -import * as puppeteer from 'puppeteer'; +import * as puppeteer from "puppeteer"; -import { Path } from './setup/metaMaskDownloader'; +import { Path } from "./setup/metaMaskDownloader"; -import { RECOMMENDED_METAMASK_VERSION } from './index'; +import { RECOMMENDED_METAMASK_VERSION } from "./index"; export type LaunchOptions = OfficialOptions | CustomOptions; @@ -13,10 +13,10 @@ type PuppeteerLaunchOptions = puppeteer.LaunchOptions & extraPrefsFirefox?: Record; }; -type DappeteerLaunchOptions = Omit; +type DappeteerLaunchOptions = Omit; export type OfficialOptions = DappeteerLaunchOptions & { - metaMaskVersion: typeof RECOMMENDED_METAMASK_VERSION | 'latest' | string; + metaMaskVersion: typeof RECOMMENDED_METAMASK_VERSION | "latest" | string; metaMaskLocation?: Path; }; diff --git a/test/basic.spec.ts b/test/basic.spec.ts index 8aae4987..12cf422d 100644 --- a/test/basic.spec.ts +++ b/test/basic.spec.ts @@ -1,25 +1,27 @@ -import { expect, use } from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import { Page } from 'puppeteer'; +import { expect, use } from "chai"; +import chaiAsPromised from "chai-as-promised"; +import { Page } from "puppeteer"; -import * as dappeteer from '../src'; -import { openProfileDropdown } from '../src/helpers'; +import * as dappeteer from "../src"; +import { openProfileDropdown } from "../src/helpers"; -import { PASSWORD, TestContext } from './global'; -import { clickElement } from './utils/utils'; +import { PASSWORD, TestContext } from "./global"; +import { clickElement } from "./utils/utils"; use(chaiAsPromised); -describe('basic interactions', async function () { +describe("basic interactions", function () { let metamask: dappeteer.Dappeteer; let testPage: Page; before(async function (this: TestContext) { testPage = await this.browser.newPage(); - await testPage.goto('http://localhost:8080/', { waitUntil: 'networkidle0' }); + await testPage.goto("http://localhost:8080/", { + waitUntil: "networkidle0", + }); metamask = this.metamask; try { - await clickElement(testPage, '.connect-button'); + await clickElement(testPage, ".connect-button"); await metamask.approve(); } catch (e) { //ignored @@ -34,82 +36,90 @@ describe('basic interactions', async function () { await testPage.close(); }); - it('should be able to sign', async () => { - await clickElement(testPage, '.sign-button'); + it("should be able to sign", async () => { + await clickElement(testPage, ".sign-button"); await metamask.sign(); - await testPage.waitForSelector('#signed'); + await testPage.waitForSelector("#signed"); }); - it('should switch network', async () => { - await metamask.switchNetwork('localhost'); + it("should switch network", async () => { + await metamask.switchNetwork("localhost"); const selectedNetwork = await metamask.page.evaluate( - () => (document.querySelector('.network-display > span:nth-child(2)') as HTMLSpanElement).innerHTML, + () => + document.querySelector(".network-display > span:nth-child(2)").innerHTML ); - expect(selectedNetwork).to.be.equal('Localhost 8545'); + expect(selectedNetwork).to.be.equal("Localhost 8545"); }); - it('should return eth balance', async () => { - await metamask.switchNetwork('localhost'); - const tokenBalance: number = await metamask.helpers.getTokenBalance('ETH'); + it("should return eth balance", async () => { + await metamask.switchNetwork("localhost"); + const tokenBalance: number = await metamask.helpers.getTokenBalance("ETH"); expect(tokenBalance).to.be.greaterThan(0); }); - it('should return 0 token balance when token not found', async () => { - const tokenBalance: number = await metamask.helpers.getTokenBalance('FARTBUCKS'); + it("should return 0 token balance when token not found", async () => { + const tokenBalance: number = await metamask.helpers.getTokenBalance( + "FARTBUCKS" + ); expect(tokenBalance).to.be.equal(0); }); // TODO: cover more cases - it('should add token', async () => { - await metamask.switchNetwork('mainnet'); + it("should add token", async () => { + await metamask.switchNetwork("mainnet"); await metamask.addToken({ - tokenAddress: '0x4f96fe3b7a6cf9725f59d353f723c1bdb64ca6aa', - symbol: 'KAKI', + tokenAddress: "0x4f96fe3b7a6cf9725f59d353f723c1bdb64ca6aa", + symbol: "KAKI", }); }); - it('should add network with required params', async () => { + it("should add network with required params", async () => { await metamask.addNetwork({ - networkName: 'Binance Smart Chain', - rpc: 'https://data-seed-prebsc-1-s1.binance.org:8545/', + networkName: "Binance Smart Chain", + rpc: "https://data-seed-prebsc-1-s1.binance.org:8545/", chainId: 97, - symbol: 'BNB', + symbol: "BNB", }); const selectedNetwork = await metamask.page.evaluate( - () => (document.querySelector('.network-display > span:nth-child(2)') as HTMLSpanElement).innerHTML, + () => + document.querySelector(".network-display > span:nth-child(2)").innerHTML ); - expect(selectedNetwork).to.be.equal('Binance Smart Chain'); - await metamask.switchNetwork('local'); + expect(selectedNetwork).to.be.equal("Binance Smart Chain"); + await metamask.switchNetwork("local"); }); - it('should import private key', async () => { + it("should import private key", async () => { const countAccounts = async (): Promise => { await openProfileDropdown(metamask.page); - const container = await metamask.page.$('.account-menu__accounts'); - const count = (await container.$$('.account-menu__account')).length; + const container = await metamask.page.$(".account-menu__accounts"); + const count = (await container.$$(".account-menu__account")).length; await openProfileDropdown(metamask.page); return count; }; const beforeImport = await countAccounts(); - await metamask.importPK('4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b10'); + await metamask.importPK( + "4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b10" + ); const afterImport = await countAccounts(); expect(beforeImport + 1).to.be.equal(afterImport); await metamask.helpers.deleteAccount(2); }); - it('should throw error on wrong key', async () => { + it("should throw error on wrong key", async () => { await expect( - metamask.importPK('4f3edf983ac636a65a$@!ce7c78d9aa706d3b113bce9c46f30d7d21715b23b10'), + metamask.importPK( + "4f3edf983ac636a65a$@!ce7c78d9aa706d3b113bce9c46f30d7d21715b23b10" + ) ).to.be.rejectedWith(SyntaxError); }); - it('should lock and unlock', async () => { + it("should lock and unlock", async () => { await metamask.lock(); await metamask.unlock(PASSWORD); }); diff --git a/test/contract.spec.ts b/test/contract.spec.ts index d7275033..a4922986 100644 --- a/test/contract.spec.ts +++ b/test/contract.spec.ts @@ -1,45 +1,46 @@ -import { expect } from 'chai'; -import { Page } from 'puppeteer'; +import { expect } from "chai"; +import { Page } from "puppeteer"; -import { Dappeteer } from '../src'; +import { Dappeteer } from "../src"; -import { Contract } from './deploy'; -import { TestContext } from './global'; -import { clickElement, pause } from './utils/utils'; +import { Contract } from "./deploy"; +import { TestContext } from "./global"; +import { clickElement, pause } from "./utils/utils"; -describe('contract interactions', async function () { +describe("contract interactions", function () { let contract: Contract; let testPage: Page; let metamask: Dappeteer; before(async function (this: TestContext) { testPage = await this.browser.newPage(); - await testPage.goto('http://localhost:8080/', { waitUntil: 'load' }); + await testPage.goto("http://localhost:8080/", { waitUntil: "load" }); metamask = this.metamask; + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment contract = this.contract; try { - await clickElement(testPage, '.connect-button'); + await clickElement(testPage, ".connect-button"); await metamask.approve(); } catch (e) { //ignored } await metamask.switchAccount(1); - await metamask.switchNetwork('local'); + await metamask.switchNetwork("local"); }); after(async function (this: TestContext) { await testPage.close(); }); - it('should have increased count', async () => { + it("should have increased count", async () => { await pause(1); const counterBefore = await getCounterNumber(contract); // click increase button - await clickElement(testPage, '.increase-button'); + await clickElement(testPage, ".increase-button"); await pause(1); // submit tx await metamask.confirmTransaction(); - await testPage.waitForSelector('#txSent'); + await testPage.waitForSelector("#txSent"); await pause(1); const counterAfter = await getCounterNumber(contract); @@ -49,6 +50,7 @@ describe('contract interactions', async function () { }); function getCounterNumber(contract): Promise { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call return contract.methods .count() .call() diff --git a/test/contract/index.ts b/test/contract/index.ts index 88990a5d..4960bb4b 100644 --- a/test/contract/index.ts +++ b/test/contract/index.ts @@ -1,20 +1,20 @@ -import * as fs from 'fs'; -import * as path from 'path'; +import * as fs from "fs"; +import * as path from "path"; -import * as solc from 'solc'; +import * as solc from "solc"; type ContractSources = Record; function buildSources(): ContractSources { const sources: ContractSources = {}; - const contractsLocation = path.join(__dirname, '.'); + const contractsLocation = path.join(__dirname, "."); const contractsFiles = fs.readdirSync(contractsLocation); contractsFiles.forEach((file) => { const contractFullPath = path.resolve(contractsLocation, file); - if (contractFullPath.endsWith('.sol')) { + if (contractFullPath.endsWith(".sol")) { sources[file] = { - content: fs.readFileSync(contractFullPath, 'utf8'), + content: fs.readFileSync(contractFullPath, "utf8"), }; } }); @@ -23,12 +23,12 @@ function buildSources(): ContractSources { } const INPUT = { - language: 'Solidity', + language: "Solidity", sources: buildSources(), settings: { outputSelection: { - '*': { - '*': ['abi', 'evm.bytecode'], + "*": { + "*": ["abi", "evm.bytecode"], }, }, }, @@ -36,5 +36,6 @@ const INPUT = { // eslint-disable-next-line @typescript-eslint/no-explicit-any export function compileContracts(): any { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access return JSON.parse(solc.compile(JSON.stringify(INPUT))).contracts; } diff --git a/test/deploy.ts b/test/deploy.ts index fc6e2f17..a5e7890f 100644 --- a/test/deploy.ts +++ b/test/deploy.ts @@ -1,12 +1,12 @@ -import fs from 'fs'; -import * as http from 'http'; -import * as path from 'path'; +import fs from "fs"; +import * as http from "http"; +import * as path from "path"; -import ganache, { Provider, Server, ServerOptions } from 'ganache'; -import handler from 'serve-handler'; -import Web3 from 'web3'; +import ganache, { Provider, Server, ServerOptions } from "ganache"; +import handler from "serve-handler"; +import Web3 from "web3"; -import { compileContracts } from './contract'; +import { compileContracts } from "./contract"; const counterContract: { address: string } | null = null; @@ -14,12 +14,14 @@ export function getCounterContract(): { address: string } | null { return counterContract; } -export async function startLocalEthereum(opts?: ServerOptions): Promise> { - console.log('Starting ganache...'); +export async function startLocalEthereum( + opts?: ServerOptions +): Promise> { + console.log("Starting ganache..."); opts = opts ?? {}; const server = ganache.server({ ...opts, logging: { quiet: true } }); await server.listen(8545); - console.log('Ganache running at http://localhost:8545'); + console.log("Ganache running at http://localhost:8545"); return server; } @@ -27,23 +29,27 @@ export async function startLocalEthereum(opts?: ServerOptions): Promise { - console.log('Deploying test contract...'); - const web3 = new Web3((provider as unknown) as Web3['currentProvider']); + console.log("Deploying test contract..."); + const web3 = new Web3(provider as unknown as Web3["currentProvider"]); + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const compiledContracts = compileContracts(); - const counterContractInfo = compiledContracts['Counter.sol']['Counter']; + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + const counterContractInfo = compiledContracts["Counter.sol"]["Counter"]; + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access const counterContractDef = new web3.eth.Contract(counterContractInfo.abi); const accounts = await web3.eth.getAccounts(); const counterContract = await counterContractDef + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access .deploy({ data: counterContractInfo.evm.bytecode.object }) .send({ from: accounts[0], gas: 4000000 }); - console.log('Contract deployed at', counterContract.options.address); + console.log("Contract deployed at", counterContract.options.address); // create file data for dapp - const dataJsPath = path.join(__dirname, 'dapp', 'data.js'); + const dataJsPath = path.join(__dirname, "dapp", "data.js"); const data = `const ContractInfo = ${JSON.stringify( { ...counterContractInfo, ...counterContract.options }, null, - 2, + 2 )}`; await new Promise((resolve) => { @@ -54,17 +60,18 @@ export async function deployContract(provider: Provider): Promise { } export async function startTestServer(): Promise { - console.log('Starting test server...'); + console.log("Starting test server..."); const server = http.createServer((request, response) => { - return handler(request, response, { - public: path.join(__dirname, 'dapp'), + void handler(request, response, { + public: path.join(__dirname, "dapp"), cleanUrls: true, }); + return; }); await new Promise((resolve) => { server.listen(8080, () => { - console.log('Server running at http://localhost:8080'); + console.log("Server running at http://localhost:8080"); resolve(); }); }); diff --git a/test/global.ts b/test/global.ts index a426b29d..5ed07f30 100644 --- a/test/global.ts +++ b/test/global.ts @@ -1,17 +1,22 @@ -import http from 'http'; -import path from 'path'; +import http from "http"; +import path from "path"; -import { Provider, Server } from 'ganache'; -import puppeteer, { Browser } from 'puppeteer'; +import { Provider, Server } from "ganache"; +import puppeteer, { Browser } from "puppeteer"; -import * as dappeteer from '../src'; -import { Dappeteer } from '../src'; +import * as dappeteer from "../src"; +import { Dappeteer } from "../src"; -import { Contract, deployContract, startLocalEthereum, startTestServer } from './deploy'; +import { + Contract, + deployContract, + startLocalEthereum, + startTestServer, +} from "./deploy"; export type InjectableContext = Readonly<{ provider: Provider; - ethereum: Server<'ethereum'>; + ethereum: Server<"ethereum">; testPageServer: http.Server; browser: Browser; metamask: Dappeteer; @@ -22,8 +27,8 @@ export type InjectableContext = Readonly<{ export type TestContext = Mocha.Context & InjectableContext; export const LOCAL_PREFUNDED_MNEMONIC = - 'pioneer casual canoe gorilla embrace width fiction bounce spy exhibit another dog'; -export const PASSWORD = 'password1234'; + "pioneer casual canoe gorilla embrace width fiction bounce spy exhibit another dog"; +export const PASSWORD = "password1234"; export const mochaHooks = { async beforeAll(this: Mocha.Context): Promise { @@ -34,7 +39,8 @@ export const mochaHooks = { }, }); const browser = await dappeteer.launch(puppeteer, { - metaMaskVersion: process.env.METAMASK_VERSION || dappeteer.RECOMMENDED_METAMASK_VERSION, + metaMaskVersion: + process.env.METAMASK_VERSION || dappeteer.RECOMMENDED_METAMASK_VERSION, }); const server = await startTestServer(); const metamask = await dappeteer.setupMetaMask(browser, { @@ -42,6 +48,7 @@ export const mochaHooks = { seed: LOCAL_PREFUNDED_MNEMONIC, password: PASSWORD, }); + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const contract = await deployContract(ethereum.provider); const context: InjectableContext = { @@ -50,6 +57,7 @@ export const mochaHooks = { browser, testPageServer: server, metamask, + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment contract, }; @@ -63,7 +71,7 @@ export const mochaHooks = { }, async afterEach(this: TestContext): Promise { - if (this.currentTest.state === 'failed') { + if (this.currentTest.state === "failed") { await this.metamask.page.screenshot({ path: path.resolve(__dirname, `../${this.currentTest.fullTitle()}.png`), fullPage: true, diff --git a/test/utils/utils.ts b/test/utils/utils.ts index 8610c01f..c903ea1f 100644 --- a/test/utils/utils.ts +++ b/test/utils/utils.ts @@ -1,10 +1,13 @@ -import { Page } from 'puppeteer'; +import { Page } from "puppeteer"; export function pause(seconds: number): Promise { return new Promise((res) => setTimeout(res, 1000 * seconds)); } -export async function clickElement(page: Page, selector: string): Promise { +export async function clickElement( + page: Page, + selector: string +): Promise { await page.bringToFront(); await page.waitForSelector(selector, { timeout: 15000 }); const element = await page.$(selector); diff --git a/yarn.lock b/yarn.lock index b20d2d78..721d03dc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,13 +2,6 @@ # yarn lockfile v1 -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/code-frame@^7.12.13": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" @@ -16,25 +9,11 @@ dependencies: "@babel/highlight" "^7.14.5" -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== - "@babel/helper-validator-identifier@^7.14.5": version "7.14.9" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== -"@babel/highlight@^7.10.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c" - integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== - dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - chalk "^2.0.0" - js-tokens "^4.0.0" - "@babel/highlight@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" @@ -44,6 +23,18 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@chainsafe/eslint-config@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@chainsafe/eslint-config/-/eslint-config-1.0.0.tgz#ba6c9c640f1b0aa6892d2b10ecf03480a2183851" + integrity sha512-fGIN3gS9FLQI8PefYxm+hgvv3831IQ6LRHlklzYjwgz9TPusPM7kfwH1qB/tcdqkqqjmuz3hnqJfMiG2x9h6nA== + dependencies: + "@typescript-eslint/eslint-plugin" "^5.30.0" + "@typescript-eslint/parser" "^5.30.0" + eslint-config-prettier "^8.5.0" + eslint-plugin-import "^2.26.0" + eslint-plugin-prettier "^4.1.0" + prettier "^2.7.1" + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -51,20 +42,19 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@eslint/eslintrc@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" - integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== +"@eslint/eslintrc@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.2.tgz#58b69582f3b7271d8fa67fe5251767a5b38ea356" + integrity sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ== dependencies: ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^12.1.0" - ignore "^4.0.6" + debug "^4.3.2" + espree "^9.4.0" + globals "^13.15.0" + ignore "^5.2.0" import-fresh "^3.2.1" - js-yaml "^3.13.1" - lodash "^4.17.20" - minimatch "^3.0.4" + js-yaml "^4.1.0" + minimatch "^3.1.2" strip-json-comments "^3.1.1" "@ethersproject/abi@5.0.7": @@ -241,6 +231,30 @@ "@ethersproject/properties" "^5.0.7" "@ethersproject/strings" "^5.0.8" +"@humanwhocodes/config-array@^0.10.5": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" + integrity sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/gitignore-to-minimatch@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" + integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@jest/environment@^27.1.1": version "27.1.1" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.1.1.tgz#a1f7a552f7008f773988b9c0e445ede35f77bbb7" @@ -313,6 +327,11 @@ "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" +"@rushstack/eslint-patch@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" + integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -416,10 +435,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@^7.0.3": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" - integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== +"@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/json5@^0.0.29": version "0.0.29" @@ -465,6 +484,13 @@ resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4" integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== +"@types/serve-handler@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@types/serve-handler/-/serve-handler-6.1.1.tgz#629dc9a62b201ab79a216e1e46e162aa4c8d1455" + integrity sha512-bIwSmD+OV8w0t2e7EWsuQYlGoS1o5aEdVktgkXaa43Zm0qVWi21xaSRb3DQA1UXD+DJ5bRq1Rgu14ZczB+CjIQ== + dependencies: + "@types/node" "*" + "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" @@ -489,75 +515,85 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.0.tgz#13a5a07cf30d0d5781e43480aa2a8d38d308b084" - integrity sha512-DJgdGZW+8CFUTz5C/dnn4ONcUm2h2T0itWD85Ob5/V27Ndie8hUoX5HKyGssvR8sUMkAIlUc/AMK67Lqa3kBIQ== - dependencies: - "@typescript-eslint/experimental-utils" "4.15.0" - "@typescript-eslint/scope-manager" "4.15.0" - debug "^4.1.1" - functional-red-black-tree "^1.0.1" - lodash "^4.17.15" - regexpp "^3.0.0" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/experimental-utils@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.0.tgz#b87c36410a9b23f637689427be85007a2ec1a9c6" - integrity sha512-V4vaDWvxA2zgesg4KPgEGiomWEBpJXvY4ZX34Y3qxK8LUm5I87L+qGIOTd9tHZOARXNRt9pLbblSKiYBlGMawg== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/scope-manager" "4.15.0" - "@typescript-eslint/types" "4.15.0" - "@typescript-eslint/typescript-estree" "4.15.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/parser@^4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.15.0.tgz#8df94365b4b7161f9e8514fe28aef19954810b6b" - integrity sha512-L6Dtbq8Bc7g2aZwnIBETpmUa9XDKCMzKVwAArnGp5Mn7PRNFjf3mUzq8UeBjL3K8t311hvevnyqXAMSmxO8Gpg== - dependencies: - "@typescript-eslint/scope-manager" "4.15.0" - "@typescript-eslint/types" "4.15.0" - "@typescript-eslint/typescript-estree" "4.15.0" - debug "^4.1.1" - -"@typescript-eslint/scope-manager@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.15.0.tgz#c42703558ea6daaaba51a9c3a86f2902dbab9432" - integrity sha512-CSNBZnCC2jEA/a+pR9Ljh8Y+5TY5qgbPz7ICEk9WCpSEgT6Pi7H2RIjxfrrbUXvotd6ta+i27sssKEH8Azm75g== - dependencies: - "@typescript-eslint/types" "4.15.0" - "@typescript-eslint/visitor-keys" "4.15.0" - -"@typescript-eslint/types@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.15.0.tgz#3011ae1ac3299bb9a5ac56bdd297cccf679d3662" - integrity sha512-su4RHkJhS+iFwyqyXHcS8EGPlUVoC+XREfy5daivjLur9JP8GhvTmDipuRpcujtGC4M+GYhUOJCPDE3rC5NJrg== +"@typescript-eslint/eslint-plugin@^5.30.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.39.0.tgz#778b2d9e7f293502c7feeea6c74dca8eb3e67511" + integrity sha512-xVfKOkBm5iWMNGKQ2fwX5GVgBuHmZBO1tCRwXmY5oAIsPscfwm2UADDuNB8ZVYCtpQvJK4xpjrK7jEhcJ0zY9A== + dependencies: + "@typescript-eslint/scope-manager" "5.39.0" + "@typescript-eslint/type-utils" "5.39.0" + "@typescript-eslint/utils" "5.39.0" + debug "^4.3.4" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.30.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.39.0.tgz#93fa0bc980a3a501e081824f6097f7ca30aaa22b" + integrity sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA== + dependencies: + "@typescript-eslint/scope-manager" "5.39.0" + "@typescript-eslint/types" "5.39.0" + "@typescript-eslint/typescript-estree" "5.39.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz#873e1465afa3d6c78d8ed2da68aed266a08008d0" + integrity sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw== + dependencies: + "@typescript-eslint/types" "5.39.0" + "@typescript-eslint/visitor-keys" "5.39.0" + +"@typescript-eslint/type-utils@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.39.0.tgz#0a8c00f95dce4335832ad2dc6bc431c14e32a0a6" + integrity sha512-KJHJkOothljQWzR3t/GunL0TPKY+fGJtnpl+pX+sJ0YiKTz3q2Zr87SGTmFqsCMFrLt5E0+o+S6eQY0FAXj9uA== + dependencies: + "@typescript-eslint/typescript-estree" "5.39.0" + "@typescript-eslint/utils" "5.39.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.39.0.tgz#f4e9f207ebb4579fd854b25c0bf64433bb5ed78d" + integrity sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw== + +"@typescript-eslint/typescript-estree@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz#c0316aa04a1a1f4f7f9498e3c13ef1d3dc4cf88b" + integrity sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA== + dependencies: + "@typescript-eslint/types" "5.39.0" + "@typescript-eslint/visitor-keys" "5.39.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.39.0.tgz#b7063cca1dcf08d1d21b0d91db491161ad0be110" + integrity sha512-+DnY5jkpOpgj+EBtYPyHRjXampJfC0yUZZzfzLuUWVZvCuKqSdJVC8UhdWipIw7VKNTfwfAPiOWzYkAwuIhiAg== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.39.0" + "@typescript-eslint/types" "5.39.0" + "@typescript-eslint/typescript-estree" "5.39.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" -"@typescript-eslint/typescript-estree@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.0.tgz#402c86a7d2111c1f7a2513022f22a38a395b7f93" - integrity sha512-jG6xTmcNbi6xzZq0SdWh7wQ9cMb2pqXaUp6bUZOMsIlu5aOlxGxgE/t6L/gPybybQGvdguajXGkZKSndZJpksA== +"@typescript-eslint/visitor-keys@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz#8f41f7d241b47257b081ddba5d3ce80deaae61e2" + integrity sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg== dependencies: - "@typescript-eslint/types" "4.15.0" - "@typescript-eslint/visitor-keys" "4.15.0" - debug "^4.1.1" - globby "^11.0.1" - is-glob "^4.0.1" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/visitor-keys@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.0.tgz#2a07768df30c8a5673f1bce406338a07fdec38ca" - integrity sha512-RnDtJwOwFucWFAMjG3ghCG/ikImFJFEg20DI7mn4pHEx3vC48lIAoyjhffvfHmErRDboUPC7p9Z2il4CLb7qxA== - dependencies: - "@typescript-eslint/types" "4.15.0" - eslint-visitor-keys "^2.0.0" + "@typescript-eslint/types" "5.39.0" + eslint-visitor-keys "^3.3.0" "@ungap/promise-all-settled@1.1.2": version "1.1.2" @@ -584,26 +620,26 @@ accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn-jsx@^5.3.1: - 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-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - acorn@^8.4.1: version "8.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +acorn@^8.8.0: + version "8.8.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -621,17 +657,7 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^7.0.2: - version "7.1.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.1.0.tgz#f982ea7933dc7f1012eae9eec5a86687d805421b" - integrity sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-colors@4.1.1, ansi-colors@^4.1.1: +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== @@ -688,13 +714,6 @@ arg@^4.1.0: 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" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -710,30 +729,31 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= -array-includes@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" - integrity sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw== +array-includes@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - get-intrinsic "^1.0.1" - is-string "^1.0.5" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + get-intrinsic "^1.1.1" + is-string "^1.0.7" array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.flat@^1.2.3: - 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== +array.prototype.flat@^1.2.5: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" asn1.js@^5.2.0: version "5.4.1" @@ -762,11 +782,6 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" @@ -1257,11 +1272,6 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" @@ -1418,20 +1428,27 @@ debug@2.6.9, debug@^2.2.0, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.1: +debug@4, debug@^4.1.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" -debug@4.3.4: +debug@4.3.4, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1462,9 +1479,9 @@ deep-eql@^3.0.1: type-detect "^4.0.0" deep-is@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== defer-to-connect@^1.0.1: version "1.1.3" @@ -1478,6 +1495,14 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" +define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -1532,13 +1557,12 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" - isarray "^1.0.0" doctrine@^3.0.0: version "3.0.0" @@ -1605,20 +1629,6 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -enquirer@^2.3.5: - 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" - -error-ex@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - es-abstract@^1.18.0-next.1: version "1.18.0-next.2" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" @@ -1639,6 +1649,43 @@ es-abstract@^1.18.0-next.1: string.prototype.trimend "^1.0.3" string.prototype.trimstart "^1.0.3" +es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: + version "1.20.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.3.tgz#90b143ff7aedc8b3d189bcfac7f1e3e3f81e9da1" + integrity sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.6" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.2" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -1684,7 +1731,7 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@4.0.0: +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== @@ -1699,54 +1746,53 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -eslint-config-prettier@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz#f4a4bd2832e810e8cc7c1411ec85b3e85c0c53f9" - integrity sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg== +eslint-config-prettier@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== -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== +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== dependencies: - debug "^2.6.9" - resolve "^1.13.1" + debug "^3.2.7" + resolve "^1.20.0" -eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== +eslint-module-utils@^2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== dependencies: - debug "^2.6.9" - pkg-dir "^2.0.0" + debug "^3.2.7" -eslint-plugin-import@^2.22.1: - 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== +eslint-plugin-import@^2.26.0: + version "2.26.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.4" - eslint-module-utils "^2.6.0" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.3" has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" - -eslint-plugin-prettier@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz#7079cfa2497078905011e6f82e8dd8453d1371b7" - integrity sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ== + is-core-module "^2.8.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.5" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-prettier@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== dependencies: prettier-linter-helpers "^1.0.0" -eslint-scope@^5.0.0, eslint-scope@^5.1.1: +eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -1754,79 +1800,84 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^2.0.0, eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== dependencies: - eslint-visitor-keys "^1.1.0" + esrecurse "^4.3.0" + estraverse "^5.2.0" -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" eslint-visitor-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@^7.20.0: - version "7.20.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.20.0.tgz#db07c4ca4eda2e2316e7aa57ac7fc91ec550bdc7" - integrity sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.3.0" +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.24.0: + version "8.24.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.24.0.tgz#489516c927a5da11b3979dbfb2679394523383c8" + integrity sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ== + dependencies: + "@eslint/eslintrc" "^1.3.2" + "@humanwhocodes/config-array" "^0.10.5" + "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" + "@humanwhocodes/module-importer" "^1.0.1" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" + debug "^4.3.2" doctrine "^3.0.0" - enquirer "^2.3.5" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^6.0.0" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.1" + globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.20" - minimatch "^3.0.4" + lodash.merge "^4.6.2" + minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" + regexpp "^3.2.0" + strip-ansi "^6.0.1" strip-json-comments "^3.1.0" - table "^6.0.4" text-table "^0.2.0" - v8-compile-cache "^2.0.3" -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== +espree@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" + integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" esquery@^1.4.0: version "1.4.0" @@ -1847,7 +1898,12 @@ estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +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== @@ -2056,7 +2112,7 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -2066,17 +2122,16 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.1.1: - version "3.2.5" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" - integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== +fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" + glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" + micromatch "^4.0.4" fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -2086,7 +2141,7 @@ fast-json-stable-stringify@^2.0.0: fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-url-parser@1.1.3: version "1.1.3" @@ -2109,10 +2164,10 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" -file-entry-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" - integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" @@ -2141,7 +2196,7 @@ finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -find-up@5.0.0: +find-up@5.0.0, find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== @@ -2149,7 +2204,7 @@ find-up@5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -2178,9 +2233,9 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" - integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== foreach@^2.0.5: version "2.0.5" @@ -2258,10 +2313,20 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== ganache@^7.4.3: version "7.4.3" @@ -2295,7 +2360,7 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= -get-intrinsic@^1.0.1, get-intrinsic@^1.0.2: +get-intrinsic@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== @@ -2304,6 +2369,15 @@ get-intrinsic@^1.0.1, get-intrinsic@^1.0.2: has "^1.0.3" has-symbols "^1.0.1" +get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -2323,6 +2397,14 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -2330,20 +2412,20 @@ getpass@^0.1.1: dependencies: assert-plus "^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== - dependencies: - is-glob "^4.0.1" - -glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: 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" +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob@7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" @@ -2376,23 +2458,23 @@ global@~4.4.0: min-document "^2.19.0" process "^0.11.10" -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== +globals@^13.15.0: + version "13.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== dependencies: - type-fest "^0.8.1" + type-fest "^0.20.2" -globby@^11.0.1: - version "11.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" - integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" slash "^3.0.0" got@9.6.0: @@ -2442,6 +2524,11 @@ graceful-fs@^4.2.4: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -2455,6 +2542,11 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2465,6 +2557,13 @@ 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-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + has-symbol-support-x@^1.4.1: version "1.4.2" resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" @@ -2475,6 +2574,11 @@ has-symbols@^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.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + has-to-string-tag-x@^1.2.0: version "1.4.1" resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" @@ -2482,6 +2586,13 @@ has-to-string-tag-x@^1.2.0: dependencies: has-symbol-support-x "^1.4.1" +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -2520,11 +2631,6 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -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== - http-cache-semantics@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" @@ -2593,15 +2699,10 @@ ieee754@^1.1.13, ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^4.0.6: - version "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== +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" @@ -2614,7 +2715,7 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" @@ -2634,6 +2735,15 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +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: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + invert-kv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" @@ -2651,10 +2761,12 @@ is-arguments@^1.0.4: dependencies: call-bind "^1.0.0" -is-arrayish@^0.2.1: - version "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.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" is-binary-path@~2.1.0: version "2.1.0" @@ -2663,6 +2775,14 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-buffer@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" @@ -2673,6 +2793,11 @@ is-callable@^1.1.4, is-callable@^1.2.2: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== +is-callable@^1.2.6: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-ci@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994" @@ -2680,10 +2805,10 @@ is-ci@^3.0.0: dependencies: ci-info "^3.1.1" -is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== +is-core-module@^2.8.1, is-core-module@^2.9.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== dependencies: has "^1.0.3" @@ -2724,7 +2849,14 @@ is-generator-function@^1.0.7: resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.8.tgz#dfb5c2b120e02b0a8d9d2c6806cd5621aa922f7b" integrity sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ== -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -2741,6 +2873,18 @@ is-negative-zero@^2.0.1: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -2769,11 +2913,26 @@ is-regex@^1.1.1: call-bind "^1.0.2" has-symbols "^1.0.1" +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-retry-allowed@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -2784,6 +2943,13 @@ is-string@^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-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + is-symbol@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" @@ -2791,6 +2957,13 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.1" +is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + is-typed-array@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.4.tgz#1f66f34a283a3c94a4335434661ca53fff801120" @@ -2812,10 +2985,12 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -isarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" isexe@^2.0.0: version "2.0.0" @@ -2882,6 +3057,11 @@ jest-util@^27.1.1: is-ci "^3.0.0" picomatch "^2.2.3" +js-sdsl@^4.1.4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.5.tgz#1ff1645e6b4d1b028cd3f862db88c9d887f26e2a" + integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q== + js-sha3@0.5.7, js-sha3@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" @@ -2897,21 +3077,13 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@4.1.0: +js-yaml@4.1.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" -js-yaml@^3.13.1: - 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" - jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -2927,11 +3099,6 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -2940,7 +3107,7 @@ json-schema@0.2.3: json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stringify-safe@~5.0.1: version "5.0.1" @@ -3055,16 +3222,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -3087,10 +3244,10 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash@^4.17.15, lodash@^4.17.20: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +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== log-symbols@4.1.0: version "4.1.0" @@ -3162,7 +3319,7 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge2@^1.3.0: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -3172,14 +3329,6 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" - micromatch@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" @@ -3266,11 +3415,23 @@ minimatch@5.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" @@ -3358,7 +3519,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3: +ms@2.1.3, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -3426,7 +3587,7 @@ napi-macros@~2.0.0: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@0.6.2: version "0.6.2" @@ -3475,16 +3636,6 @@ node-stream-zip@^1.13.0: resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.13.0.tgz#1cfc716137a5673e6362d2d08e99be810c8ba95f" integrity sha512-dqOt0Zaex6I9PUd/yfh9G0GqjZuky2kkxQaxH4yylH0y3hdg4r9BfeH2SChwQslR+YOd6l7mU14ZJiVI6BbJ4A== -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -3525,6 +3676,11 @@ object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= +object-inspect@^1.12.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + object-inspect@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" @@ -3545,15 +3701,24 @@ object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.values@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" - integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" + es-abstract "^1.19.1" oboe@2.1.5: version "2.1.5" @@ -3709,13 +3874,6 @@ parse-headers@^2.0.0: resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -3751,10 +3909,10 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" @@ -3766,13 +3924,6 @@ path-to-regexp@2.2.1: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -3804,7 +3955,7 @@ 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.0.5, picomatch@^2.2.1: +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== @@ -3814,11 +3965,6 @@ picomatch@^2.2.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - pkg-dir@4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -3826,13 +3972,6 @@ pkg-dir@4.2.0: dependencies: find-up "^4.0.0" -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -3860,6 +3999,11 @@ prettier@^2.2.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== +prettier@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + pretty-format@^27.1.1: version "27.1.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.1.1.tgz#cbaf9ec6cd7cfc3141478b6f6293c0ccdbe968e0" @@ -3875,7 +4019,7 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@2.0.3, progress@^2.0.0: +progress@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -4020,23 +4164,6 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -4053,10 +4180,19 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -regexpp@^3.0.0, regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== request@^2.79.0: version "2.88.2" @@ -4089,7 +4225,7 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-from-string@^2.0.0, require-from-string@^2.0.2: +require-from-string@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -4104,13 +4240,14 @@ 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@^1.10.0, resolve@^1.13.1, resolve@^1.17.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== +resolve@^1.20.0, resolve@^1.22.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" responselike@^1.0.2: version "1.0.2" @@ -4170,6 +4307,15 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -4198,15 +4344,15 @@ secp256k1@^4.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -"semver@2 || 3 || 4 || 5", semver@^5.5.0: +semver@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^7.2.1, semver@^7.3.2: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== +semver@^7.3.7: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" @@ -4318,6 +4464,15 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + signal-exit@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -4342,15 +4497,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - solc@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/solc/-/solc-0.5.2.tgz#45d5d11569e41c2b2535f3a50fe0616ca771a347" @@ -4365,37 +4511,6 @@ solc@0.5.2: tmp "0.0.33" yargs "^11.0.0" -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - 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== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - sshpk@^1.7.0: version "1.16.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" @@ -4471,6 +4586,15 @@ string.prototype.trimend@^1.0.3: call-bind "^1.0.0" define-properties "^1.1.3" +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + string.prototype.trimstart@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" @@ -4479,6 +4603,15 @@ string.prototype.trimstart@^1.0.3: call-bind "^1.0.0" define-properties "^1.1.3" +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -4557,6 +4690,11 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + swarm-js@^0.1.40: version "0.1.40" resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" @@ -4574,16 +4712,6 @@ swarm-js@^0.1.40: tar "^4.0.2" xhr-request "^1.0.1" -table@^6.0.4: - version "6.0.7" - resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" - integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== - dependencies: - ajv "^7.0.2" - lodash "^4.17.20" - slice-ansi "^4.0.0" - string-width "^4.2.0" - tar-fs@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" @@ -4621,7 +4749,7 @@ tar@^4.0.2: text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== through@^2.3.8: version "2.3.8" @@ -4689,14 +4817,14 @@ ts-node@10.8.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.1" - minimist "^1.2.0" + minimist "^1.2.6" strip-bom "^3.0.0" tslib@^1.8.1: @@ -4704,10 +4832,10 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tsutils@^3.17.1: - version "3.20.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.20.0.tgz#ea03ea45462e146b53d70ce0893de453ff24f698" - integrity sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg== +tsutils@^3.21.0: + 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" @@ -4735,10 +4863,10 @@ type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -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== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" @@ -4775,6 +4903,16 @@ ultron@~1.1.0: resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + unbzip2-stream@1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" @@ -4885,19 +5023,6 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== -v8-compile-cache@^2.0.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" - integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - varint@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" @@ -5182,6 +5307,17 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +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"