diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml
new file mode 100644
index 00000000..9e6fad51
--- /dev/null
+++ b/.github/workflows/playwright.yml
@@ -0,0 +1,25 @@
+name: Automatisch UI Test
+on:
+ schedule:
+ - cron: '0 12 * * *'
+jobs:
+ test:
+ timeout-minutes: 60
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-node@v3
+ with:
+ node-version: 18
+ - name: Install dependencies
+ run: yarn
+ - name: Install Playwright Browsers
+ run: yarn playwright install --with-deps
+ - name: Run Playwright tests
+ run: yarn playwright test
+ - uses: actions/upload-artifact@v3
+ if: always()
+ with:
+ name: playwright-report
+ path: playwright-report/
+ retention-days: 30
diff --git a/packages/e2e-tests/.gitignore b/packages/e2e-tests/.gitignore
new file mode 100644
index 00000000..16bda59e
--- /dev/null
+++ b/packages/e2e-tests/.gitignore
@@ -0,0 +1,5 @@
+node_modules/
+/test-results/
+/playwright-report/
+/playwright/.cache/
+/output
diff --git a/packages/e2e-tests/cypress.config.js b/packages/e2e-tests/cypress.config.js
deleted file mode 100644
index dac0771b..00000000
--- a/packages/e2e-tests/cypress.config.js
+++ /dev/null
@@ -1,17 +0,0 @@
-const { defineConfig } = require('cypress');
-
-const TO_BE_PROVIDED = 'HAS_TO_BE_PROVIDED_IN_cypress.env.json';
-
-module.exports = defineConfig({
- e2e: {
- baseUrl: 'http://localhost:3001',
- env: {
- login_email: 'user@automatisch.io',
- login_password: 'sample',
- deepl_auth_key: TO_BE_PROVIDED,
- },
- specPattern: 'cypress/e2e/**/*.{js,jsx,ts,tsx}',
- viewportWidth: 1280,
- viewportHeight: 768,
- },
-});
diff --git a/packages/e2e-tests/cypress/e2e/apps/list-apps.js b/packages/e2e-tests/cypress/e2e/apps/list-apps.js
deleted file mode 100644
index e36b7125..00000000
--- a/packages/e2e-tests/cypress/e2e/apps/list-apps.js
+++ /dev/null
@@ -1,52 +0,0 @@
-///
-
-describe('Apps page', () => {
- before(() => {
- cy.login();
-
- cy.og('apps-page-drawer-link').click();
- });
-
- after(() => {
- cy.logout();
- });
-
- it('displays applications', () => {
- cy.og('apps-loader').should('not.exist');
- cy.og('app-row').should('have.length.least', 1);
-
- cy.ss('Applications');
- });
-
- context('can add connection', () => {
- before(() => {
- cy
- .og('add-connection-button')
- .click({ force: true });
- });
-
- it('lists applications', () => {
- cy.og('app-list-item').should('have.length.above', 1);
- });
-
- it('searches an application', () => {
- cy.og('search-for-app-text-field').type('DeepL');
- cy.og('app-list-item').should('have.length', 1);
- });
-
- it('goes to app page to create a connection', () => {
- cy.og('app-list-item').first().click();
-
- cy.location('pathname').should('equal', '/app/deepl/connections/add');
-
- cy.og('add-app-connection-dialog').should('be.visible');
- });
-
- it('closes the dialog on backdrop click', () => {
- cy.clickOutside();
-
- cy.location('pathname').should('equal', '/app/deepl/connections');
- cy.og('add-app-connection-dialog').should('not.exist');
- });
- });
-});
diff --git a/packages/e2e-tests/cypress/e2e/connections/create-connection.js b/packages/e2e-tests/cypress/e2e/connections/create-connection.js
deleted file mode 100644
index 8cff984e..00000000
--- a/packages/e2e-tests/cypress/e2e/connections/create-connection.js
+++ /dev/null
@@ -1,48 +0,0 @@
-///
-
-describe('Connections page', () => {
- before(() => {
- cy.login();
-
- cy.og('apps-page-drawer-link').click();
-
- cy.visit('/app/deepl/connections');
- });
-
- after(() => {
- cy.logout();
- });
-
- it('shows connections if any', () => {
- cy.og('apps-loader').should('not.exist');
-
- cy.ss('DeepL connections before creating a connection');
- });
-
- context('can add connection', () => {
- it('has a button to open add connection dialog', () => {
- cy.scrollTo('top', { ensureScrollable: false });
-
- cy
- .og('add-connection-button')
- .should('be.visible');
- });
-
- it('add connection button takes user to add connection page', () => {
- cy.og('add-connection-button').click();
-
- cy.location('pathname').should('equal', '/app/deepl/connections/add');
- });
-
- it('shows add connection dialog to create a new connection', () => {
- cy.get('input[name="screenName"]').type('e2e-test connection!');
- cy.get('input[name="authenticationKey"]').type(Cypress.env('deepl_auth_key'));
-
- cy.og('create-connection-button').click();
-
- cy.og('create-connection-button').should('not.exist');
-
- cy.ss('DeepL connections after creating a connection');
- });
- });
-});
diff --git a/packages/e2e-tests/cypress/e2e/executions/display-execution.js b/packages/e2e-tests/cypress/e2e/executions/display-execution.js
deleted file mode 100644
index 62064fa6..00000000
--- a/packages/e2e-tests/cypress/e2e/executions/display-execution.js
+++ /dev/null
@@ -1,32 +0,0 @@
-///
-
-describe('Execution page', () => {
- before(() => {
- cy.login();
-
- cy.og('executions-page-drawer-link').click();
- cy.og('execution-row').first().click({ force: true });
-
- cy.location('pathname').should('match', /^\/executions\//);
- });
-
- after(() => {
- cy.logout();
- });
-
- it('displays data in by default', () => {
- cy.og('execution-step').should('have.length', 2);
-
- cy.ss('Execution - data in');
- });
-
- it('displays data out', () => {
- cy.og('data-out-tab').click({ multiple: true });
-
- cy.ss('Execution - data out');
- });
-
- it('does not display error', () => {
- cy.og('error-tab').should('not.exist');
- });
-});
diff --git a/packages/e2e-tests/cypress/e2e/executions/list-executions.js b/packages/e2e-tests/cypress/e2e/executions/list-executions.js
deleted file mode 100644
index 73a685e8..00000000
--- a/packages/e2e-tests/cypress/e2e/executions/list-executions.js
+++ /dev/null
@@ -1,20 +0,0 @@
-///
-
-describe('Executions page', () => {
- before(() => {
- cy.login();
-
- cy.og('executions-page-drawer-link').click();
- });
-
- after(() => {
- cy.logout();
- });
-
- it('displays executions', () => {
- cy.og('executions-loader').should('not.exist');
- cy.og('execution-row').should('exist');
-
- cy.ss('Executions');
- });
-});
diff --git a/packages/e2e-tests/cypress/e2e/flow-editor/create-flow.js b/packages/e2e-tests/cypress/e2e/flow-editor/create-flow.js
deleted file mode 100644
index ad175e7b..00000000
--- a/packages/e2e-tests/cypress/e2e/flow-editor/create-flow.js
+++ /dev/null
@@ -1,217 +0,0 @@
-///
-
-describe('Flow editor page', () => {
- before(() => {
- cy.login();
- });
-
- after(() => {
- cy.logout();
- });
-
- it('create flow', () => {
- cy.og('create-flow-button').click({ force: true });
- });
-
- it('has two steps by default', () => {
- cy.og('flow-step').should('have.length', 2);
- });
-
- context('edit flow', () => {
- context('arrange Scheduler trigger', () => {
- context('choose app and event substep', () => {
- it('choose application', () => {
- cy.og('choose-app-autocomplete').click();
-
- cy.get('li[role="option"]:contains("Scheduler")').click();
- });
-
- it('choose an event', () => {
- cy.og('choose-event-autocomplete').should('be.visible').click();
-
- cy.get('li[role="option"]:contains("Every hour")').click();
- });
-
- it('continue to next step', () => {
- cy.og('flow-substep-continue-button').click();
- });
-
- it('collapses the substep', () => {
- cy.og('choose-app-autocomplete').should('not.be.visible');
- cy.og('choose-event-autocomplete').should('not.be.visible');
- });
- });
-
- context('set up a trigger', () => {
- it('choose "yes" in "trigger on weekends?"', () => {
- cy.og('parameters.triggersOnWeekend-autocomplete')
- .should('be.visible')
- .click();
-
- cy.get('li[role="option"]:contains("Yes")').click();
- });
-
- it('continue to next step', () => {
- cy.og('flow-substep-continue-button').click();
- });
-
- it('collapses the substep', () => {
- cy.og('parameters.triggersOnWeekend-autocomplete').should(
- 'not.exist'
- );
- });
- });
-
- context('test trigger', () => {
- it('show sample output', () => {
- cy.og('flow-test-substep-output').should('not.exist');
-
- cy.og('flow-substep-continue-button').click();
-
- cy.og('flow-test-substep-output').should('be.visible');
-
- cy.ss('Scheduler trigger test output');
-
- cy.og('flow-substep-continue-button').click();
- });
- });
- });
-
- context('arrange DeepL action', () => {
- context('choose app and event substep', () => {
- it('choose application', () => {
- cy.og('choose-app-autocomplete').click();
-
- cy.get('li[role="option"]:contains("DeepL")').click();
- });
-
- it('choose an event', () => {
- cy.og('choose-event-autocomplete').should('be.visible').click();
-
- cy.get(
- 'li[role="option"]:contains("Translate Text")'
- ).click();
- });
-
- it('continue to next step', () => {
- cy.og('flow-substep-continue-button').click();
- });
-
- it('collapses the substep', () => {
- cy.og('choose-app-autocomplete').should('not.be.visible');
- cy.og('choose-event-autocomplete').should('not.be.visible');
- });
- });
-
- context('choose connection', () => {
- it('choose connection', () => {
- cy.og('choose-connection-autocomplete').click();
-
- cy.get('li[role="option"]').first().click();
- });
-
- it('continue to next step', () => {
- cy.og('flow-substep-continue-button').click();
- });
-
- it('collapses the substep', () => {
- cy.og('choose-connection-autocomplete').should('not.be.visible');
- });
- });
-
- context('set up action', () => {
- it('arrange text', () => {
- cy.og('power-input', ' [contenteditable]')
- .click()
- .type(
- `Hello from e2e tests! Here is the first suggested variable's value; `
- );
-
- cy.og('power-input-suggestion-group')
- .first()
- .og('power-input-suggestion-item')
- .first()
- .click();
-
- cy.clickOutside();
-
- cy.ss('DeepL action text');
- });
-
- it('set target language', () => {
- cy.og('parameters.targetLanguage-autocomplete').click();
-
- cy.get(
- 'li[role="option"]:contains("Turkish")'
- ).first().click();
- });
-
- it('continue to next step', () => {
- cy.og('flow-substep-continue-button').click();
- });
-
- it('collapses the substep', () => {
- cy.og('power-input', ' [contenteditable]').should('not.exist');
- });
- });
-
- context('test trigger', () => {
- it('show sample output', () => {
- cy.og('flow-test-substep-output').should('not.exist');
-
- cy.og('flow-substep-continue-button').click();
-
- cy.og('flow-test-substep-output').should('be.visible');
-
- cy.ss('DeepL action test output');
-
- cy.og('flow-substep-continue-button').click();
- });
- });
- });
- });
-
- context('publish and unpublish', () => {
- it('publish flow', () => {
- cy.og('unpublish-flow-button').should('not.exist');
-
- cy.og('publish-flow-button').should('be.visible').click();
-
- cy.og('publish-flow-button').should('not.exist');
- });
-
- it('shows read-only sticky snackbar', () => {
- cy.og('flow-cannot-edit-info-snackbar').should('be.visible');
-
- cy.ss('Published flow');
- });
-
- it('unpublish from snackbar', () => {
- cy.og('unpublish-flow-from-snackbar').click();
-
- cy.og('flow-cannot-edit-info-snackbar').should('not.exist');
- });
-
- it('publish once again', () => {
- cy.og('publish-flow-button').should('be.visible').click();
-
- cy.og('publish-flow-button').should('not.exist');
- });
-
- it('unpublish from layout top bar', () => {
- cy.og('unpublish-flow-button').should('be.visible').click();
-
- cy.og('unpublish-flow-button').should('not.exist');
-
- cy.ss('Unpublished flow');
- });
- });
-
- context('in layout', () => {
- it('can go back to flows page', () => {
- cy.og('editor-go-back-button').click();
-
- cy.location('pathname').should('equal', '/flows');
- });
- });
-});
diff --git a/packages/e2e-tests/cypress/support/commands.js b/packages/e2e-tests/cypress/support/commands.js
deleted file mode 100644
index 06086d4a..00000000
--- a/packages/e2e-tests/cypress/support/commands.js
+++ /dev/null
@@ -1,44 +0,0 @@
-Cypress.Commands.add(
- 'og',
- { prevSubject: 'optional' },
- (subject, selector, suffix = '') => {
- if (subject) {
- return cy.wrap(subject).get(`[data-test="${selector}"]${suffix}`);
- }
-
- return cy.get(`[data-test="${selector}"]${suffix}`);
- }
-);
-
-Cypress.Commands.add('login', () => {
- cy.visit('/login');
-
- cy.og('email-text-field').type(Cypress.env('login_email'));
- cy.og('password-text-field').type(Cypress.env('login_password'));
-
- cy.intercept('/graphql').as('graphqlCalls');
- cy.intercept('https://notifications.automatisch.io/notifications.json').as(
- 'notificationsCall'
- );
- cy.og('login-button').click();
-
- cy.wait(['@graphqlCalls', '@notificationsCall']);
-});
-
-Cypress.Commands.add('logout', () => {
- cy.og('profile-menu-button').click();
-
- cy.og('logout-item').click();
-});
-
-Cypress.Commands.add('ss', (name, opts = {}) => {
- return cy.screenshot(name, {
- overwrite: true,
- capture: 'viewport',
- ...opts,
- });
-});
-
-Cypress.Commands.add('clickOutside', () => {
- return cy.get('body').click(0, 0);
-});
diff --git a/packages/e2e-tests/cypress/support/e2e.js b/packages/e2e-tests/cypress/support/e2e.js
deleted file mode 100644
index 5df9c018..00000000
--- a/packages/e2e-tests/cypress/support/e2e.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// ***********************************************************
-// This example support/e2e.js is processed and
-// loaded automatically before your test files.
-//
-// This is a great place to put global configuration and
-// behavior that modifies Cypress.
-//
-// You can change the location of this file or turn off
-// automatically serving support files with the
-// 'supportFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/configuration
-// ***********************************************************
-
-// Import commands.js using ES2015 syntax:
-import './commands';
-
-// Alternatively you can use CommonJS syntax:
-// require('./commands')
diff --git a/packages/e2e-tests/fixtures/applications-page.js b/packages/e2e-tests/fixtures/applications-page.js
new file mode 100644
index 00000000..19934035
--- /dev/null
+++ b/packages/e2e-tests/fixtures/applications-page.js
@@ -0,0 +1,12 @@
+const path = require('node:path');
+const { BasePage } = require('./base-page');
+
+export class ApplicationsPage extends BasePage {
+ async screenshot(options = {}) {
+ const { path: plainPath, ...restOptions } = options;
+
+ const computedPath = path.join('applications', plainPath);
+
+ return await super.screenshot({ path: computedPath, ...restOptions });
+ }
+}
diff --git a/packages/e2e-tests/fixtures/base-page.js b/packages/e2e-tests/fixtures/base-page.js
new file mode 100644
index 00000000..6e4b251f
--- /dev/null
+++ b/packages/e2e-tests/fixtures/base-page.js
@@ -0,0 +1,22 @@
+const path = require('node:path');
+
+export class BasePage {
+ /**
+ * @param {import('@playwright/test').Page} page
+ */
+ constructor(page) {
+ this.page = page;
+ }
+
+ async clickAway() {
+ await this.page.locator('body').click({ position: { x: 0, y: 0 } });
+ }
+
+ async screenshot(options = {}) {
+ const { path: plainPath, ...restOptions } = options;
+
+ const computedPath = path.join('output/screenshots', plainPath);
+
+ return await this.page.screenshot({ path: computedPath, ...restOptions });
+ }
+}
diff --git a/packages/e2e-tests/fixtures/connections-page.js b/packages/e2e-tests/fixtures/connections-page.js
new file mode 100644
index 00000000..4f03cadb
--- /dev/null
+++ b/packages/e2e-tests/fixtures/connections-page.js
@@ -0,0 +1,16 @@
+const path = require('node:path');
+const { BasePage } = require('./base-page');
+
+export class ConnectionsPage extends BasePage {
+ async screenshot(options = {}) {
+ const { path: plainPath, ...restOptions } = options;
+
+ const computedPath = path.join('connections', plainPath);
+
+ return await super.screenshot({ path: computedPath, ...restOptions });
+ }
+
+ async clickAddConnectionButton() {
+ await this.page.getByTestId('add-connection-button').click();
+ }
+}
diff --git a/packages/e2e-tests/fixtures/executions-page.js b/packages/e2e-tests/fixtures/executions-page.js
new file mode 100644
index 00000000..2d5fc4f0
--- /dev/null
+++ b/packages/e2e-tests/fixtures/executions-page.js
@@ -0,0 +1,12 @@
+const path = require('node:path');
+const { BasePage } = require('./base-page');
+
+export class ExecutionsPage extends BasePage {
+ async screenshot(options = {}) {
+ const { path: plainPath, ...restOptions } = options;
+
+ const computedPath = path.join('executions', plainPath);
+
+ return await super.screenshot({ path: computedPath, ...restOptions });
+ }
+}
diff --git a/packages/e2e-tests/fixtures/flow-editor-page.js b/packages/e2e-tests/fixtures/flow-editor-page.js
new file mode 100644
index 00000000..4b894407
--- /dev/null
+++ b/packages/e2e-tests/fixtures/flow-editor-page.js
@@ -0,0 +1,27 @@
+const path = require('node:path');
+const { BasePage } = require('./base-page');
+
+export class FlowEditorPage extends BasePage {
+ constructor(page) {
+ super(page);
+ this.appAutocomplete = this.page.getByTestId('choose-app-autocomplete');
+ this.eventAutocomplete = this.page.getByTestId('choose-event-autocomplete');
+ this.continueButton = this.page.getByTestId('flow-substep-continue-button');
+ this.connectionAutocomplete = this.page.getByTestId(
+ 'choose-connection-autocomplete'
+ );
+ this.testOuput = this.page.getByTestId('flow-test-substep-output');
+ this.unpublishFlowButton = this.page.getByTestId('unpublish-flow-button');
+ this.publishFlowButton = this.page.getByTestId('publish-flow-button');
+ this.infoSnackbar = this.page.getByTestId('flow-cannot-edit-info-snackbar');
+ this.trigger = this.page.getByLabel('Trigger on weekends?');
+ }
+
+ async screenshot(options = {}) {
+ const { path: plainPath, ...restOptions } = options;
+
+ const computedPath = path.join('flow-editor', plainPath);
+
+ return await super.screenshot({ path: computedPath, ...restOptions });
+ }
+}
diff --git a/packages/e2e-tests/fixtures/index.js b/packages/e2e-tests/fixtures/index.js
new file mode 100644
index 00000000..7116534d
--- /dev/null
+++ b/packages/e2e-tests/fixtures/index.js
@@ -0,0 +1,28 @@
+const base = require('@playwright/test');
+const { ApplicationsPage } = require('./applications-page');
+const { ConnectionsPage } = require('./connections-page');
+const { ExecutionsPage } = require('./executions-page');
+const { FlowEditorPage } = require('./flow-editor-page');
+const { LoginPage } = require('./login-page');
+
+exports.test = base.test.extend({
+ page: async ({ page }, use) => {
+ await new LoginPage(page).login();
+
+ await use(page);
+ },
+ applicationsPage: async ({ page }, use) => {
+ await use(new ApplicationsPage(page));
+ },
+ connectionsPage: async ({ page }, use) => {
+ await use(new ConnectionsPage(page));
+ },
+ executionsPage: async ({ page }, use) => {
+ await use(new ExecutionsPage(page));
+ },
+ flowEditorPage: async ({ page }, use) => {
+ await use(new FlowEditorPage(page));
+ },
+});
+
+exports.expect = base.expect;
diff --git a/packages/e2e-tests/fixtures/login-page.js b/packages/e2e-tests/fixtures/login-page.js
new file mode 100644
index 00000000..b3ee67c1
--- /dev/null
+++ b/packages/e2e-tests/fixtures/login-page.js
@@ -0,0 +1,27 @@
+const path = require('node:path');
+const { BasePage } = require('./base-page');
+
+export class LoginPage extends BasePage {
+ /**
+ * @param {import('@playwright/test').Page} page
+ */
+ constructor(page) {
+ super(page);
+
+ this.page = page;
+
+ this.emailTextField = this.page.getByTestId('email-text-field');
+ this.passwordTextField = this.page.getByTestId('password-text-field');
+ this.loginButton = this.page.getByTestId('login-button');
+ }
+
+ path = '/login';
+
+ async login() {
+ await this.page.goto(this.path);
+ await this.emailTextField.fill(process.env.LOGIN_EMAIL);
+ await this.passwordTextField.fill(process.env.LOGIN_PASSWORD);
+
+ await this.loginButton.click();
+ }
+}
diff --git a/packages/e2e-tests/package.json b/packages/e2e-tests/package.json
index 60f97cc2..6fc04e83 100644
--- a/packages/e2e-tests/package.json
+++ b/packages/e2e-tests/package.json
@@ -5,7 +5,8 @@
"private": true,
"description": "The open source Zapier alternative. Build workflow automation without spending time and money.",
"scripts": {
- "open": "cypress open"
+ "test": "playwright test",
+ "test:fast": "yarn test -j 90% --quiet --reporter null --ignore-snapshots -x"
},
"contributors": [
{
@@ -22,6 +23,9 @@
"url": "https://github.com/automatisch/automatisch/issues"
},
"devDependencies": {
- "cypress": "^10.9.0"
+ "@playwright/test": "^1.36.2"
+ },
+ "dependencies": {
+ "dotenv": "^16.3.1"
}
}
diff --git a/packages/e2e-tests/playwright.config.js b/packages/e2e-tests/playwright.config.js
new file mode 100644
index 00000000..4b7ef3e6
--- /dev/null
+++ b/packages/e2e-tests/playwright.config.js
@@ -0,0 +1,82 @@
+// @ts-check
+const { defineConfig, devices } = require('@playwright/test');
+
+/**
+ * Read environment variables from file.
+ * https://github.com/motdotla/dotenv
+ */
+require('dotenv').config();
+
+/**
+ * @see https://playwright.dev/docs/test-configuration
+ */
+module.exports = defineConfig({
+ testDir: './tests',
+ /* Run tests in files in parallel */
+ fullyParallel: true,
+ /* Fail the build on CI if you accidentally left test.only in the source code. */
+ forbidOnly: !!process.env.CI,
+ /* Retry on CI only */
+ retries: process.env.CI ? 2 : 0,
+ /* Opt out of parallel tests on CI. */
+ workers: process.env.CI ? 1 : undefined,
+ /* Reporter to use. See https://playwright.dev/docs/test-reporters */
+ reporter: process.env.CI ? 'github' : 'html',
+ /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
+ use: {
+ /* Base URL to use in actions like `await page.goto('/')`. */
+ baseURL: process.env.CI
+ ? 'https://sandbox.automatisch.io'
+ : 'http://localhost:3001',
+
+ /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
+ trace: 'on-first-retry',
+ testIdAttribute: 'data-test',
+ viewport: { width: 1280, height: 720 },
+ },
+
+ /* Configure projects for major browsers */
+ projects: [
+ {
+ name: 'chromium',
+ use: { ...devices['Desktop Chrome'] },
+ },
+
+ // {
+ // name: 'firefox',
+ // use: { ...devices['Desktop Firefox'] },
+ // },
+
+ // {
+ // name: 'webkit',
+ // use: { ...devices['Desktop Safari'] },
+ // },
+
+ /* Test against mobile viewports. */
+ // {
+ // name: 'Mobile Chrome',
+ // use: { ...devices['Pixel 5'] },
+ // },
+ // {
+ // name: 'Mobile Safari',
+ // use: { ...devices['iPhone 12'] },
+ // },
+
+ /* Test against branded browsers. */
+ // {
+ // name: 'Microsoft Edge',
+ // use: { ...devices['Desktop Edge'], channel: 'msedge' },
+ // },
+ // {
+ // name: 'Google Chrome',
+ // use: { ...devices['Desktop Chrome'], channel: 'chrome' },
+ // },
+ ],
+
+ /* Run your local dev server before starting the tests */
+ // webServer: {
+ // command: 'npm run start',
+ // url: 'http://127.0.0.1:3000',
+ // reuseExistingServer: !process.env.CI,
+ // },
+});
diff --git a/packages/e2e-tests/tests/apps/list-apps.spec.js b/packages/e2e-tests/tests/apps/list-apps.spec.js
new file mode 100644
index 00000000..38583ef3
--- /dev/null
+++ b/packages/e2e-tests/tests/apps/list-apps.spec.js
@@ -0,0 +1,66 @@
+// @ts-check
+const { test, expect } = require('../../fixtures/index');
+
+test.describe('Apps page', () => {
+ test.beforeEach(async ({ page, applicationsPage }) => {
+ await page.getByTestId('apps-page-drawer-link').click();
+ });
+
+ test('displays applications', async ({ page, applicationsPage }) => {
+ await page.getByTestId('apps-loader').waitFor({
+ state: 'detached',
+ });
+ await expect(page.getByTestId('app-row')).not.toHaveCount(0);
+
+ await applicationsPage.screenshot({
+ path: 'Applications.png',
+ });
+ });
+
+ test.describe('can add connection', () => {
+ test.beforeEach(async ({ page }) => {
+ await expect(page.getByTestId('add-connection-button')).toBeVisible();
+ await page.getByTestId('add-connection-button').click();
+ await page
+ .getByTestId('search-for-app-loader')
+ .waitFor({ state: 'detached' });
+ });
+
+ test('lists applications', async ({ page, applicationsPage }) => {
+ const appListItemCount = await page.getByTestId('app-list-item').count();
+ expect(appListItemCount).toBeGreaterThan(10);
+
+ await applicationsPage.clickAway();
+ });
+
+ test('searches an application', async ({ page, applicationsPage }) => {
+ await page.getByTestId('search-for-app-text-field').fill('DeepL');
+ await expect(page.getByTestId('app-list-item')).toHaveCount(1);
+
+ await applicationsPage.clickAway();
+ });
+
+ test('goes to app page to create a connection', async ({
+ page,
+ applicationsPage,
+ }) => {
+ await page.getByTestId('app-list-item').first().click();
+ await expect(page).toHaveURL('/app/deepl/connections/add?shared=false');
+ await expect(page.getByTestId('add-app-connection-dialog')).toBeVisible();
+
+ await applicationsPage.clickAway();
+ });
+
+ test('closes the dialog on backdrop click', async ({
+ page,
+ applicationsPage,
+ }) => {
+ await page.getByTestId('app-list-item').first().click();
+ await expect(page).toHaveURL('/app/deepl/connections/add?shared=false');
+ await expect(page.getByTestId('add-app-connection-dialog')).toBeVisible();
+ await applicationsPage.clickAway();
+ await expect(page).toHaveURL('/app/deepl/connections');
+ await expect(page.getByTestId('add-app-connection-dialog')).toBeHidden();
+ });
+ });
+});
diff --git a/packages/e2e-tests/tests/connections/create-connection.spec.js b/packages/e2e-tests/tests/connections/create-connection.spec.js
new file mode 100644
index 00000000..2415edc0
--- /dev/null
+++ b/packages/e2e-tests/tests/connections/create-connection.spec.js
@@ -0,0 +1,49 @@
+// @ts-check
+const { test, expect } = require('../../fixtures/index');
+
+test.describe('Connections page', () => {
+ test.beforeEach(async ({ page, connectionsPage }) => {
+ await page.getByTestId('apps-page-drawer-link').click();
+ await page.goto('/app/ntfy/connections');
+ });
+
+ test('shows connections if any', async ({ page, connectionsPage }) => {
+ await page.getByTestId('apps-loader').waitFor({
+ state: 'detached',
+ });
+
+ await connectionsPage.screenshot({
+ path: 'Connections.png',
+ });
+ });
+
+ test.describe('can add connection', () => {
+ test('has a button to open add connection dialog', async ({ page }) => {
+ await expect(page.getByTestId('add-connection-button')).toBeVisible();
+ });
+
+ test('add connection button takes user to add connection page', async ({
+ page,
+ connectionsPage,
+ }) => {
+ await connectionsPage.clickAddConnectionButton();
+ await expect(page).toHaveURL('/app/ntfy/connections/add?shared=false');
+ });
+
+ test('shows add connection dialog to create a new connection', async ({
+ page,
+ connectionsPage,
+ }) => {
+ await connectionsPage.clickAddConnectionButton();
+ await expect(page).toHaveURL('/app/ntfy/connections/add?shared=false');
+ await page.getByTestId('create-connection-button').click();
+ await expect(
+ page.getByTestId('create-connection-button')
+ ).not.toBeVisible();
+
+ await connectionsPage.screenshot({
+ path: 'Ntfy connections after creating a connection.png',
+ });
+ });
+ });
+});
diff --git a/packages/e2e-tests/tests/executions/display-execution.spec.js b/packages/e2e-tests/tests/executions/display-execution.spec.js
new file mode 100644
index 00000000..742f07e5
--- /dev/null
+++ b/packages/e2e-tests/tests/executions/display-execution.spec.js
@@ -0,0 +1,37 @@
+// @ts-check
+const { test, expect } = require('../../fixtures/index');
+
+test.describe('Executions page', () => {
+ test.beforeEach(async ({ page, executionsPage }) => {
+ await page.getByTestId('executions-page-drawer-link').click();
+ await page.getByTestId('execution-row').first().click();
+
+ await expect(page).toHaveURL(/\/executions\//);
+ });
+
+ test('displays data in by default', async ({ page, executionsPage }) => {
+ await expect(page.getByTestId('execution-step').last()).toBeVisible();
+ await expect(page.getByTestId('execution-step')).toHaveCount(2);
+
+ await executionsPage.screenshot({
+ path: 'Execution - data in.png',
+ });
+ });
+
+ test('displays data out', async ({ page, executionsPage }) => {
+ const executionStepCount = await page.getByTestId('execution-step').count();
+ for (let i = 0; i < executionStepCount; i++) {
+ await page.getByTestId('data-out-tab').nth(i).click();
+ await expect(page.getByTestId('data-out-panel').nth(i)).toBeVisible();
+
+ await executionsPage.screenshot({
+ path: `Execution - data out - ${i}.png`,
+ animations: 'disabled',
+ });
+ }
+ });
+
+ test('does not display error', async ({ page }) => {
+ await expect(page.getByTestId('error-tab')).toBeHidden();
+ });
+});
diff --git a/packages/e2e-tests/tests/executions/list-executions.spec.js b/packages/e2e-tests/tests/executions/list-executions.spec.js
new file mode 100644
index 00000000..b55fa765
--- /dev/null
+++ b/packages/e2e-tests/tests/executions/list-executions.spec.js
@@ -0,0 +1,17 @@
+// @ts-check
+const { test, expect } = require('../../fixtures/index');
+
+test.describe('Executions page', () => {
+ test.beforeEach(async ({ page, executionsPage }) => {
+ await page.getByTestId('executions-page-drawer-link').click();
+ });
+
+ test('displays executions', async ({ page, executionsPage }) => {
+ await page.getByTestId('executions-loader').waitFor({
+ state: 'detached',
+ });
+ await expect(page.getByTestId('execution-row').first()).toBeVisible();
+
+ await executionsPage.screenshot({ path: 'Executions.png' });
+ });
+});
diff --git a/packages/e2e-tests/tests/flow-editor/create-flow.spec.js b/packages/e2e-tests/tests/flow-editor/create-flow.spec.js
new file mode 100644
index 00000000..00e30627
--- /dev/null
+++ b/packages/e2e-tests/tests/flow-editor/create-flow.spec.js
@@ -0,0 +1,204 @@
+// @ts-check
+const { FlowEditorPage } = require('../../fixtures/flow-editor-page');
+const { LoginPage } = require('../../fixtures/login-page');
+const { test, expect } = require('../../fixtures/index');
+
+test.describe.configure({ mode: 'serial' });
+
+let flowEditorPage;
+
+test.beforeAll(async ({ browser }) => {
+ const page = await browser.newPage();
+ await new LoginPage(page).login();
+ flowEditorPage = new FlowEditorPage(page);
+});
+
+test('create flow', async ({}) => {
+ await flowEditorPage.page.getByTestId('create-flow-button').click();
+ await expect(flowEditorPage.page).toHaveURL(/\/editor\/create/);
+ await expect(flowEditorPage.page).toHaveURL(
+ /\/editor\/[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}/
+ );
+});
+
+test('has two steps by default', async ({}) => {
+ await expect(flowEditorPage.page.getByTestId('flow-step')).toHaveCount(2);
+});
+
+test.describe('arrange Scheduler trigger', () => {
+ test.describe('choose app and event substep', () => {
+ test('choose application', async ({}) => {
+ await flowEditorPage.appAutocomplete.click();
+ await flowEditorPage.page
+ .getByRole('option', { name: 'Scheduler' })
+ .click();
+ });
+
+ test('choose an event', async ({}) => {
+ await expect(flowEditorPage.eventAutocomplete).toBeVisible();
+ await flowEditorPage.eventAutocomplete.click();
+ await flowEditorPage.page
+ .getByRole('option', { name: 'Every hour' })
+ .click();
+ });
+
+ test('continue to next step', async ({}) => {
+ await flowEditorPage.continueButton.click();
+ });
+
+ test('collapses the substep', async ({}) => {
+ await expect(flowEditorPage.appAutocomplete).not.toBeVisible();
+ await expect(flowEditorPage.eventAutocomplete).not.toBeVisible();
+ });
+ });
+
+ test.describe('set up a trigger', () => {
+ test('choose "yes" in "trigger on weekends?"', async ({}) => {
+ await expect(flowEditorPage.trigger).toBeVisible();
+ await flowEditorPage.trigger.click();
+ await flowEditorPage.page.getByRole('option', { name: 'Yes' }).click();
+ });
+
+ test('continue to next step', async ({}) => {
+ await flowEditorPage.continueButton.click();
+ });
+
+ test('collapses the substep', async ({}) => {
+ await expect(flowEditorPage.trigger).not.toBeVisible();
+ });
+ });
+
+ test.describe('test trigger', () => {
+ test('show sample output', async ({}) => {
+ await expect(flowEditorPage.testOuput).not.toBeVisible();
+ await flowEditorPage.continueButton.click();
+ await expect(flowEditorPage.testOuput).toBeVisible();
+ await flowEditorPage.screenshot({
+ path: 'Scheduler trigger test output.png',
+ });
+ await flowEditorPage.continueButton.click();
+ });
+ });
+});
+
+test.describe('arrange Ntfy action', () => {
+ test.describe('choose app and event substep', () => {
+ test('choose application', async ({}) => {
+ await flowEditorPage.appAutocomplete.click();
+ await flowEditorPage.page.getByRole('option', { name: 'Ntfy' }).click();
+ });
+
+ test('choose an event', async ({}) => {
+ await expect(flowEditorPage.eventAutocomplete).toBeVisible();
+ await flowEditorPage.eventAutocomplete.click();
+ await flowEditorPage.page
+ .getByRole('option', { name: 'Send message' })
+ .click();
+ });
+
+ test('continue to next step', async ({}) => {
+ await flowEditorPage.continueButton.click();
+ });
+
+ test('collapses the substep', async ({}) => {
+ await expect(flowEditorPage.appAutocomplete).not.toBeVisible();
+ await expect(flowEditorPage.eventAutocomplete).not.toBeVisible();
+ });
+ });
+
+ test.describe('choose connection', () => {
+ test('choose connection list item', async ({}) => {
+ await flowEditorPage.connectionAutocomplete.click();
+ await flowEditorPage.page.getByRole('option').first().click();
+ });
+
+ test('continue to next step', async ({}) => {
+ await flowEditorPage.continueButton.click();
+ });
+
+ test('collapses the substep', async ({}) => {
+ await expect(flowEditorPage.connectionAutocomplete).not.toBeVisible();
+ });
+ });
+
+ test.describe('set up action', () => {
+ test('fill topic and message body', async ({}) => {
+ await flowEditorPage.page
+ .getByTestId('parameters.topic-power-input')
+ .locator('[contenteditable]')
+ .fill('Topic');
+ await flowEditorPage.page
+ .getByTestId('parameters.message-power-input')
+ .locator('[contenteditable]')
+ .fill('Message body');
+ });
+
+ test('continue to next step', async ({}) => {
+ await flowEditorPage.continueButton.click();
+ });
+
+ test('collapses the substep', async ({}) => {
+ await expect(flowEditorPage.connectionAutocomplete).not.toBeVisible();
+ });
+ });
+
+ test.describe('test trigger', () => {
+ test('show sample output', async ({}) => {
+ await expect(flowEditorPage.testOuput).not.toBeVisible();
+ await flowEditorPage.page
+ .getByTestId('flow-substep-continue-button')
+ .first()
+ .click();
+ await expect(flowEditorPage.testOuput).toBeVisible();
+ await flowEditorPage.screenshot({
+ path: 'Ntfy action test output.png',
+ });
+ await flowEditorPage.continueButton.click();
+ });
+ });
+});
+
+test.describe('publish and unpublish', () => {
+ test('publish flow', async ({}) => {
+ await expect(flowEditorPage.unpublishFlowButton).not.toBeVisible();
+ await expect(flowEditorPage.publishFlowButton).toBeVisible();
+ await flowEditorPage.publishFlowButton.click();
+ await expect(flowEditorPage.publishFlowButton).not.toBeVisible();
+ });
+
+ test('shows read-only sticky snackbar', async ({}) => {
+ await expect(flowEditorPage.infoSnackbar).toBeVisible();
+ await flowEditorPage.screenshot({
+ path: 'Published flow.png',
+ });
+ });
+
+ test('unpublish from snackbar', async ({}) => {
+ await flowEditorPage.page
+ .getByTestId('unpublish-flow-from-snackbar')
+ .click();
+ await expect(flowEditorPage.infoSnackbar).not.toBeVisible();
+ });
+
+ test('publish once again', async ({}) => {
+ await expect(flowEditorPage.publishFlowButton).toBeVisible();
+ await flowEditorPage.publishFlowButton.click();
+ await expect(flowEditorPage.publishFlowButton).not.toBeVisible();
+ });
+
+ test('unpublish from layout top bar', async ({}) => {
+ await expect(flowEditorPage.unpublishFlowButton).toBeVisible();
+ await flowEditorPage.unpublishFlowButton.click();
+ await expect(flowEditorPage.unpublishFlowButton).not.toBeVisible();
+ await flowEditorPage.screenshot({
+ path: 'Unpublished flow.png',
+ });
+ });
+});
+
+test.describe('in layout', () => {
+ test('can go back to flows page', async ({}) => {
+ await flowEditorPage.page.getByTestId('editor-go-back-button').click();
+ await expect(flowEditorPage.page).toHaveURL('/flows');
+ });
+});
diff --git a/packages/web/src/components/AddNewAppConnection/index.tsx b/packages/web/src/components/AddNewAppConnection/index.tsx
index bbd95d86..694c80a1 100644
--- a/packages/web/src/components/AddNewAppConnection/index.tsx
+++ b/packages/web/src/components/AddNewAppConnection/index.tsx
@@ -101,7 +101,9 @@ export default function AddNewAppConnection(
}
label={formatMessage('apps.searchApp')}
- data-test="search-for-app-text-field"
+ inputProps={{
+ 'data-test': 'search-for-app-text-field',
+ }}
/>
@@ -109,7 +111,10 @@ export default function AddNewAppConnection(
{loading && (
-
+
)}
{!loading &&
diff --git a/packages/web/src/components/ExecutionStep/index.tsx b/packages/web/src/components/ExecutionStep/index.tsx
index 26b1616b..82564e8a 100644
--- a/packages/web/src/components/ExecutionStep/index.tsx
+++ b/packages/web/src/components/ExecutionStep/index.tsx
@@ -37,10 +37,12 @@ function ExecutionStepDate(props: Pick) {
const relativeCreatedAt = createdAt.toRelative();
return (
-
+
{formatMessage('executionStep.executedAt', {
- datetime: relativeCreatedAt
+ datetime: relativeCreatedAt,
})}
@@ -117,7 +119,7 @@ export default function ExecutionStep(
-
+
diff --git a/packages/web/src/components/PowerInput/index.tsx b/packages/web/src/components/PowerInput/index.tsx
index 9322abfd..4ca5c80e 100644
--- a/packages/web/src/components/PowerInput/index.tsx
+++ b/packages/web/src/components/PowerInput/index.tsx
@@ -60,11 +60,13 @@ const PowerInput = (props: PowerInputProps) => {
const [showVariableSuggestions, setShowVariableSuggestions] =
React.useState(false);
- const disappearSuggestionsOnShift = (event: React.KeyboardEvent) => {
+ const disappearSuggestionsOnShift = (
+ event: React.KeyboardEvent
+ ) => {
if (event.code === 'Tab') {
setShowVariableSuggestions(false);
}
- }
+ };
const stepsWithVariables = React.useMemo(() => {
return processStepWithExecutions(priorStepsWithExecutions);
@@ -112,7 +114,10 @@ const PowerInput = (props: PowerInputProps) => {
}}
>
{/* ref-able single child for ClickAwayListener */}
-
+
{
/>
{/* ghost placer for the variables popover */}
-
+
)}
/>
diff --git a/yarn.lock b/yarn.lock
index 035f2d89..b92cfad6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1469,38 +1469,6 @@
resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-12.0.0.tgz#a9583a75c3f150667771f30b60d9f059473e62c4"
integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==
-"@cypress/request@^2.88.10":
- version "2.88.10"
- resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce"
- integrity sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==
- dependencies:
- aws-sign2 "~0.7.0"
- aws4 "^1.8.0"
- caseless "~0.12.0"
- combined-stream "~1.0.6"
- extend "~3.0.2"
- forever-agent "~0.6.1"
- form-data "~2.3.2"
- http-signature "~1.3.6"
- is-typedarray "~1.0.0"
- isstream "~0.1.2"
- json-stringify-safe "~5.0.1"
- mime-types "~2.1.19"
- performance-now "^2.1.0"
- qs "~6.5.2"
- safe-buffer "^5.1.2"
- tough-cookie "~2.5.0"
- tunnel-agent "^0.6.0"
- uuid "^8.3.2"
-
-"@cypress/xvfb@^1.2.4":
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a"
- integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==
- dependencies:
- debug "^3.1.0"
- lodash.once "^4.1.1"
-
"@dabh/diagnostics@^2.0.2":
version "2.0.2"
resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.2.tgz#290d08f7b381b8f94607dc8f471a12c675f9db31"
@@ -3380,6 +3348,16 @@
dependencies:
"@octokit/openapi-types" "^11.2.0"
+"@playwright/test@^1.36.2":
+ version "1.36.2"
+ resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.36.2.tgz#9edd68a02b0929c5d78d9479a654ceb981dfb592"
+ integrity sha512-2rVZeyPRjxfPH6J0oGJqE8YxiM1IBRyM8hyrXYK7eSiAqmbNhxwcLa7dZ7fy9Kj26V7FYia5fh9XJRq4Dqme+g==
+ dependencies:
+ "@types/node" "*"
+ playwright-core "1.36.2"
+ optionalDependencies:
+ fsevents "2.3.2"
+
"@pmmmwh/react-refresh-webpack-plugin@^0.5.3":
version "0.5.4"
resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.4.tgz#df0d0d855fc527db48aac93c218a0bf4ada41f99"
@@ -4154,11 +4132,6 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.42.tgz#2f021733232c2130c26f9eabbdd3bfd881774733"
integrity sha512-aI3/oo5DzyiI5R/xAhxxRzfZlWlsbbqdgxfTPkqu/Zt+23GXiJvMCyPJT4+xKSXOnLqoL8jJYMLTwvK2M3a5hw==
-"@types/node@^14.14.31":
- version "14.18.31"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.31.tgz#4b873dea3122e71af4f77e65ec5841397ff254d3"
- integrity sha512-vQAnaReSQkEDa8uwAyQby8bYGKu84R/deEc6mg5T8fX6gzCn8QW6rziSgsti1fNvsrswKUKPnVTi7uoB+u62Mw==
-
"@types/node@^15.6.1":
version "15.14.9"
resolved "https://registry.yarnpkg.com/@types/node/-/node-15.14.9.tgz#bc43c990c3c9be7281868bbc7b8fdd6e2b57adfa"
@@ -4360,16 +4333,11 @@
dependencies:
"@types/sinonjs__fake-timers" "*"
-"@types/sinonjs__fake-timers@*", "@types/sinonjs__fake-timers@8.1.1":
+"@types/sinonjs__fake-timers@*":
version "8.1.1"
resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3"
integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==
-"@types/sizzle@^2.3.2":
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef"
- integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==
-
"@types/sockjs@^0.3.33":
version "0.3.33"
resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f"
@@ -4477,13 +4445,6 @@
dependencies:
"@types/yargs-parser" "*"
-"@types/yauzl@^2.9.1":
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599"
- integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==
- dependencies:
- "@types/node" "*"
-
"@types/yup@0.29.11":
version "0.29.11"
resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.29.11.tgz#d654a112973f5e004bf8438122bd7e56a8e5cd7e"
@@ -5270,11 +5231,6 @@ ansi-align@^3.0.0:
dependencies:
string-width "^4.1.0"
-ansi-colors@^4.1.1:
- version "4.1.3"
- resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
- integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==
-
ansi-escapes@^3.1.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
@@ -5364,11 +5320,6 @@ aproba@^1.0.3:
resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
-arch@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11"
- integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==
-
are-we-there-yet@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c"
@@ -5546,11 +5497,6 @@ async@^2.6.2:
dependencies:
lodash "^4.17.14"
-async@^3.2.0:
- version "3.2.4"
- resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c"
- integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==
-
async@^3.2.3:
version "3.2.3"
resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9"
@@ -5952,12 +5898,7 @@ bl@^4.0.3, bl@^4.1.0:
inherits "^2.0.4"
readable-stream "^3.4.0"
-blob-util@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb"
- integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==
-
-bluebird@^3.5.5, bluebird@^3.7.2:
+bluebird@^3.5.5:
version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
@@ -6082,11 +6023,6 @@ bser@2.1.1:
dependencies:
node-int64 "^0.4.0"
-buffer-crc32@~0.2.3:
- version "0.2.13"
- resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
- integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
-
buffer-equal-constant-time@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
@@ -6116,7 +6052,7 @@ buffer@4.9.2:
ieee754 "^1.1.4"
isarray "^1.0.0"
-buffer@^5.5.0, buffer@^5.6.0:
+buffer@^5.5.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
@@ -6232,11 +6168,6 @@ cacheable-request@^6.0.0:
normalize-url "^4.1.0"
responselike "^1.0.2"
-cachedir@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8"
- integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==
-
call-bind@^1.0.0, call-bind@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
@@ -6376,11 +6307,6 @@ charenc@0.0.2:
resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=
-check-more-types@^2.24.0:
- version "2.24.0"
- resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600"
- integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==
-
check-types@^11.1.1:
version "11.1.2"
resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f"
@@ -6501,15 +6427,6 @@ cli-spinners@^2.5.0:
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d"
integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==
-cli-table3@~0.6.1:
- version "0.6.3"
- resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2"
- integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==
- dependencies:
- string-width "^4.2.0"
- optionalDependencies:
- "@colors/colors" "1.5.0"
-
cli-table@^0.3.1:
version "0.3.11"
resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.11.tgz#ac69cdecbe81dccdba4889b9a18b7da312a9d3ee"
@@ -6692,7 +6609,7 @@ colord@^2.9.1:
resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1"
integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==
-colorette@2.0.19, colorette@^2.0.10, colorette@^2.0.16:
+colorette@2.0.19, colorette@^2.0.10:
version "2.0.19"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
@@ -6740,11 +6657,6 @@ commander@^2.20.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
-commander@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
- integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
-
commander@^7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
@@ -7401,54 +7313,6 @@ currently-unhandled@^0.4.1:
dependencies:
array-find-index "^1.0.1"
-cypress@^10.9.0:
- version "10.9.0"
- resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.9.0.tgz#273a61a6304766f9d6423e5ac8d4a9a11ed8b485"
- integrity sha512-MjIWrRpc+bQM9U4kSSdATZWZ2hUqHGFEQTF7dfeZRa4MnalMtc88FIE49USWP2ZVtfy5WPBcgfBX+YorFqGElA==
- dependencies:
- "@cypress/request" "^2.88.10"
- "@cypress/xvfb" "^1.2.4"
- "@types/node" "^14.14.31"
- "@types/sinonjs__fake-timers" "8.1.1"
- "@types/sizzle" "^2.3.2"
- arch "^2.2.0"
- blob-util "^2.0.2"
- bluebird "^3.7.2"
- buffer "^5.6.0"
- cachedir "^2.3.0"
- chalk "^4.1.0"
- check-more-types "^2.24.0"
- cli-cursor "^3.1.0"
- cli-table3 "~0.6.1"
- commander "^5.1.0"
- common-tags "^1.8.0"
- dayjs "^1.10.4"
- debug "^4.3.2"
- enquirer "^2.3.6"
- eventemitter2 "6.4.7"
- execa "4.1.0"
- executable "^4.1.1"
- extract-zip "2.0.1"
- figures "^3.2.0"
- fs-extra "^9.1.0"
- getos "^3.2.1"
- is-ci "^3.0.0"
- is-installed-globally "~0.4.0"
- lazy-ass "^1.6.0"
- listr2 "^3.8.3"
- lodash "^4.17.21"
- log-symbols "^4.0.0"
- minimist "^1.2.6"
- ospath "^1.2.2"
- pretty-bytes "^5.6.0"
- proxy-from-env "1.0.0"
- request-progress "^3.0.0"
- semver "^7.3.2"
- supports-color "^8.1.1"
- tmp "~0.2.1"
- untildify "^4.0.0"
- yauzl "^2.10.0"
-
damerau-levenshtein@^1.0.7:
version "1.0.8"
resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7"
@@ -7502,11 +7366,6 @@ dateformat@^4.5.0:
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5"
integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==
-dayjs@^1.10.4:
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.5.tgz#00e8cc627f231f9499c19b38af49f56dc0ac5e93"
- integrity sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==
-
db-errors@^0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/db-errors/-/db-errors-0.2.3.tgz#a6a38952e00b20e790f2695a6446b3c65497ffa2"
@@ -7526,7 +7385,7 @@ debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, de
dependencies:
ms "2.1.2"
-debug@^3.1.0, debug@^3.1.1, debug@^3.2.7:
+debug@^3.1.1, debug@^3.2.7:
version "3.2.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
@@ -7961,6 +7820,11 @@ dotenv@^10.0.0:
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81"
integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==
+dotenv@^16.3.1:
+ version "16.3.1"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e"
+ integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==
+
duplexer3@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
@@ -8072,13 +7936,6 @@ enhanced-resolve@^5.10.0:
graceful-fs "^4.2.4"
tapable "^2.2.0"
-enquirer@^2.3.6:
- version "2.3.6"
- resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
- integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
- dependencies:
- ansi-colors "^4.1.1"
-
entities@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
@@ -8799,11 +8656,6 @@ etag@~1.8.1:
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
-eventemitter2@6.4.7:
- version "6.4.7"
- resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d"
- integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==
-
eventemitter3@^4.0.0, eventemitter3@^4.0.4:
version "4.0.7"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
@@ -8819,7 +8671,20 @@ events@^3.2.0:
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
-execa@4.1.0, execa@^4.1.0:
+execa@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
+ integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==
+ dependencies:
+ cross-spawn "^6.0.0"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+execa@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a"
integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==
@@ -8834,19 +8699,6 @@ execa@4.1.0, execa@^4.1.0:
signal-exit "^3.0.2"
strip-final-newline "^2.0.0"
-execa@^0.10.0:
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
- integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==
- dependencies:
- cross-spawn "^6.0.0"
- get-stream "^3.0.0"
- is-stream "^1.1.0"
- npm-run-path "^2.0.0"
- p-finally "^1.0.0"
- signal-exit "^3.0.0"
- strip-eof "^1.0.0"
-
execa@^5.0.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
@@ -8862,13 +8714,6 @@ execa@^5.0.0:
signal-exit "^3.0.3"
strip-final-newline "^2.0.0"
-executable@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c"
- integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==
- dependencies:
- pify "^2.2.0"
-
exit@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
@@ -8988,17 +8833,6 @@ external-editor@^3.0.3:
iconv-lite "^0.4.24"
tmp "^0.0.33"
-extract-zip@2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a"
- integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==
- dependencies:
- debug "^4.1.1"
- get-stream "^5.1.0"
- yauzl "^2.10.0"
- optionalDependencies:
- "@types/yauzl" "^2.9.1"
-
extsprintf@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
@@ -9099,13 +8933,6 @@ fb-watchman@^2.0.0:
dependencies:
bser "2.1.1"
-fd-slicer@~1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
- integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==
- dependencies:
- pend "~1.2.0"
-
fecha@^4.2.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.1.tgz#0a83ad8f86ef62a091e22bb5a039cd03d23eecce"
@@ -9400,7 +9227,7 @@ fs.realpath@^1.0.0:
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
-fsevents@^2.3.2, fsevents@~2.3.2:
+fsevents@2.3.2, fsevents@^2.3.2, fsevents@~2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
@@ -9554,13 +9381,6 @@ getopts@2.3.0:
resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4"
integrity sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==
-getos@^3.2.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5"
- integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==
- dependencies:
- async "^3.2.0"
-
getpass@^0.1.1:
version "0.1.7"
resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
@@ -10133,15 +9953,6 @@ http-signature@~1.2.0:
jsprim "^1.2.2"
sshpk "^1.7.0"
-http-signature@~1.3.6:
- version "1.3.6"
- resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9"
- integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==
- dependencies:
- assert-plus "^1.0.0"
- jsprim "^2.0.2"
- sshpk "^1.14.1"
-
https-proxy-agent@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
@@ -10521,13 +10332,6 @@ is-ci@^2.0.0:
dependencies:
ci-info "^2.0.0"
-is-ci@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867"
- integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==
- dependencies:
- ci-info "^3.2.0"
-
is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.0, is-core-module@^2.8.1:
version "2.8.1"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
@@ -10598,7 +10402,7 @@ is-hotkey@^0.1.6:
resolved "https://registry.yarnpkg.com/is-hotkey/-/is-hotkey-0.1.8.tgz#6b1f4b2d0e5639934e20c05ed24d623a21d36d25"
integrity sha512-qs3NZ1INIS+H+yeo7cD9pDfwYV/jqRh1JG9S9zYrNudkoUQg7OL7ziXqRKu+InFjUIDoP2o6HIkLYMh1pcWgyQ==
-is-installed-globally@^0.4.0, is-installed-globally@~0.4.0:
+is-installed-globally@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520"
integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==
@@ -11528,16 +11332,6 @@ jsprim@^1.2.2:
json-schema "0.4.0"
verror "1.10.0"
-jsprim@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d"
- integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==
- dependencies:
- assert-plus "1.0.0"
- extsprintf "1.3.0"
- json-schema "0.4.0"
- verror "1.10.0"
-
"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b"
@@ -11644,11 +11438,6 @@ latest-version@^5.1.0:
dependencies:
package-json "^6.3.0"
-lazy-ass@^1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513"
- integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==
-
lerna@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/lerna/-/lerna-4.0.0.tgz#b139d685d50ea0ca1be87713a7c2f44a5b678e9e"
@@ -11725,20 +11514,6 @@ lines-and-columns@^1.1.6:
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
-listr2@^3.8.3:
- version "3.14.0"
- resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e"
- integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==
- dependencies:
- cli-truncate "^2.1.0"
- colorette "^2.0.16"
- log-update "^4.0.0"
- p-map "^4.0.0"
- rfdc "^1.3.0"
- rxjs "^7.5.1"
- through "^2.3.8"
- wrap-ansi "^7.0.0"
-
load-json-file@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
@@ -11903,11 +11678,6 @@ lodash.merge@^4.6.2:
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
-lodash.once@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
- integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
-
lodash.set@^4.3.2:
version "4.3.2"
resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23"
@@ -11951,16 +11721,6 @@ log-symbols@^4.0.0, log-symbols@^4.1.0:
chalk "^4.1.0"
is-unicode-supported "^0.1.0"
-log-update@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1"
- integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==
- dependencies:
- ansi-escapes "^4.3.0"
- cli-cursor "^3.1.0"
- slice-ansi "^4.0.0"
- wrap-ansi "^6.2.0"
-
logform@^2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/logform/-/logform-2.3.2.tgz#68babe6a74ab09a1fd15a9b1e6cbc7713d41cb5b"
@@ -13384,11 +13144,6 @@ osenv@^0.1.4:
os-homedir "^1.0.0"
os-tmpdir "^1.0.0"
-ospath@^1.2.2:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b"
- integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==
-
p-cancelable@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
@@ -13771,11 +13526,6 @@ pause@0.0.1:
resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d"
integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==
-pend@~1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
- integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
-
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
@@ -13852,7 +13602,7 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3:
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-pify@^2.2.0, pify@^2.3.0:
+pify@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
@@ -13928,6 +13678,11 @@ pkg-up@^3.1.0:
dependencies:
find-up "^3.0.0"
+playwright-core@1.36.2:
+ version "1.36.2"
+ resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.36.2.tgz#32382f2d96764c24c65a86ea336cf79721c2e50e"
+ integrity sha512-sQYZt31dwkqxOrP7xy2ggDfEzUxM1lodjhsQ3NMMv5uGTRDsLxU0e4xf4wwMkF2gplIxf17QMBCodSFgm6bFVQ==
+
plur@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/plur/-/plur-4.0.0.tgz#729aedb08f452645fe8c58ef115bf16b0a73ef84"
@@ -14549,7 +14304,7 @@ prettier@^2.5.1:
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a"
integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==
-pretty-bytes@^5.3.0, pretty-bytes@^5.4.1, pretty-bytes@^5.6.0:
+pretty-bytes@^5.3.0, pretty-bytes@^5.4.1:
version "5.6.0"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb"
integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==
@@ -14690,11 +14445,6 @@ proxy-addr@~2.0.7:
forwarded "0.2.0"
ipaddr.js "1.9.1"
-proxy-from-env@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee"
- integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==
-
psl@^1.1.28, psl@^1.1.33:
version "1.8.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
@@ -15416,13 +15166,6 @@ replace-ext@^1.0.0:
resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a"
integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==
-request-progress@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe"
- integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==
- dependencies:
- throttleit "^1.0.0"
-
request@^2.88.0, request@^2.88.2:
version "2.88.2"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
@@ -15562,11 +15305,6 @@ reusify@^1.0.4:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
-rfdc@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b"
- integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==
-
rimraf@^2.6.1, rimraf@^2.6.3:
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
@@ -15631,13 +15369,6 @@ rxjs@^7.2.0:
dependencies:
tslib "^2.1.0"
-rxjs@^7.5.1:
- version "7.5.7"
- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39"
- integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==
- dependencies:
- tslib "^2.1.0"
-
safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@@ -16077,15 +15808,6 @@ slice-ansi@^3.0.0:
astral-regex "^2.0.0"
is-fullwidth-code-point "^3.0.0"
-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"
-
slide@^1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
@@ -16302,7 +16024,7 @@ sprintf-js@~1.0.2:
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
-sshpk@^1.14.1, sshpk@^1.7.0:
+sshpk@^1.7.0:
version "1.17.0"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5"
integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==
@@ -16919,11 +16641,6 @@ throat@^6.0.1:
resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375"
integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==
-throttleit@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c"
- integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==
-
through2@^2.0.0, through2@^2.0.1:
version "2.0.5"
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
@@ -16939,7 +16656,7 @@ through2@^4.0.0:
dependencies:
readable-stream "3"
-through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8:
+through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
@@ -16988,13 +16705,6 @@ tmp@^0.1.0:
dependencies:
rimraf "^2.6.3"
-tmp@~0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
- integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
- dependencies:
- rimraf "^3.0.0"
-
tmpl@1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
@@ -18154,15 +17864,6 @@ wrap-ansi@^2.0.0:
string-width "^1.0.1"
strip-ansi "^3.0.1"
-wrap-ansi@^6.2.0:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
- integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
- dependencies:
- ansi-styles "^4.0.0"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
-
wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
@@ -18386,14 +18087,6 @@ yarn@^1.22.17:
resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.17.tgz#bf910747d22497b573131f7341c0e1d15c74036c"
integrity sha512-H0p241BXaH0UN9IeH//RT82tl5PfNraVpSpEoW+ET7lmopNC61eZ+A+IDvU8FM6Go5vx162SncDL8J1ZjRBriQ==
-yauzl@^2.10.0:
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
- integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==
- dependencies:
- buffer-crc32 "~0.2.3"
- fd-slicer "~1.1.0"
-
yeoman-environment@^3.9.1:
version "3.9.1"
resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-3.9.1.tgz#21912bdee4b1d302a5c25a7d31338fa092ea7116"