From df7910ac9ec430ff7e5dbfe100afd1ffcedf1ba3 Mon Sep 17 00:00:00 2001 From: siriwatknp Date: Mon, 27 Dec 2021 11:21:50 +0700 Subject: [PATCH] setup e2e-website tests --- .circleci/config.yml | 31 ++ netlify/functions/deploy-succeeded.js | 43 +++ package.json | 3 + test/e2e-website/README.md | 12 + test/e2e-website/data-grid-current.spec.ts | 137 +++++++++ test/e2e-website/data-grid-new.spec.ts | 146 ++++++++++ test/e2e-website/playwright.config.ts | 15 + yarn.lock | 319 ++++++++++++++++++++- 8 files changed, 700 insertions(+), 6 deletions(-) create mode 100644 netlify/functions/deploy-succeeded.js create mode 100644 test/e2e-website/README.md create mode 100644 test/e2e-website/data-grid-current.spec.ts create mode 100644 test/e2e-website/data-grid-new.spec.ts create mode 100644 test/e2e-website/playwright.config.ts diff --git a/.circleci/config.yml b/.circleci/config.yml index 21ab4911c512b..04f142f87c4f1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,6 +9,10 @@ parameters: description: The dist-tag of react to be used type: string default: stable + e2e-base-url: + description: The base url for running end-to-end test + type: string + default: '' defaults: &defaults parameters: @@ -16,6 +20,10 @@ defaults: &defaults description: The dist-tag of react to be used type: string default: << pipeline.parameters.react-dist-tag >> + e2e-base-url: + description: The base url for running end-to-end test + type: string + default: << pipeline.parameters.e2e-base-url >> environment: # Keep in sync with "Save playwright cache" PLAYWRIGHT_BROWSERS_PATH: /tmp/pw-browsers @@ -202,6 +210,21 @@ jobs: - run: name: Run e2e tests command: yarn test:e2e + test_e2e_website: + <<: *defaults + docker: + - image: mcr.microsoft.com/playwright@sha256:f08e263c95e83334104e6e2fee047ad92062a03af6ae94c0f8686ba2b3014823 + environment: + NODE_ENV: development # Needed if playwright is in `devDependencies` + steps: + - checkout + - install_js: + browsers: true + - run: + name: yarn test:e2e-website + command: yarn test:e2e-website + environment: + PLAYWRIGHT_TEST_BASE_URL: << parameters.e2e-base-url >> test_regressions: <<: *defaults docker: @@ -241,3 +264,11 @@ workflows: - test_regressions: requires: - checkout + e2e-website: + when: + equal: [e2e-website, << pipeline.parameters.workflow >>] + jobs: + - checkout + - test_e2e_website: + requires: + - checkout diff --git a/netlify/functions/deploy-succeeded.js b/netlify/functions/deploy-succeeded.js new file mode 100644 index 0000000000000..d59ce476da813 --- /dev/null +++ b/netlify/functions/deploy-succeeded.js @@ -0,0 +1,43 @@ +const fetch = require('node-fetch'); + +/** + * @param {object} event + * @param {string} event.body - https://jsoneditoronline.org/#left=cloud.fb1a4fa30a4f475fa6887071c682e2c1 + */ +exports.handler = async (event) => { + const { payload } = JSON.parse(event.body); + const repo = payload.review_url.match(/github\.com\/(.*)\/pull\/(.*)/); + if (!repo) { + throw new Error(`No repo found at review_url: ${payload.review_url}`); + } + + // eslint-disable-next-line no-console + console.info(`repo:`, repo[1]); + // eslint-disable-next-line no-console + console.info(`PR:`, repo[2]); + // eslint-disable-next-line no-console + console.info(`url:`, payload.deploy_ssl_url); + + // for more details > https://circleci.com/docs/2.0/api-developers-guide/# + await fetch(`https://circleci.com/api/v2/project/gh/${repo[1]}/pipeline`, { + method: 'POST', + headers: { + 'Content-type': 'application/json', + // token from https://app.netlify.com/sites/material-ui/settings/deploys#environment-variables + 'Circle-Token': process.env.CIRCLE_CI_TOKEN, + }, + body: JSON.stringify({ + // For PR, /head is needed. https://support.circleci.com/hc/en-us/articles/360049841151 + branch: `pull/${repo[2]}/head`, + parameters: { + // the parameters defined in .circleci/config.yml + workflow: 'e2e-website', // name of the workflow + 'e2e-base-url': payload.deploy_ssl_url, // deploy preview url + }, + }), + }); + return { + statusCode: 200, + body: {}, + }; +}; diff --git a/package.json b/package.json index f6be1cdeb9605..5dac8ae8d4589 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,8 @@ "test:e2e:dev": "concurrently \"yarn test:e2e:build --watch\" \"yarn test:e2e:server\"", "test:e2e:run": "mocha --config test/e2e/.mocharc.js 'test/e2e/**/*.test.{js,ts,tsx}'", "test:e2e:server": "serve test/e2e -p 5001", + "test:e2e-website": "playwright test test/e2e-website --config test/e2e-website/playwright.config.ts", + "test:e2e-website:dev": "PLAYWRIGHT_TEST_BASE_URL=http://localhost:3001 playwright test test/e2e-website --config test/e2e-website/playwright.config.ts", "test:regressions": "cross-env NODE_ENV=production yarn test:regressions:build && concurrently --success first --kill-others \"yarn test:regressions:run\" \"yarn test:regressions:server\"", "test:regressions:build": "webpack --config test/regressions/webpack.config.js", "test:regressions:dev": "concurrently \"yarn test:regressions:build --watch\" \"yarn test:regressions:server\"", @@ -71,6 +73,7 @@ "@mui/material": "^5.2.5", "@mui/styles": "^5.2.3", "@mui/utils": "^5.2.3", + "@playwright/test": "1.17.1", "@rollup/plugin-babel": "^5.3.0", "@rollup/plugin-node-resolve": "^13.1.1", "@rollup/plugin-replace": "^3.0.0", diff --git a/test/e2e-website/README.md b/test/e2e-website/README.md new file mode 100644 index 0000000000000..951cccebdb14b --- /dev/null +++ b/test/e2e-website/README.md @@ -0,0 +1,12 @@ +# Docs end-to-end testing + +## Running locally + +1. Run `yarn docs:dev` to start docs in development server. +2. Run `yarn test:e2e-website` in a separate terminal to run the test suites (`*.spec.ts`) inside `test/e2e-website` folder. + +> use --headed to run tests in headed browsers, check out [Playwright CLI](https://playwright.dev/docs/intro#command-line) for more options + +## CI + +After netlify deploy the preview site, the `netlify/functions/deploy-succeeded.js` hook calls CircleCI API to run the `e2e-website` workflow against the deployed url. diff --git a/test/e2e-website/data-grid-current.spec.ts b/test/e2e-website/data-grid-current.spec.ts new file mode 100644 index 0000000000000..a96a5af3bda5b --- /dev/null +++ b/test/e2e-website/data-grid-current.spec.ts @@ -0,0 +1,137 @@ +import { test as base, expect, Page } from '@playwright/test'; +import kebabCase from 'lodash/kebabCase'; +import { TestFixture } from './playwright.config'; + +const test = base.extend({}); + +test.describe.parallel('Material docs', () => { + test('should have correct link with hash in the TOC', async ({ page }) => { + await page.goto(`/components/data-grid/getting-started/`); + + const anchors = page.locator('[aria-label="Page table of contents"] ul a'); + + const anchorTexts = await anchors.allTextContents(); + + await Promise.all( + anchorTexts.map((text, index) => { + return expect(anchors.nth(index)).toHaveAttribute( + 'href', + // This is fine for now even though the hash implementation (in textToHash.js) is not the same as kebabCase + `/components/data-grid/getting-started/#${kebabCase(text.toLowerCase())}`, + ); + }), + ); + }); + + test.describe.parallel('Demo page', () => { + test('should have correct link for API section', async ({ page }) => { + await page.goto(`/components/data-grid/`); + + const anchors = await page.locator('div > h2#heading-api ~ ul a'); + + const anchorTexts = await anchors.allTextContents(); + + await Promise.all( + anchorTexts.map((text, index) => { + return expect(anchors.nth(index)).toHaveAttribute( + 'href', + `/api/data-grid/${kebabCase(text)}/`, + ); + }), + ); + }); + + test('should have correct link for sidebar anchor', async ({ page }) => { + await page.goto(`/components/data-grid/`); + + const anchor = await page.locator('nav[aria-label="documentation"] ul a:text-is("Overview")'); + + await expect(anchor).toHaveAttribute('href', `/components/data-grid/`); + }); + }); + + test.describe.parallel('API page', () => { + test('should have correct link for sidebar anchor', async ({ page }) => { + await page.goto(`/api/data-grid/data-grid/`); + + const anchor = await page.locator('nav[aria-label="documentation"] ul a:text-is("DataGrid")'); + + await expect(anchor).toHaveAttribute('app-drawer-active', ''); + await expect(anchor).toHaveAttribute('href', `/api/data-grid/data-grid/`); + }); + + test('all the links in the main content should have correct prefix', async ({ page }) => { + await page.goto(`/api/data-grid/data-grid/`); + + const anchors = await page.locator('div#main-content a'); + + const handles = await anchors.elementHandles(); + + const links = await Promise.all(handles.map((elm) => elm.getAttribute('href'))); + + links.forEach((link) => { + expect(link?.startsWith('/x/data-grid')).toBeFalsy(); + }); + }); + }); + + test.describe.parallel('Search', () => { + const retryToggleSearch = async (page: Page, count = 3) => { + try { + await page.keyboard.press('Meta+k'); + await page.waitForSelector('input#docsearch-input', { timeout: 2000 }); + } catch (error) { + if (count === 0) { + throw error; + } + await retryToggleSearch(page, count - 1); + } + }; + test('should have correct link when searching component', async ({ page }) => { + await page.goto(`/components/data-grid/getting-started/`, { waitUntil: 'networkidle' }); + + await retryToggleSearch(page); + + await page.type('input#docsearch-input', 'datagrid', { delay: 50 }); + + const anchor = await page.locator('.DocSearch-Hits a:has-text("Data Grid - Components")'); + + await expect(anchor.first()).toHaveAttribute( + 'href', + `/components/data-grid/components/#main-content`, + ); + }); + + test('should have correct link when searching API', async ({ page }) => { + await page.goto(`/components/data-grid/getting-started/`, { waitUntil: 'networkidle' }); + + await retryToggleSearch(page); + + await page.type('input#docsearch-input', 'datagrid api', { delay: 50 }); + + const anchor = await page.locator('.DocSearch-Hits a:has-text("DataGrid API")'); + + await expect(anchor.first()).toHaveAttribute( + 'href', + `/api/data-grid/data-grid/#main-content`, + ); + }); + + test('should have correct link when searching pro API', async ({ page }) => { + await page.goto(`/components/data-grid/getting-started/`); + + await page.waitForLoadState('networkidle'); // wait for docsearch + + await retryToggleSearch(page); + + await page.type('input#docsearch-input', 'datagridpro api', { delay: 50 }); + + const anchor = await page.locator('.DocSearch-Hits a:has-text("DataGridPro API")'); + + await expect(anchor.first()).toHaveAttribute( + 'href', + `/api/data-grid/data-grid-pro/#main-content`, + ); + }); + }); +}); diff --git a/test/e2e-website/data-grid-new.spec.ts b/test/e2e-website/data-grid-new.spec.ts new file mode 100644 index 0000000000000..8728c4fc3a70c --- /dev/null +++ b/test/e2e-website/data-grid-new.spec.ts @@ -0,0 +1,146 @@ +import { test as base, expect, Page } from '@playwright/test'; +import kebabCase from 'lodash/kebabCase'; +import FEATURE_TOGGLE from 'docs/src/featureToggle'; +import { TestFixture } from './playwright.config'; + +const test = base.extend({}); + +test.beforeEach(async ({}) => { + test.skip(!FEATURE_TOGGLE.enable_product_scope, "Migration haven't started yet"); +}); + +test.describe.parallel('Material docs', () => { + test('should have correct link with hash in the TOC', async ({ page }) => { + await page.goto(`/x/react-data-grid/getting-started/`); + + const anchors = page.locator('[aria-label="Page table of contents"] ul a'); + + const anchorTexts = await anchors.allTextContents(); + + await Promise.all( + anchorTexts.map((text, index) => { + return expect(anchors.nth(index)).toHaveAttribute( + 'href', + `/x/react-data-grid/getting-started/#${kebabCase(text.toLowerCase())}`, + ); + }), + ); + }); + + test.describe.parallel('Demo page', () => { + test('should have correct link for API section', async ({ page }) => { + await page.goto(`/x/react-data-grid/`); + + const anchors = await page.locator('div > h2#heading-api ~ ul a'); + + const anchorTexts = await anchors.allTextContents(); + + await Promise.all( + anchorTexts.map((text, index) => { + return expect(anchors.nth(index)).toHaveAttribute( + 'href', + `/x/react-data-grid/${kebabCase(text)}/`, + ); + }), + ); + }); + + test('should have correct link for sidebar anchor', async ({ page }) => { + await page.goto(`/x/react-data-grid/`); + + const anchor = await page.locator('nav[aria-label="documentation"] ul a:text-is("Overview")'); + + await expect(anchor).toHaveAttribute('href', `/x/react-data-grid/`); + }); + }); + + test.describe.parallel('API page', () => { + test('should have correct link for sidebar anchor', async ({ page }) => { + await page.goto(`/x/api/mui-data-grid/data-grid/`); + + const anchor = await page.locator('nav[aria-label="documentation"] ul a:text-is("DataGrid")'); + + await expect(anchor).toHaveAttribute('app-drawer-active', ''); + await expect(anchor).toHaveAttribute('href', `/x/api/mui-data-grid/data-grid/`); + }); + + test('all the links in the main content should have correct prefix', async ({ page }) => { + await page.goto(`/x/api/mui-data-grid/data-grid/`); + + const anchors = await page.locator('div#main-content a'); + + const handles = await anchors.elementHandles(); + + const links = await Promise.all(handles.map((elm) => elm.getAttribute('href'))); + + links.forEach((link) => { + if (link?.startsWith('/x/api/')) { + expect(link).toMatch(/\/x\/api\/mui-(data-grid|data-grid-pro)\/.*/); + } + + expect(link).not.toMatch(/\/components/); // there should be no `/components` in the url anymore + }); + }); + }); + + test.describe.parallel('Search', () => { + const retryToggleSearch = async (page: Page, count = 3) => { + try { + await page.keyboard.press('Meta+k'); + await page.waitForSelector('input#docsearch-input', { timeout: 2000 }); + } catch (error) { + if (count === 0) { + throw error; + } + await retryToggleSearch(page, count - 1); + } + }; + test('should have correct link when searching component', async ({ page }) => { + await page.goto(`/x/react-data-grid/getting-started/`); + + await page.waitForLoadState('networkidle'); // wait for docsearch + + await retryToggleSearch(page); + + await page.type('input#docsearch-input', 'datagrid', { delay: 50 }); + + const anchor = await page.locator('.DocSearch-Hits a:has-text("Data Grid - Components")'); + + await expect(anchor.first()).toHaveAttribute('href', `/x/react-data-grid/#main-content`); + }); + + test('should have correct link when searching API', async ({ page }) => { + await page.goto(`/x/react-data-grid/getting-started/`); + + await page.waitForLoadState('networkidle'); // wait for docsearch + + await retryToggleSearch(page); + + await page.type('input#docsearch-input', 'datagrid api', { delay: 50 }); + + const anchor = await page.locator('.DocSearch-Hits a:has-text("DataGrid API")'); + + await expect(anchor.first()).toHaveAttribute( + 'href', + `/x/api/mui-data-grid/data-grid/#main-content`, + ); + }); + + test('should have correct link when searching pro API', async ({ page }) => { + await page.goto(`/x/react-data-grid/getting-started/`); + + await page.waitForLoadState('networkidle'); // wait for docsearch + + await retryToggleSearch(page); + + await page.type('input#docsearch-input', 'datagridpro api', { delay: 50 }); + + const anchor = await page.locator('.DocSearch-Hits a:has-text("DataGridPro API")'); + + await expect(anchor.first()).toHaveAttribute( + 'href', + `/x/api/mui-data-grid/data-grid-pro/#main-content`, + ); + }); + }); +}); diff --git a/test/e2e-website/playwright.config.ts b/test/e2e-website/playwright.config.ts new file mode 100644 index 0000000000000..817b0d5975a5e --- /dev/null +++ b/test/e2e-website/playwright.config.ts @@ -0,0 +1,15 @@ +import { PlaywrightTestConfig } from '@playwright/test'; + +export type TestFixture = {}; + +const config: PlaywrightTestConfig = { + reportSlowTests: { + max: 1, + threshold: 60 * 1000, // 1min + }, + use: { + baseURL: process.env.PLAYWRIGHT_TEST_BASE_URL || 'https://mui.com', + }, +}; + +export default config; diff --git a/yarn.lock b/yarn.lock index 95bfb1a31885c..af2f75cee5e6f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -139,7 +139,7 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== @@ -173,7 +173,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.10", "@babel/core@^7.16.5", "@babel/core@^7.7.5": +"@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.10", "@babel/core@^7.14.8", "@babel/core@^7.16.5", "@babel/core@^7.7.5": version "7.16.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.5.tgz#924aa9e1ae56e1e55f7184c8bf073a50d8677f5c" integrity sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ== @@ -240,6 +240,19 @@ "@babel/helper-replace-supers" "^7.16.0" "@babel/helper-split-export-declaration" "^7.16.0" +"@babel/helper-create-class-features-plugin@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.5.tgz#5d1bcd096792c1ebec6249eebc6358eec55d0cad" + integrity sha512-NEohnYA7mkB8L5JhU7BLwcBdU3j83IziR9aseMueWGeAjblbul3zzb8UvJ3a1zuBiqCMObzCJHFqKIQE6hTVmg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-environment-visitor" "^7.16.5" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-member-expression-to-functions" "^7.16.5" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.5" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/helper-create-regexp-features-plugin@^7.12.13": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" @@ -320,6 +333,13 @@ dependencies: "@babel/types" "^7.16.0" +"@babel/helper-member-expression-to-functions@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz#1bc9f7e87354e86f8879c67b316cb03d3dc2caab" + integrity sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12", "@babel/helper-module-imports@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" @@ -377,6 +397,17 @@ "@babel/traverse" "^7.16.0" "@babel/types" "^7.16.0" +"@babel/helper-replace-supers@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz#96d3988bd0ab0a2d22c88c6198c3d3234ca25326" + integrity sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ== + dependencies: + "@babel/helper-environment-visitor" "^7.16.5" + "@babel/helper-member-expression-to-functions" "^7.16.5" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/traverse" "^7.16.5" + "@babel/types" "^7.16.0" + "@babel/helper-simple-access@^7.12.13", "@babel/helper-simple-access@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" @@ -391,6 +422,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-split-export-declaration@^7.12.13", "@babel/helper-split-export-declaration@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" @@ -479,6 +517,14 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-proposal-class-properties@^7.14.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.5.tgz#3269f44b89122110f6339806e05d43d84106468a" + integrity sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.5" + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-proposal-decorators@^7.12.12": version "7.13.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.5.tgz#d28071457a5ba8ee1394b23e38d5dcf32ea20ef7" @@ -496,6 +542,14 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-dynamic-import" "^7.8.3" +"@babel/plugin-proposal-dynamic-import@^7.14.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.5.tgz#2e0d19d5702db4dcb9bc846200ca02f2e9d60e9e" + integrity sha512-P05/SJZTTvHz79LNYTF8ff5xXge0kk5sIIWAypcWgX4BTRUgyHc8wRxJ/Hk+mU0KXldgOOslKaeqnhthcDJCJQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-export-default-from@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.12.1.tgz#c6e62d668a8abcfe0d28b82f560395fecb611c5a" @@ -512,6 +566,14 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" +"@babel/plugin-proposal-export-namespace-from@^7.14.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.5.tgz#3b4dd28378d1da2fea33e97b9f25d1c2f5bf1ac9" + integrity sha512-i+sltzEShH1vsVydvNaTRsgvq2vZsfyrd7K7vPLUU/KgS0D5yZMe6uipM0+izminnkKrEfdUnz7CxMRb6oHZWw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-proposal-json-strings@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" @@ -528,6 +590,14 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" +"@babel/plugin-proposal-logical-assignment-operators@^7.14.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.5.tgz#df1f2e4b5a0ec07abf061d2c18e53abc237d3ef5" + integrity sha512-xqibl7ISO2vjuQM+MzR3rkd0zfNWltk7n9QhaD8ghMmMceVguYrNDt7MikRyj4J4v3QehpnrU8RYLnC7z/gZLA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" @@ -536,6 +606,14 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.5.tgz#652555bfeeeee2d2104058c6225dc6f75e2d0f07" + integrity sha512-YwMsTp/oOviSBhrjwi0vzCUycseCYwoXnLiXIL3YNjHSMBHicGTz7GjVU/IGgz4DtOEXBdCNG72pvCX22ehfqg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" @@ -544,6 +622,14 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-numeric-separator" "^7.10.4" +"@babel/plugin-proposal-numeric-separator@^7.14.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.5.tgz#edcb6379b6cf4570be64c45965d8da7a2debf039" + integrity sha512-DvB9l/TcsCRvsIV9v4jxR/jVP45cslTVC0PMVHvaJhhNuhn2Y1SOhCSFlPK777qLB5wb8rVDaNoqMTyOqtY5Iw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-object-rest-spread@7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" @@ -581,6 +667,15 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-syntax-optional-chaining" "^7.8.3" +"@babel/plugin-proposal-optional-chaining@^7.14.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.5.tgz#a5fa61056194d5059366c0009cb9a9e66ed75c1f" + integrity sha512-kzdHgnaXRonttiTfKYnSVafbWngPPr2qKw9BWYBESl91W54e+9R5pP70LtWxV56g0f05f/SQrwHYkfvbwcdQ/A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" @@ -589,6 +684,24 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-proposal-private-methods@^7.14.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.5.tgz#2086f7d78c1b0c712d49b5c3fbc2d1ca21a7ee12" + integrity sha512-+yFMO4BGT3sgzXo+lrq7orX5mAZt57DwUK6seqII6AcJnJOIhBJ8pzKH47/ql/d426uQ7YhN8DpUFirQzqYSUA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.5" + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-proposal-private-property-in-object@^7.14.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.5.tgz#a42d4b56005db3d405b12841309dbca647e7a21b" + integrity sha512-+YGh5Wbw0NH3y/E5YMu6ci5qTDmAEVNoZ3I54aB6nVEOZ5BQ7QJlwKq5pYVucQilMByGn/bvX0af+uNaPRCabA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-create-class-features-plugin" "^7.16.5" + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" @@ -709,6 +822,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-top-level-await@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" @@ -859,6 +979,16 @@ "@babel/helper-simple-access" "^7.12.13" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-commonjs@^7.14.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.5.tgz#4ee03b089536f076b2773196529d27c32b9d7bde" + integrity sha512-ABhUkxvoQyqhCWyb8xXtfwqNMJD7tx+irIRnUh6lmyFud7Jln1WzONXKlax1fg/ey178EXbs4bSGNd6PngO+SQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.5" + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/helper-simple-access" "^7.16.0" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-systemjs@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" @@ -1153,7 +1283,7 @@ "@babel/plugin-transform-react-jsx-development" "^7.12.17" "@babel/plugin-transform-react-pure-annotations" "^7.12.1" -"@babel/preset-typescript@^7.12.7", "@babel/preset-typescript@^7.16.5": +"@babel/preset-typescript@^7.12.7", "@babel/preset-typescript@^7.14.5", "@babel/preset-typescript@^7.16.5": version "7.16.5" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.5.tgz#b86a5b0ae739ba741347d2f58c52f52e63cf1ba1" integrity sha512-lmAWRoJ9iOSvs3DqOndQpj8XqXkzaiQs50VG/zESiI9D3eoZhGriU675xNCr0UwvsuXrhMAGvyk1w+EVWF3u8Q== @@ -1613,6 +1743,17 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@jest/types@^27.2.5", "@jest/types@^27.4.2": + version "27.4.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.4.2.tgz#96536ebd34da6392c2b7c7737d693885b5dd44a5" + integrity sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + "@lerna/add@4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@lerna/add/-/add-4.0.0.tgz#c36f57d132502a57b9e7058d1548b7a565ef183f" @@ -2836,6 +2977,47 @@ dependencies: "@octokit/openapi-types" "^5.3.0" +"@playwright/test@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.17.1.tgz#9e5aca496d2c90ce95ca19ac2c3a8867a4f606d3" + integrity sha512-mMZS5OMTN/vUlqd1JZkFoAk2FsIZ4/E/00tw5it2c/VF4+3z/aWO+PPd8ShEGzYME7B16QGWNPjyFpDQI1t4RQ== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/core" "^7.14.8" + "@babel/plugin-proposal-class-properties" "^7.14.5" + "@babel/plugin-proposal-dynamic-import" "^7.14.5" + "@babel/plugin-proposal-export-namespace-from" "^7.14.5" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" + "@babel/plugin-proposal-numeric-separator" "^7.14.5" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-private-methods" "^7.14.5" + "@babel/plugin-proposal-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-transform-modules-commonjs" "^7.14.5" + "@babel/preset-typescript" "^7.14.5" + colors "^1.4.0" + commander "^8.2.0" + debug "^4.1.1" + expect "=27.2.5" + jest-matcher-utils "=27.2.5" + jpeg-js "^0.4.2" + mime "^2.4.6" + minimatch "^3.0.3" + ms "^2.1.2" + open "^8.3.0" + pirates "^4.0.1" + pixelmatch "^5.2.1" + playwright-core "=1.17.1" + pngjs "^5.0.0" + rimraf "^3.0.2" + source-map-support "^0.4.18" + stack-utils "^2.0.3" + yazl "^2.5.1" + "@pmmmwh/react-refresh-webpack-plugin@^0.5.1": version "0.5.1" resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.1.tgz#7e98d6f22c360e1dd00909f5fa9d0f6ecc263292" @@ -4505,6 +4687,11 @@ resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== +"@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" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + "@types/tapable@^1", "@types/tapable@^1.0.5": version "1.0.7" resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.7.tgz#545158342f949e8fd3bfd813224971ecddc3fac4" @@ -8200,6 +8387,11 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -8313,6 +8505,11 @@ di@^0.0.1: resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= +diff-sequences@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.4.0.tgz#d783920ad8d06ec718a060d00196dfef25b132a5" + integrity sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww== + diff@5.0.0, diff@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" @@ -9404,6 +9601,18 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expect@=27.2.5: + version "27.2.5" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.2.5.tgz#16154aaa60b4d9a5b0adacfea3e4d6178f4b93fd" + integrity sha512-ZrO0w7bo8BgGoP/bLz+HDCI+0Hfei9jUSZs5yI/Wyn9VkG9w8oJ7rHRgYj+MA7yqqFa0IwHA3flJzZtYugShJA== + dependencies: + "@jest/types" "^27.2.5" + ansi-styles "^5.0.0" + jest-get-type "^27.0.6" + jest-matcher-utils "^27.2.5" + jest-message-util "^27.2.5" + jest-regex-util "^27.0.6" + express@^4.17.1, express@^4.17.2: version "4.17.2" resolved "https://registry.yarnpkg.com/express/-/express-4.17.2.tgz#c18369f265297319beed4e5558753cc8c1364cb3" @@ -11340,6 +11549,11 @@ is-docker@^2.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== +is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-dom@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-dom/-/is-dom-1.1.0.tgz#af1fced292742443bb59ca3f76ab5e80907b4e8a" @@ -11669,7 +11883,7 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -is-wsl@^2.1.1: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -11802,6 +12016,21 @@ iterate-value@^1.0.0: es-get-iterator "^1.0.2" iterate-iterator "^1.0.1" +jest-diff@^27.2.5, jest-diff@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.4.2.tgz#786b2a5211d854f848e2dcc1e324448e9481f36f" + integrity sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.4.0" + jest-get-type "^27.4.0" + pretty-format "^27.4.2" + +jest-get-type@^27.0.6, jest-get-type@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.4.0.tgz#7503d2663fffa431638337b3998d39c5e928e9b5" + integrity sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ== + jest-haste-map@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" @@ -11823,11 +12052,51 @@ jest-haste-map@^26.6.2: optionalDependencies: fsevents "^2.1.2" +jest-matcher-utils@=27.2.5: + version "27.2.5" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.2.5.tgz#4684faaa8eb32bf15e6edaead6834031897e2980" + integrity sha512-qNR/kh6bz0Dyv3m68Ck2g1fLW5KlSOUNcFQh87VXHZwWc/gY6XwnKofx76Qytz3x5LDWT09/2+yXndTkaG4aWg== + dependencies: + chalk "^4.0.0" + jest-diff "^27.2.5" + jest-get-type "^27.0.6" + pretty-format "^27.2.5" + +jest-matcher-utils@^27.2.5: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.4.2.tgz#d17c5038607978a255e0a9a5c32c24e984b6c60b" + integrity sha512-jyP28er3RRtMv+fmYC/PKG8wvAmfGcSNproVTW2Y0P/OY7/hWUOmsPfxN1jOhM+0u2xU984u2yEagGivz9OBGQ== + dependencies: + chalk "^4.0.0" + jest-diff "^27.4.2" + jest-get-type "^27.4.0" + pretty-format "^27.4.2" + +jest-message-util@^27.2.5: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.4.2.tgz#07f3f1bf207d69cf798ce830cc57f1a849f99388" + integrity sha512-OMRqRNd9E0DkBLZpFtZkAGYOXl6ZpoMtQJWTAREJKDOFa0M6ptB7L67tp+cszMBkvSgKOhNtQp2Vbcz3ZZKo/w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.4.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.4" + pretty-format "^27.4.2" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-regex-util@^26.0.0: version "26.0.0" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== +jest-regex-util@^27.0.6: + version "27.4.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.4.0.tgz#e4c45b52653128843d07ad94aec34393ea14fbca" + integrity sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg== + jest-serializer@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" @@ -13147,7 +13416,7 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: +minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -13367,7 +13636,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.0.0, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -14092,6 +14361,15 @@ open@^7.0.2, open@^7.0.3: is-docker "^2.0.0" is-wsl "^2.1.1" +open@^8.3.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" @@ -14680,6 +14958,13 @@ pirates@^4.0.0, pirates@^4.0.1: dependencies: node-modules-regexp "^1.0.0" +pixelmatch@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-5.2.1.tgz#9e4e4f4aa59648208a31310306a5bed5522b0d65" + integrity sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ== + dependencies: + pngjs "^4.0.1" + "pkg-dir@< 6 >= 5", pkg-dir@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" @@ -14749,6 +15034,11 @@ playwright@^1.17.1: dependencies: playwright-core "=1.17.1" +pngjs@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-4.0.1.tgz#f803869bb2fc1bfe1bf99aa4ec21c108117cfdbe" + integrity sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg== + pngjs@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" @@ -14996,6 +15286,16 @@ pretty-format@^27.0.2: ansi-styles "^5.0.0" react-is "^17.0.1" +pretty-format@^27.2.5, pretty-format@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.4.2.tgz#e4ce92ad66c3888423d332b40477c87d1dac1fb8" + integrity sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw== + dependencies: + "@jest/types" "^27.4.2" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + pretty-hrtime@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" @@ -17040,6 +17340,13 @@ source-map-resolve@^0.6.0: atob "^2.1.2" decode-uri-component "^0.2.0" +source-map-support@^0.4.18: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + source-map-support@^0.5.16, source-map-support@~0.5.12, source-map-support@~0.5.20: version "0.5.20" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9"