From 0a748ec87d1449a2063741f57ef608eb3fd74496 Mon Sep 17 00:00:00 2001 From: Stefan Date: Sun, 16 Jan 2022 17:33:10 +0100 Subject: [PATCH 1/8] feat: integrate e2e tests --- .github/workflows/e2e.yml | 17 + .gitignore | 4 + cypress.json | 19 + cypress/plugins/index.js | 22 + cypress/support/commands.js | 25 + cypress/support/index.js | 20 + e2e/fixtures/colors/blue.jpg | Bin 0 -> 1020 bytes e2e/fixtures/colors/green.jpg | Bin 0 -> 1020 bytes e2e/fixtures/colors/red.jpg | Bin 0 -> 1255 bytes e2e/helpers/asset.helper.js | 27 + e2e/helpers/content-types.helper.js | 43 + e2e/helpers/group.helper.js | 25 + e2e/helpers/settings.helper.js | 7 + e2e/helpers/tags.helper.js | 24 + e2e/helpers/user.helper.js | 34 + .../1-authentication/1-initial.spec.ts | 17 + .../1-authentication/2-login.spec.ts | 25 + .../2-dashboard/1-navigation.spec.ts | 43 + e2e/integration/3-assets/1-folder.spec.ts | 52 + .../3-assets/2-folder-list.spec.ts | 52 + e2e/integration/3-assets/3-image.spec.ts | 39 + e2e/integration/3-assets/4-rename.spec.ts | 23 + .../4-content-types/1-basic.spec.ts | 127 + e2e/integration/7-tags/1-basic.spec.ts | 50 + e2e/integration/7-tags/1-simple.spec.ts | 48 + e2e/integration/7-tags/2-tree.spec.ts | 70 + e2e/integration/8-users/1-profile.spec.ts | 36 + e2e/integration/8-users/2-operations.spec.ts | 43 + e2e/integration/8-users/3-membership.spec.ts | 119 + e2e/integration/9-settings/1-general.spec.ts | 11 + e2e/integration/9-settings/2-groups.spec.ts | 44 + .../9-settings/3-groups-permissions.spec.ts | 74 + e2e/plugins/index.ts | 22 + e2e/support/commands.ts | 62 + e2e/support/extensions/user.commands.ts | 65 + e2e/support/index.ts | 6 + package-lock.json | 2046 +++++++++++++++-- package.json | 16 +- .../components/fields-select-panel.tsx | 1 + tsconfig.json | 3 +- 40 files changed, 3170 insertions(+), 191 deletions(-) create mode 100644 .github/workflows/e2e.yml create mode 100644 cypress.json create mode 100644 cypress/plugins/index.js create mode 100644 cypress/support/commands.js create mode 100644 cypress/support/index.js create mode 100644 e2e/fixtures/colors/blue.jpg create mode 100644 e2e/fixtures/colors/green.jpg create mode 100644 e2e/fixtures/colors/red.jpg create mode 100644 e2e/helpers/asset.helper.js create mode 100644 e2e/helpers/content-types.helper.js create mode 100644 e2e/helpers/group.helper.js create mode 100644 e2e/helpers/settings.helper.js create mode 100644 e2e/helpers/tags.helper.js create mode 100644 e2e/helpers/user.helper.js create mode 100644 e2e/integration/1-authentication/1-initial.spec.ts create mode 100644 e2e/integration/1-authentication/2-login.spec.ts create mode 100644 e2e/integration/2-dashboard/1-navigation.spec.ts create mode 100644 e2e/integration/3-assets/1-folder.spec.ts create mode 100644 e2e/integration/3-assets/2-folder-list.spec.ts create mode 100644 e2e/integration/3-assets/3-image.spec.ts create mode 100644 e2e/integration/3-assets/4-rename.spec.ts create mode 100644 e2e/integration/4-content-types/1-basic.spec.ts create mode 100644 e2e/integration/7-tags/1-basic.spec.ts create mode 100644 e2e/integration/7-tags/1-simple.spec.ts create mode 100644 e2e/integration/7-tags/2-tree.spec.ts create mode 100644 e2e/integration/8-users/1-profile.spec.ts create mode 100644 e2e/integration/8-users/2-operations.spec.ts create mode 100644 e2e/integration/8-users/3-membership.spec.ts create mode 100644 e2e/integration/9-settings/1-general.spec.ts create mode 100644 e2e/integration/9-settings/2-groups.spec.ts create mode 100644 e2e/integration/9-settings/3-groups-permissions.spec.ts create mode 100644 e2e/plugins/index.ts create mode 100644 e2e/support/commands.ts create mode 100644 e2e/support/extensions/user.commands.ts create mode 100644 e2e/support/index.ts diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml new file mode 100644 index 0000000..5630ca0 --- /dev/null +++ b/.github/workflows/e2e.yml @@ -0,0 +1,17 @@ +name: E2E Tests + +on: [push] + +jobs: + cypress-run: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: E2E Tests + uses: cypress-io/github-action@v2 + with: + install: npm ci + build: npm run build + start: npm run e2e diff --git a/.gitignore b/.gitignore index e5a2511..613eaa1 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,7 @@ project/ .next next.config.js next-env.d.ts + +# Cypress / E2E +e2e/videos +e2e/screenshots diff --git a/cypress.json b/cypress.json new file mode 100644 index 0000000..0d7eafd --- /dev/null +++ b/cypress.json @@ -0,0 +1,19 @@ +{ + "chromeWebSecurity": false, + "baseUrl": "http://localhost:4000/admin", + "env": { + "apiUrl": "http://localhost:4000/api", + "firstName": "John", + "lastName": "Doe", + "email": "john.doe@burdy.io", + "password": "test1234@" + }, + "fileServerFolder": "e2e", + "downloadsFolder": "e2e/downloads", + "fixturesFolder": "e2e/fixtures", + "integrationFolder": "e2e/integration", + "screenshotsFolder": "e2e/screenshots", + "videosFolder": "e2e/videos", + "supportFile": "e2e/support/index.ts", + "pluginsFile": "e2e/plugins/index.ts" +} diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js new file mode 100644 index 0000000..59b2bab --- /dev/null +++ b/cypress/plugins/index.js @@ -0,0 +1,22 @@ +/// +// *********************************************************** +// This example plugins/index.js can be used to load plugins +// +// You can change the location of this file or turn off loading +// the plugins file with the 'pluginsFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/plugins-guide +// *********************************************************** + +// This function is called when a project is opened or re-opened (e.g. due to +// the project's config changing) + +/** + * @type {Cypress.PluginConfig} + */ +// eslint-disable-next-line no-unused-vars +module.exports = (on, config) => { + // `on` is used to hook into various events Cypress emits + // `config` is the resolved Cypress config +} diff --git a/cypress/support/commands.js b/cypress/support/commands.js new file mode 100644 index 0000000..119ab03 --- /dev/null +++ b/cypress/support/commands.js @@ -0,0 +1,25 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) diff --git a/cypress/support/index.js b/cypress/support/index.js new file mode 100644 index 0000000..d68db96 --- /dev/null +++ b/cypress/support/index.js @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/index.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/e2e/fixtures/colors/blue.jpg b/e2e/fixtures/colors/blue.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d5f905549c2d94648ca5499ead6ddc32029477c GIT binary patch literal 1020 zcmd^+&q@O^5XNVcoi^QMw@I6I$_%Pz3kKmt+ zFX7d678az%ws@_Rxn%gwO!9s4HGYDfjH@vqBAoDn_znHh?euasy&B%#%&v#W)!BLc zfDuR`>f}f`Nf9LprR{c0nba7aYMtdho8>Oo+7{OJeF(vH_XdR@^nCF35R}}LP=~1F zGoATAM|=jSU=DMM4unJLFup+G_rr21E*Jc(l{%^T4n`sfD=h#%eVraHH}3GQ%bIw* zq6j>&B8qiF68rZx;eID1Vu>3G@k6ZL(kh!RYY8k5cuV6FNcO{4hmZdxFSZz9w;Iq8 J8|1Btw*~XMphExv literal 0 HcmV?d00001 diff --git a/e2e/fixtures/colors/green.jpg b/e2e/fixtures/colors/green.jpg new file mode 100644 index 0000000000000000000000000000000000000000..96d220a516b66ab6e971733e04a9165cccb8ecbd GIT binary patch literal 1020 zcmd^+!Ab)$5Qb-xoo>3xZj&}ydl0NovWG&o1;JMkEa<_D6g>J0K8+U-f_Ui3v)YSK zVmb>8(qdbB)yZ5kd^3~$e|(Q$U?-#T2oMoY`9S=J-tcyMF`Hfv?yhH7gOl;ud0fB{ zq!4v-B%Gv(l7zA}Z7Gu(qcg4ZqHFWQ6-dlG6BwSBI0 zzjwqJa0=!ym*_w^ln&!71b#oP264IMU#-*O}HuIWR?OORY_1?9h4d^Zv=Ga-)IsuDOIH*F>tPRL>Q< zaDTS2flaZ+R+5FVBrSy}cz!>2E#Y*kX?R603BpJN(BtM~y<2$1r#@@q%$_1x zvmz<$L`s}KG=%+`kVG|g65^XU*d?ypE(Zy!&$vrFB}kr!3HbLTRG@p;%&)uF5*?e= G5HDYo%{?Cg literal 0 HcmV?d00001 diff --git a/e2e/helpers/asset.helper.js b/e2e/helpers/asset.helper.js new file mode 100644 index 0000000..58a9a75 --- /dev/null +++ b/e2e/helpers/asset.helper.js @@ -0,0 +1,27 @@ + +export const AssetHelper = { + createFolder: (name = '') => { + cy.get('[data-cy="assets-commandBar-new"]').click(); + cy.get('[data-cy="assets-commandBar-new-folder"]').click(); + cy.get('[data-cy=assets-createFolder-name]').click(); + cy.get('[data-cy=assets-createFolder-name]').type(name); + cy.get('[data-cy=assets-createFolder-submit]').click(); + }, + deleteAction: () => { + cy.get('[data-cy="assets-commandBar-delete"]').click(); + cy.get('[data-cy="assets-deleteConfirm"]').click(); + }, + renameAction: (name = '') => { + cy.get('[data-cy="assets-commandBar-rename"]').click(); + cy.get('[data-cy="assets-rename-name"]').clear().type(name); + cy.get('[data-cy="assets-rename-submit"]').click(); + }, + selectors: { + assetTileSelect: '[data-automationid="ListCell"] .ms-Tile-check', + assetTile: '[data-automationid="ListCell"] .ms-Tile', + listItem: '[data-automationid="DetailsRowCell"][data-automation-key="column2"]', + listItemSelect: '[data-automationid="ListCell"] .ms-Check', + dropzone: '[data-name="dropzone"]' + } +} + diff --git a/e2e/helpers/content-types.helper.js b/e2e/helpers/content-types.helper.js new file mode 100644 index 0000000..c92a0ca --- /dev/null +++ b/e2e/helpers/content-types.helper.js @@ -0,0 +1,43 @@ + +export const ContentTypesHelper = { + create: (name, fields, option = 0) => { + cy.get('[data-cy="contentTypes-commandBar-new"]').click(); + + cy.get('[data-cy="contentTypes-add-name"]').type(name); + cy.get('[data-cy="contentTypes-add-type"]').click(); + + cy.get('.ms-Dropdown-item[data-index]').should('have.length', 4); + cy.get(`.ms-Dropdown-item[data-index="${option}"]`).click(); + + fields.forEach(({name, label, type}) => { + cy.get('[data-cy="contentTypes-fieldsList-addField"]').click(); + + cy.get('[data-cy="contentTypes-fieldsSelect"]') + .find(ContentTypesHelper.selectors.fieldListItem) + .contains(type) + .click(); + + cy.get('[data-cy="contentTypes-fieldsSelect-config"]').click(); + cy.get('[data-cy="contentTypes-fieldsConfig-name"]').type(name); + cy.get('[data-cy="contentTypes-fieldsConfig-label"]').type(label); + cy.get('[data-cy="contentTypes-fieldsConfig-confirm"]').click(); + + cy.get('[data-cy="contentTypes-fieldsList-item-title"]').should('exist'); + }) + + cy.get('[data-cy="contentTypes-add-confirm"]').click(); + + cy.get(ContentTypesHelper.selectors.contentTypesListItem) + .contains(name) + .should('exist'); + }, + deleteSelected: () => { + cy.get('[data-cy="contentTypes-commandBar-delete"]').click(); + cy.get('[data-cy="dialog-confirm"]').click(); + }, + selectors: { + fieldListItem: '[data-automationid="ListCell"]', + contentTypesListItem: '[data-automationid="ListCell"]' + } +} + diff --git a/e2e/helpers/group.helper.js b/e2e/helpers/group.helper.js new file mode 100644 index 0000000..71348bc --- /dev/null +++ b/e2e/helpers/group.helper.js @@ -0,0 +1,25 @@ + +export const GroupHelper = { + createGroup: (name, description) => { + cy.get('[data-cy="groups-commandBar-add"]').click(); + cy.get('[data-cy="groups-add-name"]').type(name); + cy.get('[data-cy="groups-add-description"]').type(description); + cy.get('[data-cy="groups-add-submit"]').click(); + }, + editGroup: (name, description) => { + cy.get('[data-cy="groups-commandBar-edit"]').click(); + cy.get('[data-cy="groups-edit-name"]').clear().type(name); + cy.get('[data-cy="groups-edit-description"]').clear().type(description); + cy.get('[data-cy="groups-edit-submit"]').click(); + }, + deleteSelected: () => { + cy.get('[data-cy="groups-commandBar-delete"]').click(); + cy.get('[data-cy="dialog-confirm"]').click(); + }, + selectors: { + listItemSelect: '[data-automationid="ListCell"] .ms-Check', + listItem: '[data-automationid="ListCell"]', + permissionItem: '[data-automationid="ListCell"]' + } +} + diff --git a/e2e/helpers/settings.helper.js b/e2e/helpers/settings.helper.js new file mode 100644 index 0000000..71ff81e --- /dev/null +++ b/e2e/helpers/settings.helper.js @@ -0,0 +1,7 @@ + +export const SettingsHelper = { + selectors: { + adminEmail: '[data-cy="settings-adminEmail"]', + submit: '[data-cy="settings-submit"]' + } +} diff --git a/e2e/helpers/tags.helper.js b/e2e/helpers/tags.helper.js new file mode 100644 index 0000000..338d09c --- /dev/null +++ b/e2e/helpers/tags.helper.js @@ -0,0 +1,24 @@ + +export const TagsHelper = { + createTag: (name, slug) => { + cy.get('[data-cy="tags-commandBar-new"]').click(); + cy.get('[data-cy="tags-create-name"]').clear().type(name); + cy.get('[data-cy="tags-create-slug"]').clear().type(slug); + cy.get('[data-cy="tags-create-submit"]').click(); + }, + updateTag: (name, slug) => { + cy.get('[data-cy="tags-commandBar-update"]').click(); + cy.get('[data-cy="tags-update-name"]').clear().type(name); + cy.get('[data-cy="tags-update-slug"]').clear().type(slug); + cy.get('[data-cy="tags-update-submit"]').click(); + }, + deleteSelected: () => { + cy.get('[data-cy="tags-commandBar-delete"]').click(); + cy.get('[data-cy="dialog-confirm"]').click(); + }, + selectors: { + item: '[data-cy="columns-view-item"]', + column: '[data-cy="columns-view-column"]', + container: '[data-cy="columns-view"]', + } +} diff --git a/e2e/helpers/user.helper.js b/e2e/helpers/user.helper.js new file mode 100644 index 0000000..45a9b9a --- /dev/null +++ b/e2e/helpers/user.helper.js @@ -0,0 +1,34 @@ + +export const UserHelper = { + createUser: (email, firstName, lastName) => { + cy.get('[data-cy="users-commandBar-add"]').click(); + cy.get('[data-cy="users-add-email"]').type(email); + cy.get('[data-cy="users-add-password"]').type('test-password'); + cy.get('[data-cy="users-add-firstName"]').type(firstName); + cy.get('[data-cy="users-add-lastName"]').type(lastName); + cy.get('[data-cy="users-add-submit"]').click(); + }, + editUser: (firstName, lastName) => { + cy.get('[data-cy="users-commandBar-edit"]').click(); + cy.get('[data-cy="users-edit-firstName"]').clear().type(firstName); + cy.get('[data-cy="users-edit-lastName"]').clear().type(lastName); + cy.get('[data-cy="users-edit-submit"]').click(); + }, + deleteSelected: () => { + cy.get('[data-cy="users-commandBar-delete"]').click(); + cy.get('[data-cy="dialog-confirm"]').click(); + }, + deactivateSelected: () => { + cy.get('[data-cy="users-commandBar-deactivate"]').click(); + cy.get('[data-cy="dialog-confirm"]').click(); + }, + activateSelected: () => { + cy.get('[data-cy="users-commandBar-activate"]').click(); + cy.get('[data-cy="dialog-confirm"]').click(); + }, + selectors: { + listItemSelect: '[data-automationid="ListCell"] .ms-Check', + listItem: '[data-automationid="ListCell"]', + groupRow: '[data-automationid="DetailsRow"]', + } +} diff --git a/e2e/integration/1-authentication/1-initial.spec.ts b/e2e/integration/1-authentication/1-initial.spec.ts new file mode 100644 index 0000000..801a07d --- /dev/null +++ b/e2e/integration/1-authentication/1-initial.spec.ts @@ -0,0 +1,17 @@ + + +describe('Initialization Test', () => { + it('creates first account', () => { + cy.visit('/'); + + cy.location('pathname').should('eq', '/admin/init'); + + cy.get('[data-cy="welcome-firstName"]').type(Cypress.env('firstName')); + cy.get('[data-cy="welcome-lastName"]').type(Cypress.env('lastName')); + cy.get('[data-cy="welcome-email"]').type(Cypress.env('email')); + cy.get('[data-cy="welcome-password"]').type(Cypress.env('password')); + cy.get('[data-cy="welcome-submit"]').click(); + + cy.location('pathname').should('eq', '/admin/'); + }) +}) diff --git a/e2e/integration/1-authentication/2-login.spec.ts b/e2e/integration/1-authentication/2-login.spec.ts new file mode 100644 index 0000000..ba545cc --- /dev/null +++ b/e2e/integration/1-authentication/2-login.spec.ts @@ -0,0 +1,25 @@ + + +describe('Login test', () => { + it('logs in', () => { + cy.clearCookie('token'); + cy.visit('/'); + cy.location('pathname').should('eq', '/admin/login'); + + cy.get('[data-cy="login-email"]').type(Cypress.env('email')); + cy.get('[data-cy="login-password"]').type(Cypress.env('password')); + cy.get('[data-cy="login-submit"]').click(); + + cy.location('pathname').should('eq', '/admin/'); + }) + + it('logs out', () => { + cy.visit('/'); + + cy.get('.ms-Persona-initials').click(); + cy.get('.ms-ContextualMenu-item:nth-child(2) .ms-ContextualMenu-itemText').click(); + cy.wait(500); + cy.getCookie('token').should('be.null'); + cy.location('pathname').should('eq', '/admin/login'); + }); +}) diff --git a/e2e/integration/2-dashboard/1-navigation.spec.ts b/e2e/integration/2-dashboard/1-navigation.spec.ts new file mode 100644 index 0000000..8a0487c --- /dev/null +++ b/e2e/integration/2-dashboard/1-navigation.spec.ts @@ -0,0 +1,43 @@ + + +describe('Dashboard Navigation', () => { + before(() => { + cy.login(); + }); + + it('navigates to assets', () => { + cy.visit('/'); + cy.get('[data-cy=dashboard-assets]').click(); + cy.location('pathname').should('eq', '/admin/assets'); + }) + + it('navigates to sites', () => { + cy.visit('/'); + cy.get('[data-cy=dashboard-sites]').click(); + cy.location('pathname').should('eq', '/admin/sites'); + }) + + it('navigates to content types', () => { + cy.visit('/'); + cy.get('[data-cy=dashboard-content-types]').click(); + cy.location('pathname').should('eq', '/admin/content-types'); + }) + + it('navigates to tags', () => { + cy.visit('/'); + cy.get('[data-cy=dashboard-tags]').click(); + cy.location('pathname').should('eq', '/admin/tags'); + }) + + it('navigates to users', () => { + cy.visit('/'); + cy.get('[data-cy=dashboard-users]').click(); + cy.location('pathname').should('eq', '/admin/users'); + }) + + it('navigates to settings', () => { + cy.visit('/'); + cy.get('[data-cy=dashboard-settings]').click(); + cy.location('pathname').should('eq', '/admin/settings'); + }) +}) diff --git a/e2e/integration/3-assets/1-folder.spec.ts b/e2e/integration/3-assets/1-folder.spec.ts new file mode 100644 index 0000000..3b5ac8e --- /dev/null +++ b/e2e/integration/3-assets/1-folder.spec.ts @@ -0,0 +1,52 @@ +import {AssetHelper} from '../../helpers/asset.helper' + +describe('General Folder Tests', () => { + before(() => { + cy.login(); + }) + + beforeEach(() => { + cy.setLocalStorage('assetDefaultView', '"tiles"'); + }) + + it('creates a folder', () => { + cy.visit('/assets'); + AssetHelper.createFolder('Root Folder'); + cy.contains('.page-content', 'Root Folder'); + cy.get('body').find(AssetHelper.selectors.assetTile).should('have.length', 1); + }) + + it('creates multi-level folders', () => { + cy.visit('/assets'); + + cy.get(AssetHelper.selectors.assetTile).first().click(); + + AssetHelper.createFolder('Sub Folder 1'); + AssetHelper.createFolder('Sub Folder 2'); + AssetHelper.createFolder('Sub Folder 3'); + + cy.get('body').find(AssetHelper.selectors.assetTile).should('have.length', 3); + }) + + it('deletes multiple folders', () => { + cy.visit('/assets'); + + cy.get(AssetHelper.selectors.assetTile).first().click(); + + cy.get(AssetHelper.selectors.assetTileSelect).eq(0).click(); + cy.get(AssetHelper.selectors.assetTileSelect).eq(1).click(); + + AssetHelper.deleteAction(); + + cy.get('body').find(AssetHelper.selectors.assetTile).should('have.length', 1); + }) + + it('deletes root folder', () => { + cy.visit('/assets'); + cy.get(AssetHelper.selectors.assetTileSelect).first().click(); + + AssetHelper.deleteAction(); + + cy.get('body').find(AssetHelper.selectors.assetTile).should('have.length', 0); + }) +}) diff --git a/e2e/integration/3-assets/2-folder-list.spec.ts b/e2e/integration/3-assets/2-folder-list.spec.ts new file mode 100644 index 0000000..c24a31b --- /dev/null +++ b/e2e/integration/3-assets/2-folder-list.spec.ts @@ -0,0 +1,52 @@ +import {AssetHelper} from '../../helpers/asset.helper' + +describe('General Folder Tests', () => { + before(() => { + cy.login(); + }) + + beforeEach(() => { + cy.setLocalStorage('assetDefaultView', '"list"'); + }) + + it('creates a folder', () => { + cy.visit('/assets'); + AssetHelper.createFolder('Root Folder'); + cy.contains('.page-content', 'Root Folder'); + cy.get('body').find(AssetHelper.selectors.listItem).should('have.length', 1); + }) + + it('creates multi-level folders', () => { + cy.visit('/assets'); + + cy.get(AssetHelper.selectors.listItem).first().click(); + + AssetHelper.createFolder('Sub Folder 1'); + AssetHelper.createFolder('Sub Folder 2'); + AssetHelper.createFolder('Sub Folder 3'); + + cy.get('body').find(AssetHelper.selectors.listItem).should('have.length', 3); + }) + + it('deletes multiple folders', () => { + cy.visit('/assets'); + + cy.get(AssetHelper.selectors.listItem).first().click(); + + cy.get(AssetHelper.selectors.listItemSelect).eq(0).click(); + cy.get(AssetHelper.selectors.listItemSelect).eq(1).click(); + + AssetHelper.deleteAction(); + + cy.get('body').find('[data-automationid="ListCell"]').should('have.length', 1); + }) + + it('deletes root folder', () => { + cy.visit('/assets'); + cy.get(AssetHelper.selectors.listItemSelect).first().click(); + + AssetHelper.deleteAction(); + + cy.get('body').find(AssetHelper.selectors.listItem).should('have.length', 0); + }) +}) diff --git a/e2e/integration/3-assets/3-image.spec.ts b/e2e/integration/3-assets/3-image.spec.ts new file mode 100644 index 0000000..c35ff29 --- /dev/null +++ b/e2e/integration/3-assets/3-image.spec.ts @@ -0,0 +1,39 @@ +import {AssetHelper} from '../../helpers/asset.helper' + +describe('Assets', () => { + before(() => { + cy.login(); + }) + + beforeEach(() => { + cy.setLocalStorage('assetDefaultView', '"tiles"'); + }) + + it('uploads files', () => { + cy.visit('/assets'); + cy.get(AssetHelper.selectors.dropzone) + .attachFile( + ['colors/red.jpg', 'colors/blue.jpg', 'colors/green.jpg'], + {subjectType: 'drag-n-drop'} + ); + + cy.get('body').find(AssetHelper.selectors.assetTile).should('have.length', 3); + }) + + it('validates file details', () => { + cy.visit('/assets'); + cy.get(AssetHelper.selectors.assetTile).each(e => {cy.wait(500); + cy.get(e).click(); + cy.get('[data-cy="assets-commandBar-details"]').click(); + cy.get('[data-cy="assets-details-mimeType"]').contains('image/jpeg').should('exist'); + cy.get('[data-cy="assets-details-close"]').click(); + }); + }) + + it('deletes files', () => { + cy.visit('/assets'); + cy.get(AssetHelper.selectors.assetTileSelect).each(e => e.click()); + AssetHelper.deleteAction(); + cy.get('body').find(AssetHelper.selectors.assetTile).should('have.length', 0); + }) +}) diff --git a/e2e/integration/3-assets/4-rename.spec.ts b/e2e/integration/3-assets/4-rename.spec.ts new file mode 100644 index 0000000..adcf1fb --- /dev/null +++ b/e2e/integration/3-assets/4-rename.spec.ts @@ -0,0 +1,23 @@ +import {AssetHelper} from '../../helpers/asset.helper' + +describe('Asset Rename Test', () => { + before(() => { + cy.login(); + }) + + beforeEach(() => { + cy.setLocalStorage('assetDefaultView', '"tiles"'); + }) + + it('renames folder', () => { + cy.visit('/assets'); + AssetHelper.createFolder('Root Folder'); + cy.get(AssetHelper.selectors.assetTile).contains('Root Folder').should('have.length', 1); + cy.get(AssetHelper.selectors.assetTileSelect).first().click(); + AssetHelper.renameAction('Renamed Folder'); + cy.get(AssetHelper.selectors.assetTile).contains('Renamed Folder').should('have.length', 1); + cy.get(AssetHelper.selectors.assetTileSelect).click(); + AssetHelper.deleteAction(); + cy.get(AssetHelper.selectors.assetTile).should('have.length', 0); + }); +}) diff --git a/e2e/integration/4-content-types/1-basic.spec.ts b/e2e/integration/4-content-types/1-basic.spec.ts new file mode 100644 index 0000000..4ed824f --- /dev/null +++ b/e2e/integration/4-content-types/1-basic.spec.ts @@ -0,0 +1,127 @@ +import {ContentTypesHelper} from '../../helpers/content-types.helper' +import faker from 'faker'; + +describe('Basic Content Types Test', () => { + const contentTypeName = faker.random.word().toLowerCase(); + const newContentTypeName = faker.random.word().toLowerCase(); + + before(() => { + cy.login(); + }) + + it('creates a content type', () => { + cy.visit('/content-types'); + + cy.get('[data-cy="contentTypes-commandBar-new"]').click(); + + cy.get('[data-cy="contentTypes-add-name"]').type(contentTypeName); + cy.get('[data-cy="contentTypes-add-type"]').click(); + + cy.get('.ms-Dropdown-item[data-index]').should('have.length', 4); + cy.get('.ms-Dropdown-item[data-index="0"]').click(); + + cy.get('[data-cy="contentTypes-fieldsList-addField"]').click(); + cy.get('[data-cy="contentTypes-fieldsSelect"]') + .find(ContentTypesHelper.selectors.fieldListItem) + .should('have.length.at.least', 10); + + cy.get('[data-cy="contentTypes-fieldsSelect-search"]').type('Text'); + + cy.get('[data-cy="contentTypes-fieldsSelect"]') + .find(ContentTypesHelper.selectors.fieldListItem) + .contains(/^Text$/) + .click(); + + cy.get('[data-cy="contentTypes-fieldsConfig-label"]').type('Title'); + cy.get('[data-cy="contentTypes-fieldsConfig-confirm"]').click(); + + cy.get('[data-cy="contentTypes-fieldsList-item-title"]').should('exist'); + + cy.get('[data-cy="contentTypes-fieldsList-addField"]').click(); + + cy.get('[data-cy="contentTypes-fieldsSelect-search"]').type('Rich Text'); + + cy.get('[data-cy="contentTypes-fieldsSelect"]') + .find(ContentTypesHelper.selectors.fieldListItem) + .contains(/^Rich Text$/) + .click(); + + cy.get('[data-cy="contentTypes-fieldsConfig-label"]').type('Content'); + cy.get('[data-cy="contentTypes-fieldsConfig-confirm"]').click(); + + cy.get('[data-cy="contentTypes-fieldsList-item-content"]').should('exist'); + + cy.get('[data-cy="contentTypes-add-confirm"]').click(); + + cy.get(ContentTypesHelper.selectors.contentTypesListItem) + .contains(contentTypeName) + .should('exist'); + }) + + it('validates content type details', () => { + cy.visit('/content-types'); + + cy.get(ContentTypesHelper.selectors.contentTypesListItem).should('have.length', 1); + + cy.get(ContentTypesHelper.selectors.contentTypesListItem) + .find('[data-automation-key="name"]') + .contains(contentTypeName) + .should('exist') + + cy.get(ContentTypesHelper.selectors.contentTypesListItem) + .find('[data-automation-key="type"]') + .contains('page') + .should('exist') + + cy.get(ContentTypesHelper.selectors.contentTypesListItem) + .find('[data-automation-key="author"]') + .contains(`${Cypress.env('firstName')} ${Cypress.env('lastName')}`) + .should('exist') + }) + + it('updates a content type', () => { + cy.visit('/content-types'); + + cy.get(ContentTypesHelper.selectors.contentTypesListItem).first().click(); + cy.get('[data-cy="contentTypes-commandBar-edit"]').click(); + + cy.get('[data-cy="contentTypes-edit-name"]').should('have.value', contentTypeName); + cy.get('[data-cy^="contentTypes-fieldsList-item"]').should('have.length', 2); + + cy.get('[data-cy="contentTypes-edit-name"]').clear().type(newContentTypeName); + + cy.get('[data-cy="contentTypes-fieldsList-addField"]').click(); + + cy.get('[data-cy="contentTypes-fieldsSelect-search"]').type('Assets') + + cy.get('[data-cy="contentTypes-fieldsSelect"]') + .find(ContentTypesHelper.selectors.fieldListItem) + .contains(/^Assets$/) + .click(); + + cy.get('[data-cy="contentTypes-fieldsConfig-label"]').type('Thumbnail'); + cy.get('[data-cy="contentTypes-fieldsConfig-confirm"]').click(); + + cy.get('[data-cy="contentTypes-fieldsList-item-thumbnail"]').should('exist'); + + cy.get('[data-cy^="contentTypes-fieldsList-item"]').should('have.length', 3); + cy.get('[data-cy="contentTypes-edit-confirm"]').click(); + + cy.get(ContentTypesHelper.selectors.contentTypesListItem) + .contains(newContentTypeName) + .should('exist'); + }) + + it('deletes a content type', () => { + cy.visit('/content-types'); + cy.get(ContentTypesHelper.selectors.contentTypesListItem) + .contains(newContentTypeName) + .should('exist'); + + cy.get(ContentTypesHelper.selectors.contentTypesListItem).first().click(); + + ContentTypesHelper.deleteSelected(); + + cy.get(ContentTypesHelper.selectors.contentTypesListItem).should('not.exist'); + }) +}) diff --git a/e2e/integration/7-tags/1-basic.spec.ts b/e2e/integration/7-tags/1-basic.spec.ts new file mode 100644 index 0000000..4374d3e --- /dev/null +++ b/e2e/integration/7-tags/1-basic.spec.ts @@ -0,0 +1,50 @@ +import {TagsHelper} from '../../helpers/tags.helper' + +describe('Basic Tag Test', () => { + before(() => { + cy.login(); + }) + + it('creates a tag', () => { + cy.visit('/tags'); + TagsHelper.createTag('First', 'first'); + cy.wait(500); + cy.get(TagsHelper.selectors.container).contains('first').should('have.length', 1); + }) + + it('has correct details', () => { + cy.visit('/tags'); + cy.get(TagsHelper.selectors.container).contains('first') + .closest(TagsHelper.selectors.item) + .click(); + + cy.get('[data-cy="tags-details-name"]').contains('First').should('have.length', 1); + cy.get('[data-cy="tags-details-slug"]').contains('first').should('have.length', 1); + cy.get('[data-cy="tags-details-author"]') + .contains(`${Cypress.env('firstName')} ${Cypress.env('lastName')}`) + .should('have.length', 1); + }) + + it('updates a tag', () => { + cy.visit('/tags'); + cy.get(TagsHelper.selectors.container).contains('first') + .closest(TagsHelper.selectors.item) + .click(); + + TagsHelper.updateTag('Updated', 'updated'); + cy.wait(500); + cy.get(TagsHelper.selectors.item).contains('updated').should('have.length', 1); + }) + + it('deletes a tag', () => { + cy.visit('/tags'); + cy.get(TagsHelper.selectors.item).contains('updated') + .closest(TagsHelper.selectors.item) + .find('.ms-Check') + .click(); + + TagsHelper.deleteSelected(); + cy.wait(500); + cy.get(TagsHelper.selectors.container).contains('updated').should('have.length', 0); + }) +}) diff --git a/e2e/integration/7-tags/1-simple.spec.ts b/e2e/integration/7-tags/1-simple.spec.ts new file mode 100644 index 0000000..d156288 --- /dev/null +++ b/e2e/integration/7-tags/1-simple.spec.ts @@ -0,0 +1,48 @@ +import {TagsHelper} from '../../helpers/tags.helper' + +describe('Simple Tag Test', () => { + before(() => { + cy.login(); + }) + + it('creates a tag', () => { + cy.visit('/tags'); + TagsHelper.createTag('First', 'first'); + cy.wait(500); + cy.get(TagsHelper.selectors.container).contains('first').should('have.length', 1); + }) + + it('has correct details', () => { + cy.visit('/tags'); + cy.get(TagsHelper.selectors.container).contains('first') + .closest(TagsHelper.selectors.item) + .click(); + + cy.get('[data-cy="tags-details-name"]').contains('First').should('have.length', 1); + cy.get('[data-cy="tags-details-slug"]').contains('first').should('have.length', 1); + cy.get('[data-cy="tags-details-author"]').contains(`${Cypress.env('firstName')} ${Cypress.env('lastName')}`).should('have.length', 1); + }) + + it('updates a tag', () => { + cy.visit('/tags'); + cy.get(TagsHelper.selectors.container).contains('first') + .closest(TagsHelper.selectors.item) + .click(); + + TagsHelper.updateTag('Updated', 'updated'); + cy.wait(500); + cy.get(TagsHelper.selectors.item).contains('updated').should('have.length', 1); + }) + + it('deletes a tag', () => { + cy.visit('/tags'); + cy.get(TagsHelper.selectors.item).contains('updated') + .closest(TagsHelper.selectors.item) + .find('.ms-Check') + .click(); + + TagsHelper.deleteSelected(); + cy.wait(500); + cy.get(TagsHelper.selectors.container).contains('updated').should('have.length', 0); + }) +}) diff --git a/e2e/integration/7-tags/2-tree.spec.ts b/e2e/integration/7-tags/2-tree.spec.ts new file mode 100644 index 0000000..537f599 --- /dev/null +++ b/e2e/integration/7-tags/2-tree.spec.ts @@ -0,0 +1,70 @@ +import {TagsHelper} from '../../helpers/tags.helper' + +describe('Tag Tree Test', () => { + before(() => { + cy.login(); + }) + + it('creates a tree', () => { + cy.visit('/tags'); + // 1 Parent and 3 children + TagsHelper.createTag('Parent', 'parent'); + cy.wait(500); + cy.get(TagsHelper.selectors.container).contains('parent') + .closest(TagsHelper.selectors.item) + .click(); + + TagsHelper.createTag('Child 1', 'child-1'); + TagsHelper.createTag('Child 2', 'child-2'); + TagsHelper.createTag('Child 3', 'child-3'); + cy.wait(250); + + cy.get(TagsHelper.selectors.item + ':contains("child-")').should('have.length', 3); + }) + + it('updates the root tag', () => { + cy.visit('/tags'); + + cy.get(TagsHelper.selectors.container).contains('parent') + .closest(TagsHelper.selectors.item) + .click(); + + TagsHelper.updateTag('Parent Updated', 'parent-updated'); + + cy.get(TagsHelper.selectors.container).contains('parent-updated').should('have.length', 1); + }) + + it('deletes multiple tags', () => { + cy.visit('/tags'); + + cy.get(TagsHelper.selectors.container).contains('parent-updated') + .closest(TagsHelper.selectors.item) + .click(); + + cy.get(TagsHelper.selectors.container).contains('child-1') + .closest(TagsHelper.selectors.item) + .click(); + + cy.get(TagsHelper.selectors.container).contains('child-2') + .closest(TagsHelper.selectors.item) + .find('.ms-Check') + .click(); + + TagsHelper.deleteSelected(); + + cy.wait(500); + cy.get(TagsHelper.selectors.item).should('have.length', 1); + }) + + it('deletes the root tag', () => { + cy.visit('/tags'); + + cy.get(TagsHelper.selectors.container).contains('parent-updated') + .closest(TagsHelper.selectors.item) + .click(); + + TagsHelper.deleteSelected(); + + cy.get(TagsHelper.selectors.container).find(TagsHelper.selectors.item).should('have.length', 0) + }) +}) diff --git a/e2e/integration/8-users/1-profile.spec.ts b/e2e/integration/8-users/1-profile.spec.ts new file mode 100644 index 0000000..d4635f2 --- /dev/null +++ b/e2e/integration/8-users/1-profile.spec.ts @@ -0,0 +1,36 @@ +import {UserHelper} from '../../helpers/user.helper' +import faker from 'faker'; + + +describe('User Profile Test', () => { + before(() => { + cy.login(); + }) + + it('updates profile', () => { + cy.visit('/users') + const firstName = faker.name.firstName(); + const lastName = faker.name.lastName(); + + cy.findUser(Cypress.env('email')).dblclick(); + + cy.editUser({ + basic: { firstName, lastName } + }) + + cy.findUser(Cypress.env('email')).should('contain', `${firstName} ${lastName}`); + + cy.wait(500); + + cy.findUser(Cypress.env('email')).dblclick(); + + cy.editUser({ + basic: { + firstName: Cypress.env('firstName'), + lastName: Cypress.env('lastName') + } + }) + + cy.findUser(Cypress.env('email')).should('contain', `${Cypress.env('firstName')} ${Cypress.env('lastName')}`); + }) +}) diff --git a/e2e/integration/8-users/2-operations.spec.ts b/e2e/integration/8-users/2-operations.spec.ts new file mode 100644 index 0000000..56dff2b --- /dev/null +++ b/e2e/integration/8-users/2-operations.spec.ts @@ -0,0 +1,43 @@ +import faker from 'faker'; + +describe('User Operations Test', () => { + const email = faker.internet.email().toLowerCase(); + + before(() => { + cy.login(); + }) + + it('creates a user', () => { + cy.visit('/users'); + cy.createUser({email}); + }) + + it('verifies user exists', () => { + cy.visit('/users'); + cy.findUser(email).should('exist'); + }) + + it('activates and deactivates a user', () => { + cy.visit('/users'); + + cy.selectUser(email); + cy.findUser(email).should('contain', 'active'); + + cy.deactivateSelectedUsers(); + + cy.findUser(email).should('contain', 'disabled'); + + cy.activateSelectedUsers(); + + cy.findUser(email).should('contain', 'active'); + }) + + it('deletes a user', () => { + cy.visit('/users'); + + cy.findUser(email).click(); + cy.deleteSelectedUsers(); + + cy.userList().should('not.contain', email); + }) +}) diff --git a/e2e/integration/8-users/3-membership.spec.ts b/e2e/integration/8-users/3-membership.spec.ts new file mode 100644 index 0000000..ce578a0 --- /dev/null +++ b/e2e/integration/8-users/3-membership.spec.ts @@ -0,0 +1,119 @@ +import {UserHelper} from '../../helpers/user.helper' +import faker from 'faker'; + +describe('User Membership Test', () => { + const email = faker.internet.email().toLowerCase(); + + before(() => { + cy.login(); + }) + + it('creates a user with groups', () => { + cy.visit('/users'); + + cy.get('[data-cy="users-commandBar-add"]').click(); + cy.get('[data-cy="users-add-email"]').type(email); + cy.get('[data-cy="users-add-password"]').type('test-password'); + cy.get('[data-cy="users-add-firstName"]').type('Test'); + cy.get('[data-cy="users-add-lastName"]').type('Member'); + + cy.get('[data-cy="users-add-tabs"] [data-content="Groups"]').click(); + cy.get('[data-cy="users-groups"]') + .find(UserHelper.selectors.groupRow) + .should('have.length', 0); + + cy.get('[data-cy="users-groups-add"]').click(); + cy.get('[data-cy="users-groups-panel"]') + .find(UserHelper.selectors.groupRow) + .should('have.length', 2); + + cy.get(`[data-cy="users-groups-panel"] ${UserHelper.selectors.groupRow} .ms-Check`).each(e => e.click()); + cy.get('[data-cy="users-groups-submit"]').click(); + + cy.get('[data-cy="users-groups"]') + .find(UserHelper.selectors.groupRow) + .should('have.length', 2); + + cy.get('[data-cy="users-groups-add"]').click(); + cy.get('[data-cy="users-groups-panel"]') + .find(UserHelper.selectors.groupRow) + .should('have.length', 0); + + cy.get('[data-cy="users-groups-cancel"]').click(); + cy.get('[data-cy="users-groups"]').find(UserHelper.selectors.groupRow).eq(1).click(); + cy.get('[data-cy="users-groups-remove"]').click(); + cy.get('[data-cy="users-groups"]') + .find(UserHelper.selectors.groupRow) + .should('have.length', 1); + + cy.get('[data-cy="users-add-submit"]').click(); + + cy.wait(500); + + cy.get(UserHelper.selectors.listItem).contains(email) + .closest(UserHelper.selectors.listItem) + .contains('Admin') + .should('have.length', 1); + }); + + it('updates a user with groups', () => { + cy.visit('/users'); + + cy.get(UserHelper.selectors.listItem).contains(email) + .closest(UserHelper.selectors.listItem) + .click(); + + cy.get('[data-cy="users-commandBar-edit"]').click(); + + cy.get('[data-cy="users-edit-tabs"] [data-content="Groups"]').click(); + cy.get('[data-cy="users-groups"]') + .find(UserHelper.selectors.groupRow) + .contains('Admin') + .should('have.length', 1); + + cy.get('[data-cy="users-groups-add"]').click(); + cy.get('[data-cy="users-groups-panel"]') + .find(UserHelper.selectors.groupRow) + .should('have.length', 1); + + cy.get('[data-cy="users-groups-cancel"]').click(); + cy.get('[data-cy="users-groups"]') + .find(UserHelper.selectors.groupRow) + .first() + .click(); + + cy.get('[data-cy="users-groups-remove"]').click(); + cy.get('[data-cy="users-groups-add"]').click(); + + cy.get('[data-cy="users-groups-panel"]') + .find(UserHelper.selectors.groupRow) + .should('have.length', 2); + + cy.get('[data-cy="users-groups-panel"]').contains('User') + .closest(UserHelper.selectors.groupRow) + .click(); + + cy.get('[data-cy="users-groups-submit"]').click(); + cy.get('[data-cy="users-groups"]').contains('User') + .should('have.length', 1); + + cy.get('[data-cy="users-edit-submit"]').click(); + + cy.get(UserHelper.selectors.listItem).contains(email) + .closest(UserHelper.selectors.listItem) + .contains('User') + .should('have.length', 1); + }); + + it('deletes a user with groups', () => { + cy.visit('/users'); + + cy.get(UserHelper.selectors.listItem).contains(email) + .closest(UserHelper.selectors.listItem) + .click(); + + UserHelper.deleteSelected(); + + cy.get(UserHelper.selectors.listItem).contains(email).should('have.length', 0); + }) +}) diff --git a/e2e/integration/9-settings/1-general.spec.ts b/e2e/integration/9-settings/1-general.spec.ts new file mode 100644 index 0000000..e66b53f --- /dev/null +++ b/e2e/integration/9-settings/1-general.spec.ts @@ -0,0 +1,11 @@ +import {SettingsHelper} from '../../helpers/settings.helper' + +describe('Settings Test', () => { + before(() => { + cy.login(); + }) + + it('visits the settings', () => { + cy.visit('/settings/general') + }) +}) diff --git a/e2e/integration/9-settings/2-groups.spec.ts b/e2e/integration/9-settings/2-groups.spec.ts new file mode 100644 index 0000000..5ab96c9 --- /dev/null +++ b/e2e/integration/9-settings/2-groups.spec.ts @@ -0,0 +1,44 @@ +import {SettingsHelper} from '../../helpers/settings.helper' +import {GroupHelper} from '../../helpers/group.helper' + +describe('Groups Test', () => { + before(() => { + cy.login(); + }) + + it('has default groups', () => { + cy.visit('/settings/groups'); + cy.get(GroupHelper.selectors.listItemSelect).should('have.length', 2); + }) + + it('creates a group', () => { + cy.visit('/settings/groups') + GroupHelper.createGroup('Test Group', 'Test Description'); + cy.wait(500); + cy.get(GroupHelper.selectors.listItem).contains('Test Group') + .closest(GroupHelper.selectors.listItem) + .should('contain', 'Test Description'); + }) + + it('updates a group', () => { + cy.visit('/settings/groups') + cy.get(GroupHelper.selectors.listItem).contains('Test Group') + .closest(GroupHelper.selectors.listItem) + .find('.ms-Check').click(); + + GroupHelper.editGroup('Edited Group', 'Edited Description'); + cy.get(GroupHelper.selectors.listItem).contains('Edited Group') + .closest(GroupHelper.selectors.listItem) + .should('contain', 'Edited Description'); + }) + + it('deletes a group', () => { + cy.visit('/settings/groups') + cy.get(GroupHelper.selectors.listItem).contains('Edited Group') + .closest(GroupHelper.selectors.listItem) + .find('.ms-Check').click(); + + GroupHelper.deleteSelected(); + cy.get(GroupHelper.selectors.listItem).contains('Edited Group').should('have.length', 0); + }) +}) diff --git a/e2e/integration/9-settings/3-groups-permissions.spec.ts b/e2e/integration/9-settings/3-groups-permissions.spec.ts new file mode 100644 index 0000000..f5bcd0c --- /dev/null +++ b/e2e/integration/9-settings/3-groups-permissions.spec.ts @@ -0,0 +1,74 @@ +import {GroupHelper} from '../../helpers/group.helper' + +describe('Group Permissions Test', () => { + before(() => { + cy.login(); + }); + + it('creates a group with permissions', () => { + cy.visit('/settings/groups'); + + cy.get('[data-cy="groups-commandBar-add"]').click(); + + cy.get('[data-cy="groups-add-name"]').type('Permissions Group'); + cy.get('[data-cy="groups-add-description"]').type('Group with test permissions'); + + cy.get('[data-cy="permissions-chips"]') + .find('[data-cy="permissions-chips-item"]') + .should('have.length', 0); + + cy.get('[data-cy="groups-add-tabs"] [data-content="Manage Permissions"]').click(); + cy.get('[data-cy="groups-add"]') + .find(GroupHelper.selectors.permissionItem) + .first() + .find('.ms-Check') + .click(); + + cy.get('[data-cy="groups-add-tabs"] [data-content="General"]').click(); + cy.get('[data-cy="permissions-chips"]') + .find('[data-cy="permissions-chips-item"]') + .should('have.length.at.least', 1); + + cy.get('[data-cy="groups-add-submit"]').click(); + }) + + it('validates and updates permissions', () => { + cy.visit('/settings/groups'); + + cy.get(GroupHelper.selectors.listItem).contains('Permissions Group') + .closest(GroupHelper.selectors.listItem) + .dblclick(); + + cy.get('[data-cy="permissions-chips"]') + .find('[data-cy="permissions-chips-item"]') + .should('have.length.at.least', 1); + + cy.get('[data-cy="groups-edit-tabs"] [data-content="Manage Permissions"]').click(); + cy.get('[data-cy="groups-edit"]') + .find(GroupHelper.selectors.permissionItem) + .eq(2) + .find('.ms-Check') + .click(); + + cy.get('[data-cy="groups-edit-tabs"] [data-content="General"]').click(); + + cy.get('[data-cy="permissions-chips"]') + .find('[data-cy="permissions-chips-item"]') + .should('have.length.at.least', 1); + + cy.get('[data-cy="groups-edit-submit"]').click(); + }) + + it('deletes the group', () => { + cy.visit('/settings/groups'); + + cy.get(GroupHelper.selectors.listItem).contains('Permissions Group') + .closest(GroupHelper.selectors.listItem) + .click(); + + GroupHelper.deleteSelected(); + + cy.get(GroupHelper.selectors.listItem).contains('Permissions Group') + .should('have.length', 0); + }) +}) diff --git a/e2e/plugins/index.ts b/e2e/plugins/index.ts new file mode 100644 index 0000000..1b63c6e --- /dev/null +++ b/e2e/plugins/index.ts @@ -0,0 +1,22 @@ +/// +// *********************************************************** +// This example plugins/index.js can be used to load plugins +// +// You can change the location of this file or turn off loading +// the plugins file with the 'pluginsFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/plugins-guide +// *********************************************************** + +// This function is called when a project is opened or re-opened (e.g. due to +// the project's config changing) + +/** + * @type {Cypress.PluginConfig} + */ +// eslint-disable-next-line no-unused-vars +export default (on, config) => { + // `on` is used to hook into various events Cypress emits + // `config` is the resolved Cypress config +} diff --git a/e2e/support/commands.ts b/e2e/support/commands.ts new file mode 100644 index 0000000..6034819 --- /dev/null +++ b/e2e/support/commands.ts @@ -0,0 +1,62 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) +import "cypress-localstorage-commands" +import 'cypress-file-upload'; +import { IUser } from './extensions/user.commands'; +import './extensions/user.commands'; + +declare global { + namespace Cypress { + interface Chainable { + dataCy(value: string): Chainable; + } + + interface cy { + login(): void; + + // User + createUser(user: IUser): void; + editUser(user: IUser): void; + selectUser(email: string): void; + findUser(email: string): Chainable; + userList(): Chainable; + deleteSelectedUsers(): void; + deactivateSelectedUsers(): void; + activateSelectedUsers(): void; + } + } +} + +Cypress.Commands.add('login', () => { + cy.request('POST', `${Cypress.env('apiUrl')}/login`, { + email: Cypress.env('email'), + password: Cypress.env('password') + }) +}) + +Cypress.Commands.add('dataCy', (value) => { + return cy.get(`[data-cy="${value}"]`); +}) diff --git a/e2e/support/extensions/user.commands.ts b/e2e/support/extensions/user.commands.ts new file mode 100644 index 0000000..2e50fd6 --- /dev/null +++ b/e2e/support/extensions/user.commands.ts @@ -0,0 +1,65 @@ +import faker from 'faker'; +import { UserHelper } from '../../helpers/user.helper'; + +const selectors = { + listItemSelect: '[data-automationid="ListCell"] .ms-Check', + listItem: '[data-automationid="ListCell"]', + groupRow: '[data-automationid="DetailsRow"]', +} + +export interface IUser { + email?: string; + password?: string; + basic?: { + firstName: string; + lastName: string; + } + groups?: string[]; +} + +Cypress.Commands.add('createUser', (user: IUser) => { + cy.get('[data-cy="users-commandBar-add"]').click(); + cy.get('[data-cy="users-add-email"]').type(user.email ?? faker.internet.email()); + cy.get('[data-cy="users-add-password"]').type(user?.password ?? faker.internet.password(8)); + cy.get('[data-cy="users-add-firstName"]').type(user.basic?.firstName ?? faker.name.firstName()); + cy.get('[data-cy="users-add-lastName"]').type(user.basic?.lastName ?? faker.name.lastName()); + + cy.get('[data-cy="users-add-submit"]').click(); +}); + +Cypress.Commands.add('selectUser', (email: string) => { + cy.findUser(email).find('.ms-Check').click(); +}); + +Cypress.Commands.add('deleteSelectedUsers', () => { + cy.get('[data-cy="users-commandBar-delete"]').click(); + cy.get('[data-cy="dialog-confirm"]').click(); +}); + +Cypress.Commands.add('deactivateSelectedUsers', () => { + cy.get('[data-cy="users-commandBar-deactivate"]').click(); + cy.get('[data-cy="dialog-confirm"]').click(); +}); + +Cypress.Commands.add('activateSelectedUsers', () => { + cy.get('[data-cy="users-commandBar-activate"]').click(); + cy.get('[data-cy="dialog-confirm"]').click(); +}); + +Cypress.Commands.add('userList', () => { + cy.get(selectors.listItem); +}) + +Cypress.Commands.add('findUser', (email: string) => { + cy.userList().contains(email).closest(selectors.listItem); +}); + +Cypress.Commands.add('editUser', (user: IUser) => { + if (user.basic) { + cy.get('[data-cy="users-edit-firstName"]').clear().type(user.basic.firstName); + cy.get('[data-cy="users-edit-lastName"]').clear().type(user.basic.lastName); + } + + cy.get('[data-cy="users-edit-submit"]').click(); +}) + diff --git a/e2e/support/index.ts b/e2e/support/index.ts new file mode 100644 index 0000000..ae255ac --- /dev/null +++ b/e2e/support/index.ts @@ -0,0 +1,6 @@ +import './commands' + +Cypress.Cookies.defaults({ + preserve: ['token'] +}) + diff --git a/package-lock.json b/package-lock.json index 4ead9d7..062b44f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,12 @@ { "name": "burdy", - "version": "2.1.0", + "version": "2.1.1", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "2.1.0", + "name": "burdy", + "version": "2.1.1", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@babel/core": "^7.15.5", @@ -113,6 +114,7 @@ "@types/dotenv-flow": "^3.2.0", "@types/draft-js": "^0.11.5", "@types/express": "^4.17.13", + "@types/faker": "^5.5.9", "@types/fs-extra": "^9.0.12", "@types/http-proxy": "^1.17.7", "@types/lodash": "^4.14.172", @@ -132,7 +134,11 @@ "@types/webpack-env": "^1.16.2", "@typescript-eslint/eslint-plugin": "^4.30.0", "@typescript-eslint/parser": "^4.30.0", + "concurrently": "^7.0.0", "copyfiles": "^2.4.1", + "cypress": "^9.2.1", + "cypress-file-upload": "^5.0.8", + "cypress-localstorage-commands": "^1.6.1", "eslint": "^7.32.0", "eslint-config-airbnb": "^18.2.1", "eslint-config-airbnb-typescript": "^14.0.0", @@ -141,13 +147,15 @@ "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-react": "^7.25.1", "eslint-plugin-react-hooks": "^4.2.0", + "faker": "^5.5.3", "ncp": "^2.0.0", "prettier": "^2.3.2", "ts-node": "^10.2.1", "tsconfig-paths": "^3.11.0", "ttypescript": "^1.5.12", "typescript": "^4.4.2", - "typescript-transform-paths": "^3.3.1" + "typescript-transform-paths": "^3.3.1", + "wait-on": "^6.0.0" }, "peerDependencies": { "path-to-regexp": "^6.2.0" @@ -5613,6 +5621,83 @@ "node": ">=12" } }, + "node_modules/@cypress/request": { + "version": "2.88.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", + "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/request/node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@cypress/request/node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/@dabh/diagnostics": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", @@ -6061,6 +6146,21 @@ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "license": "0BSD" }, + "node_modules/@hapi/hoek": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==", + "dev": true + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, "node_modules/@hookform/resolvers": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-2.8.0.tgz", @@ -6275,6 +6375,27 @@ "node": ">= 8" } }, + "node_modules/@sideway/address": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.3.tgz", + "integrity": "sha512-8ncEUtmnTsMmL7z1YPB47kPUq7LpKWJNFPsRzHiIajGC5uXlWGn+AmkYPcHNl8S4tcEGx+cnORnNYaw2wvL+LQ==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "dev": true + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -6441,19 +6562,7 @@ "optional": true, "peer": true, "dependencies": { - "@node-rs/helper": "^1.0.0", - "@swc/core-android-arm64": "1.2.103", - "@swc/core-darwin-arm64": "1.2.103", - "@swc/core-darwin-x64": "1.2.103", - "@swc/core-freebsd-x64": "1.2.103", - "@swc/core-linux-arm-gnueabihf": "1.2.103", - "@swc/core-linux-arm64-gnu": "1.2.103", - "@swc/core-linux-arm64-musl": "1.2.103", - "@swc/core-linux-x64-gnu": "1.2.103", - "@swc/core-linux-x64-musl": "1.2.103", - "@swc/core-win32-arm64-msvc": "1.2.103", - "@swc/core-win32-ia32-msvc": "1.2.103", - "@swc/core-win32-x64-msvc": "1.2.103" + "@node-rs/helper": "^1.0.0" }, "engines": { "node": ">=10" @@ -6867,6 +6976,12 @@ "@types/range-parser": "*" } }, + "node_modules/@types/faker": { + "version": "5.5.9", + "resolved": "https://registry.npmjs.org/@types/faker/-/faker-5.5.9.tgz", + "integrity": "sha512-uCx6mP3UY5SIO14XlspxsGjgaemrxpssJI0Ol+GfhxtcKpv9pgRZYsS4eeKeHVLje6Qtc8lGszuBI461+gVZBA==", + "dev": true + }, "node_modules/@types/fs-extra": { "version": "9.0.12", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz", @@ -7114,6 +7229,18 @@ "@types/node": "*" } }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.4.tgz", + "integrity": "sha512-IFQTJARgMUBF+xVd2b+hIgXWrZEjND3vJtRCvIelcFB5SIXfjV4bOHbHJ0eXKh+0COrBRc8MqteKAz/j88rE0A==", + "dev": true + }, + "node_modules/@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, "node_modules/@types/unzipper": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/@types/unzipper/-/unzipper-0.10.4.tgz", @@ -7137,6 +7264,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/zen-observable": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz", @@ -7538,6 +7675,19 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -7682,6 +7832,26 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "license": "ISC" }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/archiver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", @@ -7856,8 +8026,7 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "optional": true, - "peer": true, + "devOptional": true, "dependencies": { "safer-buffer": "~2.1.0" } @@ -7866,8 +8035,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "optional": true, - "peer": true, + "devOptional": true, "engines": { "node": ">=0.8" } @@ -7914,8 +8082,16 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "optional": true, - "peer": true + "devOptional": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } }, "node_modules/attr-accept": { "version": "2.2.2", @@ -7967,8 +8143,7 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "optional": true, - "peer": true, + "devOptional": true, "engines": { "node": "*" } @@ -7977,8 +8152,7 @@ "version": "1.11.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "optional": true, - "peer": true + "devOptional": true }, "node_modules/axe-core": { "version": "4.1.4", @@ -8169,8 +8343,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "optional": true, - "peer": true, + "devOptional": true, "dependencies": { "tweetnacl": "^0.14.3" } @@ -8288,6 +8461,12 @@ "node": ">= 6" } }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, "node_modules/block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -8569,6 +8748,15 @@ "node": ">=8" } }, + "node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -8633,8 +8821,7 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "optional": true, - "peer": true + "devOptional": true }, "node_modules/chainsaw": { "version": "0.1.0", @@ -8663,6 +8850,15 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/chokidar": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", @@ -8671,7 +8867,6 @@ "dependencies": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -8723,6 +8918,15 @@ "node": ">= 4.0" } }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/cli-boxes": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", @@ -8734,6 +8938,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cli-highlight": { "version": "2.1.11", "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", @@ -8761,6 +8977,51 @@ "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "license": "MIT" }, + "node_modules/cli-table3": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", + "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "colors": "1.4.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -8871,8 +9132,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "optional": true, - "peer": true, + "devOptional": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -8894,6 +9154,15 @@ "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -8948,6 +9217,55 @@ "typedarray": "^0.0.6" } }, + "node_modules/concurrently": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.0.0.tgz", + "integrity": "sha512-WKM7PUsI8wyXpF80H+zjHP32fsgsHNQfPLw/e70Z5dYkV7hF+rf8q3D+ScWJIEr57CpkO3OWBko6hwhQLPR8Pw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "date-fns": "^2.16.1", + "lodash": "^4.17.21", + "rxjs": "^6.6.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^16.2.0" + }, + "bin": { + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.0 || >=16.0.0" + } + }, + "node_modules/concurrently/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -9374,19 +9692,200 @@ "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==", "license": "MIT" }, - "node_modules/damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "node_modules/cypress": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.2.1.tgz", + "integrity": "sha512-LVEe4yWCo4xO0Vd8iYjFHRyd5ulRvM56XqMgAdn05Qb9kJ6iJdO/MmjKD8gNd768698cp1FDuSmFQZHVZGk+Og==", "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "optional": true, - "peer": true, + "hasInstallScript": true, + "dependencies": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "^6.0.2", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "3.7.2", + "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.3", + "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.5", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "url": "^0.11.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/cypress-file-upload": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz", + "integrity": "sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g==", + "dev": true, + "engines": { + "node": ">=8.2.1" + }, + "peerDependencies": { + "cypress": ">3.0.0" + } + }, + "node_modules/cypress-localstorage-commands": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/cypress-localstorage-commands/-/cypress-localstorage-commands-1.6.1.tgz", + "integrity": "sha512-rvXCB0iLzC3i9y91XH4N2I55NicH62gQk5z/APblCjnNR3wWTbDs8svC7GvE1fjt9AMIHSQm1RfWx037y+TciQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "cypress": ">=2.1.0" + } + }, + "node_modules/cypress/node_modules/@types/node": { + "version": "14.18.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.5.tgz", + "integrity": "sha512-LMy+vDDcQR48EZdEx5wRX1q/sEl6NdGuHXPnfeL8ixkwCOSZ2qnIyIZmcCbdX0MeRqHhAcHmX+haCbrS8Run+A==", + "dev": true + }, + "node_modules/cypress/node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/cypress/node_modules/ci-info": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "dev": true + }, + "node_modules/cypress/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cypress/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/cypress/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cypress/node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/cypress/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/cypress/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/cypress/node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "devOptional": true, "dependencies": { "assert-plus": "^1.0.0" }, @@ -9407,6 +9906,12 @@ "url": "https://opencollective.com/date-fns" } }, + "node_modules/dayjs": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", + "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==", + "dev": true + }, "node_modules/debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -9528,8 +10033,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "optional": true, - "peer": true, + "devOptional": true, "engines": { "node": ">=0.4.0" } @@ -9797,8 +10301,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "optional": true, - "peer": true, + "devOptional": true, "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -10710,6 +11213,12 @@ "node": ">= 0.6" } }, + "node_modules/eventemitter2": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.5.tgz", + "integrity": "sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw==", + "dev": true + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -10725,6 +11234,65 @@ "node": ">=0.4.x" } }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/executable/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/exit-on-epipe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", @@ -10817,18 +11385,57 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "optional": true, - "peer": true + "devOptional": true + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "devOptional": true, "engines": [ "node >=0.6.0" - ], - "optional": true, - "peer": true + ] + }, + "node_modules/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", + "dev": true }, "node_modules/fast-deep-equal": { "version": "3.1.3", @@ -10912,6 +11519,15 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/fecha": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", @@ -11198,8 +11814,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "optional": true, - "peer": true, + "devOptional": true, "engines": { "node": "*" } @@ -11208,8 +11823,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "optional": true, - "peer": true, + "devOptional": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -11257,15 +11871,6 @@ "node": ">=12" } }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -11502,12 +12107,20 @@ "node": ">=6" } }, + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "dependencies": { + "async": "^3.2.0" + } + }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "optional": true, - "peer": true, + "devOptional": true, "dependencies": { "assert-plus": "^1.0.0" } @@ -11973,6 +12586,15 @@ "npm": ">=1.3.7" } }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -12111,6 +12733,15 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -12396,6 +13027,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-string": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", @@ -12430,6 +13072,18 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -12463,8 +13117,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "optional": true, - "peer": true + "devOptional": true }, "node_modules/jest-worker": { "version": "27.1.0", @@ -12503,6 +13156,19 @@ "node": ">= 0.6.0" } }, + "node_modules/joi": { + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.5.0.tgz", + "integrity": "sha512-R7hR50COp7StzLnDi4ywOXHrBrgNXuUUfJWIR5lPY5Bm/pOD3jZaTwpluUXVLRWcoWZxkrHBBJ5hLxgnlehbdw==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -12527,8 +13193,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true, - "peer": true + "devOptional": true }, "node_modules/jsesc": { "version": "2.5.2", @@ -12557,8 +13222,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "optional": true, - "peer": true + "devOptional": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -12577,8 +13241,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "optional": true, - "peer": true + "devOptional": true }, "node_modules/json5": { "version": "1.0.1", @@ -12598,22 +13261,12 @@ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.6", "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, - "node_modules/jsonfile/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/jsonwebtoken": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", @@ -12747,6 +13400,15 @@ "node": ">=8" } }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", + "dev": true, + "engines": { + "node": "> 0.8" + } + }, "node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", @@ -12777,6 +13439,39 @@ "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" }, + "node_modules/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "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" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -12954,6 +13649,54 @@ "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/logform": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", @@ -13191,6 +13934,15 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -14042,6 +14794,18 @@ "npm-normalize-package-bin": "^1.0.1" } }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -14371,6 +15135,21 @@ "fn.name": "1.x.x" } }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -14420,6 +15199,12 @@ "os-tmpdir": "^1.0.0" } }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=", + "dev": true + }, "node_modules/p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -14464,6 +15249,21 @@ "node": ">=8" } }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -14641,12 +15441,17 @@ "node": ">=8" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "optional": true, - "peer": true + "devOptional": true }, "node_modules/pg": { "version": "8.7.1", @@ -14990,6 +15795,18 @@ "node": ">=10.13.0" } }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pretty-error": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-3.0.4.tgz", @@ -15081,6 +15898,12 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "dev": true + }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -15091,8 +15914,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "optional": true, - "peer": true + "devOptional": true }, "node_modules/pstree.remy": { "version": "1.1.8", @@ -15134,8 +15956,7 @@ "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "optional": true, - "peer": true, + "devOptional": true, "engines": { "node": ">=0.6" } @@ -15812,6 +16633,15 @@ "node": ">= 6" } }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", + "dev": true, + "dependencies": { + "throttleit": "^1.0.0" + } + }, "node_modules/request/node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -15881,6 +16711,19 @@ "lowercase-keys": "^1.0.0" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -15891,6 +16734,12 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -15929,6 +16778,21 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rxjs": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.2.tgz", + "integrity": "sha512-PwDt186XaL3QN5qXj/H9DGyHhP3/RYYgZZwqBv9Tv8rsAaiwFH1IsJJlcgD37J7UW5a6O67qX0KWKS3/pu0m4w==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -16346,6 +17210,12 @@ "source-map": "^0.6.0" } }, + "node_modules/spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -16430,7 +17300,6 @@ "peer": true, "dependencies": { "node-addon-api": "^3.0.0", - "node-gyp": "3.x", "node-pre-gyp": "^0.11.0" }, "optionalDependencies": { @@ -16458,8 +17327,7 @@ "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "optional": true, - "peer": true, + "devOptional": true, "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -16704,6 +17572,15 @@ "node": ">=4" } }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -16987,6 +17864,18 @@ "node": ">=0.8" } }, + "node_modules/throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -17010,6 +17899,18 @@ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", "license": "MIT" }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -17085,8 +17986,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "optional": true, - "peer": true, + "devOptional": true, "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -17103,6 +18003,15 @@ "node": "*" } }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, "node_modules/triple-beam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", @@ -17247,8 +18156,7 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true, - "peer": true + "devOptional": true }, "node_modules/type-check": { "version": "0.4.0", @@ -17629,6 +18537,14 @@ "node": ">=8" } }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -17843,17 +18759,35 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "devOptional": true, "engines": [ "node >=0.6.0" ], - "optional": true, - "peer": true, "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, + "node_modules/wait-on": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.0.tgz", + "integrity": "sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw==", + "dev": true, + "dependencies": { + "axios": "^0.21.1", + "joi": "^17.4.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.1.0" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/watchpack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", @@ -18225,15 +19159,6 @@ "node": ">= 6.4.0" } }, - "node_modules/winston/node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/winston/node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -18436,6 +19361,16 @@ "node": ">=10" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -22232,6 +23167,78 @@ "@cspotcode/source-map-consumer": "0.8.0" } }, + "@cypress/request": { + "version": "2.88.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", + "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + } + }, + "jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + } + } + }, + "@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, "@dabh/diagnostics": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", @@ -22613,6 +23620,21 @@ } } }, + "@hapi/hoek": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==", + "dev": true + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, "@hookform/resolvers": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-2.8.0.tgz", @@ -22744,6 +23766,27 @@ } } }, + "@sideway/address": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.3.tgz", + "integrity": "sha512-8ncEUtmnTsMmL7z1YPB47kPUq7LpKWJNFPsRzHiIajGC5uXlWGn+AmkYPcHNl8S4tcEGx+cnORnNYaw2wvL+LQ==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "dev": true + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -23138,6 +24181,12 @@ "@types/range-parser": "*" } }, + "@types/faker": { + "version": "5.5.9", + "resolved": "https://registry.npmjs.org/@types/faker/-/faker-5.5.9.tgz", + "integrity": "sha512-uCx6mP3UY5SIO14XlspxsGjgaemrxpssJI0Ol+GfhxtcKpv9pgRZYsS4eeKeHVLje6Qtc8lGszuBI461+gVZBA==", + "dev": true + }, "@types/fs-extra": { "version": "9.0.12", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz", @@ -23357,6 +24406,18 @@ "@types/node": "*" } }, + "@types/sinonjs__fake-timers": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.4.tgz", + "integrity": "sha512-IFQTJARgMUBF+xVd2b+hIgXWrZEjND3vJtRCvIelcFB5SIXfjV4bOHbHJ0eXKh+0COrBRc8MqteKAz/j88rE0A==", + "dev": true + }, + "@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, "@types/unzipper": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/@types/unzipper/-/unzipper-0.10.4.tgz", @@ -23378,6 +24439,16 @@ "integrity": "sha512-vKx7WNQNZDyJveYcHAm9ZxhqSGLYwoyLhrHjLBOkw3a7cT76sTdjgtwyijhk1MaHyRIuSztcVwrUOO/NEu68Dw==", "dev": true }, + "@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, "@types/zen-observable": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz", @@ -23654,6 +24725,16 @@ "dev": true, "requires": {} }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -23747,6 +24828,12 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, "archiver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", @@ -23880,8 +24967,7 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "optional": true, - "peer": true, + "devOptional": true, "requires": { "safer-buffer": "~2.1.0" } @@ -23890,8 +24976,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "optional": true, - "peer": true + "devOptional": true }, "ast-types-flow": { "version": "0.0.7", @@ -23929,8 +25014,13 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "optional": true, - "peer": true + "devOptional": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true }, "attr-accept": { "version": "2.2.2", @@ -23969,15 +25059,13 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "optional": true, - "peer": true + "devOptional": true }, "aws4": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "optional": true, - "peer": true + "devOptional": true }, "axe-core": { "version": "4.1.4", @@ -24108,8 +25196,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "optional": true, - "peer": true, + "devOptional": true, "requires": { "tweetnacl": "^0.14.3" } @@ -24192,6 +25279,12 @@ } } }, + "blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -24406,6 +25499,12 @@ } } }, + "cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -24451,8 +25550,7 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "optional": true, - "peer": true + "devOptional": true }, "chainsaw": { "version": "0.1.0", @@ -24471,6 +25569,12 @@ "supports-color": "^7.1.0" } }, + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", + "dev": true + }, "chokidar": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", @@ -24514,11 +25618,26 @@ "source-map": "~0.6.0" } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "cli-boxes": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, "cli-highlight": { "version": "2.1.11", "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", @@ -24539,6 +25658,39 @@ } } }, + "cli-table3": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", + "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "dev": true, + "requires": { + "colors": "1.4.0", + "string-width": "^4.2.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -24631,8 +25783,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "optional": true, - "peer": true, + "devOptional": true, "requires": { "delayed-stream": "~1.0.0" } @@ -24647,6 +25798,12 @@ "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -24691,6 +25848,42 @@ "typedarray": "^0.0.6" } }, + "concurrently": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.0.0.tgz", + "integrity": "sha512-WKM7PUsI8wyXpF80H+zjHP32fsgsHNQfPLw/e70Z5dYkV7hF+rf8q3D+ScWJIEr57CpkO3OWBko6hwhQLPR8Pw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "date-fns": "^2.16.1", + "lodash": "^4.17.21", + "rxjs": "^6.6.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^16.2.0" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -24979,10 +26172,154 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, - "csstype": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", - "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + "csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + }, + "cypress": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.2.1.tgz", + "integrity": "sha512-LVEe4yWCo4xO0Vd8iYjFHRyd5ulRvM56XqMgAdn05Qb9kJ6iJdO/MmjKD8gNd768698cp1FDuSmFQZHVZGk+Og==", + "dev": true, + "requires": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "^6.0.2", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "3.7.2", + "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.3", + "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.5", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "url": "^0.11.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "@types/node": { + "version": "14.18.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.5.tgz", + "integrity": "sha512-LMy+vDDcQR48EZdEx5wRX1q/sEl6NdGuHXPnfeL8ixkwCOSZ2qnIyIZmcCbdX0MeRqHhAcHmX+haCbrS8Run+A==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "ci-info": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "dev": true + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "requires": { + "ci-info": "^3.2.0" + } + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + } + } + }, + "cypress-file-upload": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz", + "integrity": "sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g==", + "dev": true, + "requires": {} + }, + "cypress-localstorage-commands": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/cypress-localstorage-commands/-/cypress-localstorage-commands-1.6.1.tgz", + "integrity": "sha512-rvXCB0iLzC3i9y91XH4N2I55NicH62gQk5z/APblCjnNR3wWTbDs8svC7GvE1fjt9AMIHSQm1RfWx037y+TciQ==", + "dev": true, + "requires": {} }, "damerau-levenshtein": { "version": "1.0.6", @@ -24994,8 +26331,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "optional": true, - "peer": true, + "devOptional": true, "requires": { "assert-plus": "^1.0.0" } @@ -25005,6 +26341,12 @@ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.23.0.tgz", "integrity": "sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA==" }, + "dayjs": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", + "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==", + "dev": true + }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -25087,8 +26429,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "optional": true, - "peer": true + "devOptional": true }, "delegates": { "version": "1.0.0", @@ -25281,8 +26622,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "optional": true, - "peer": true, + "devOptional": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -25932,6 +27272,12 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "eventemitter2": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.5.tgz", + "integrity": "sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw==", + "dev": true + }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -25942,6 +27288,51 @@ "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "exit-on-epipe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", @@ -26018,15 +27409,42 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "optional": true, - "peer": true + "devOptional": true + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "optional": true, - "peer": true + "devOptional": true + }, + "faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", + "dev": true }, "fast-deep-equal": { "version": "3.1.3", @@ -26096,6 +27514,15 @@ "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "fecha": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", @@ -26290,15 +27717,13 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "optional": true, - "peer": true + "devOptional": true }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "optional": true, - "peer": true, + "devOptional": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -26328,13 +27753,6 @@ "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - } } }, "fs-minipass": { @@ -26505,12 +27923,20 @@ "pump": "^3.0.0" } }, + "getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "requires": { + "async": "^3.2.0" + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "optional": true, - "peer": true, + "devOptional": true, "requires": { "assert-plus": "^1.0.0" } @@ -26837,6 +28263,12 @@ "sshpk": "^1.7.0" } }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -26918,6 +28350,12 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -27089,6 +28527,11 @@ "has-symbols": "^1.0.1" } }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, "is-string": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", @@ -27109,6 +28552,12 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -27136,8 +28585,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "optional": true, - "peer": true + "devOptional": true }, "jest-worker": { "version": "27.1.0", @@ -27164,6 +28612,19 @@ "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" }, + "joi": { + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.5.0.tgz", + "integrity": "sha512-R7hR50COp7StzLnDi4ywOXHrBrgNXuUUfJWIR5lPY5Bm/pOD3jZaTwpluUXVLRWcoWZxkrHBBJ5hLxgnlehbdw==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -27183,8 +28644,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true, - "peer": true + "devOptional": true }, "jsesc": { "version": "2.5.2", @@ -27205,8 +28665,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "optional": true, - "peer": true + "devOptional": true }, "json-schema-traverse": { "version": "0.4.1", @@ -27223,8 +28682,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "optional": true, - "peer": true + "devOptional": true }, "json5": { "version": "1.0.1", @@ -27241,13 +28699,6 @@ "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - } } }, "jsonwebtoken": { @@ -27357,6 +28808,12 @@ "package-json": "^6.3.0" } }, + "lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", + "dev": true + }, "lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", @@ -27380,6 +28837,30 @@ "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" }, + "listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + } + } + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -27523,6 +29004,41 @@ "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "logform": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", @@ -27686,6 +29202,12 @@ "mime-db": "1.47.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -28345,6 +29867,15 @@ "npm-normalize-package-bin": "^1.0.1" } }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -28570,6 +30101,15 @@ "fn.name": "1.x.x" } }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -28609,6 +30149,12 @@ "os-tmpdir": "^1.0.0" } }, + "ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=", + "dev": true + }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -28635,6 +30181,15 @@ "p-limit": "^2.2.0" } }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -28769,12 +30324,17 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "optional": true, - "peer": true + "devOptional": true }, "pg": { "version": "8.7.1", @@ -28990,6 +30550,12 @@ "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", "dev": true }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, "pretty-error": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-3.0.4.tgz", @@ -29059,6 +30625,12 @@ "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "dev": true + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -29068,8 +30640,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "optional": true, - "peer": true + "devOptional": true }, "pstree.remy": { "version": "1.1.8", @@ -29102,8 +30673,7 @@ "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "optional": true, - "peer": true + "devOptional": true }, "query-string": { "version": "7.0.1", @@ -29598,6 +31168,15 @@ } } }, + "request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", + "dev": true, + "requires": { + "throttleit": "^1.0.0" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -29641,11 +31220,27 @@ "lowercase-keys": "^1.0.0" } }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -29662,6 +31257,23 @@ "queue-microtask": "^1.2.2" } }, + "rxjs": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.2.tgz", + "integrity": "sha512-PwDt186XaL3QN5qXj/H9DGyHhP3/RYYgZZwqBv9Tv8rsAaiwFH1IsJJlcgD37J7UW5a6O67qX0KWKS3/pu0m4w==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + } + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -29946,6 +31558,12 @@ "source-map": "^0.6.0" } }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -30030,8 +31648,7 @@ "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "optional": true, - "peer": true, + "devOptional": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -30204,6 +31821,12 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -30405,6 +32028,18 @@ "thenify": ">= 3.1.0 < 4" } }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -30425,6 +32060,15 @@ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -30475,8 +32119,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "optional": true, - "peer": true, + "devOptional": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -30487,6 +32130,12 @@ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, "triple-beam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", @@ -30574,8 +32223,7 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true, - "peer": true + "devOptional": true }, "type-check": { "version": "0.4.0", @@ -30786,6 +32434,11 @@ "crypto-random-string": "^2.0.0" } }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -30939,14 +32592,26 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "optional": true, - "peer": true, + "devOptional": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, + "wait-on": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.0.tgz", + "integrity": "sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw==", + "dev": true, + "requires": { + "axios": "^0.21.1", + "joi": "^17.4.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.1.0" + } + }, "watchpack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", @@ -31180,11 +32845,6 @@ "winston-transport": "^4.4.0" }, "dependencies": { - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -31349,6 +33009,16 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index bfd51cf..4ef1c3e 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,12 @@ "dev": "cross-env NODE_ENV=development ts-node -T -r tsconfig-paths/register ./src/burdy.ts dev", "build": "cross-env NODE_ENV=production ts-node -T -r tsconfig-paths/register ./src/burdy.ts build", "db": "cross-env NODE_ENV=development ts-node -T -r tsconfig-paths/register ./src/burdy.ts db", - "burdy": "cross-env NODE_ENV=development ts-node -T -r tsconfig-paths/register ./src/burdy.ts" + "burdy": "cross-env NODE_ENV=development ts-node -T -r tsconfig-paths/register ./src/burdy.ts", + "cypress:open": "cypress open", + "cypress:run": "cypress run", + "e2e": "concurrently -k -s first \"npm:start\" \"npm:e2e:tests\"", + "e2e:dev": "concurrently -k -s first \"npm:dev\" \"npm:e2e:tests\"", + "e2e:tests": "wait-on -t 30000 http-get://localhost:4000/api/health && npm run cypress:run" }, "bin": { "burdy": "./src/burdy.js" @@ -138,6 +143,7 @@ "@types/dotenv-flow": "^3.2.0", "@types/draft-js": "^0.11.5", "@types/express": "^4.17.13", + "@types/faker": "^5.5.9", "@types/fs-extra": "^9.0.12", "@types/http-proxy": "^1.17.7", "@types/lodash": "^4.14.172", @@ -157,7 +163,11 @@ "@types/webpack-env": "^1.16.2", "@typescript-eslint/eslint-plugin": "^4.30.0", "@typescript-eslint/parser": "^4.30.0", + "concurrently": "^7.0.0", "copyfiles": "^2.4.1", + "cypress": "^9.2.1", + "cypress-file-upload": "^5.0.8", + "cypress-localstorage-commands": "^1.6.1", "eslint": "^7.32.0", "eslint-config-airbnb": "^18.2.1", "eslint-config-airbnb-typescript": "^14.0.0", @@ -166,13 +176,15 @@ "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-react": "^7.25.1", "eslint-plugin-react-hooks": "^4.2.0", + "faker": "^5.5.3", "ncp": "^2.0.0", "prettier": "^2.3.2", "ts-node": "^10.2.1", "tsconfig-paths": "^3.11.0", "ttypescript": "^1.5.12", "typescript": "^4.4.2", - "typescript-transform-paths": "^3.3.1" + "typescript-transform-paths": "^3.3.1", + "wait-on": "^6.0.0" }, "peerDependencies": { "path-to-regexp": "^6.2.0" diff --git a/src/admin/features/content-types/components/fields-select-panel.tsx b/src/admin/features/content-types/components/fields-select-panel.tsx index e0df167..c14ae2f 100644 --- a/src/admin/features/content-types/components/fields-select-panel.tsx +++ b/src/admin/features/content-types/components/fields-select-panel.tsx @@ -194,6 +194,7 @@ const FieldsSelectPanel: React.FC = ({ setSearch(newValue)} + data-cy="contentTypes-fieldsSelect-search" autoFocus /> Date: Sun, 16 Jan 2022 17:40:19 +0100 Subject: [PATCH 2/8] feat: add .env file for e2e --- .env.e2e | 6 ++++++ .gitignore | 1 + package-lock.json | 44 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 5 +++-- 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 .env.e2e diff --git a/.env.e2e b/.env.e2e new file mode 100644 index 0000000..a57b21b --- /dev/null +++ b/.env.e2e @@ -0,0 +1,6 @@ +TYPEORM_CONNECTION=sqlite +TYPEORM_SYNCHRONIZE=true +SERVER_PORT=4000 +ADMIN_PORT=4001 +IFRAME_BASE_URL=http://localhost:3000 +BURDY_HOST=http://localhost:4000 diff --git a/.gitignore b/.gitignore index 613eaa1..215cc3e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .env.* !.env.defaults !.env.sample +!.env.e2e node_modules .idea dist diff --git a/package-lock.json b/package-lock.json index 062b44f..1920cef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -139,6 +139,7 @@ "cypress": "^9.2.1", "cypress-file-upload": "^5.0.8", "cypress-localstorage-commands": "^1.6.1", + "env-cmd": "^10.1.0", "eslint": "^7.32.0", "eslint-config-airbnb": "^18.2.1", "eslint-config-airbnb-typescript": "^14.0.0", @@ -10402,6 +10403,31 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-cmd": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", + "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", + "dev": true, + "dependencies": { + "commander": "^4.0.0", + "cross-spawn": "^7.0.0" + }, + "bin": { + "env-cmd": "bin/env-cmd.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/env-cmd/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -26697,6 +26723,24 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" }, + "env-cmd": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", + "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", + "dev": true, + "requires": { + "commander": "^4.0.0", + "cross-spawn": "^7.0.0" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + } + } + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", diff --git a/package.json b/package.json index 4ef1c3e..dea1e1d 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,8 @@ "burdy": "cross-env NODE_ENV=development ts-node -T -r tsconfig-paths/register ./src/burdy.ts", "cypress:open": "cypress open", "cypress:run": "cypress run", - "e2e": "concurrently -k -s first \"npm:start\" \"npm:e2e:tests\"", - "e2e:dev": "concurrently -k -s first \"npm:dev\" \"npm:e2e:tests\"", + "e2e": "concurrently -k -s first \"env-cmd -f .env.e2e npm run start\" \"npm:e2e:tests\"", + "e2e:dev": "concurrently -k -s first \"env-cmd -f .env.e2e npm run dev\" \"npm:e2e:tests\"", "e2e:tests": "wait-on -t 30000 http-get://localhost:4000/api/health && npm run cypress:run" }, "bin": { @@ -168,6 +168,7 @@ "cypress": "^9.2.1", "cypress-file-upload": "^5.0.8", "cypress-localstorage-commands": "^1.6.1", + "env-cmd": "^10.1.0", "eslint": "^7.32.0", "eslint-config-airbnb": "^18.2.1", "eslint-config-airbnb-typescript": "^14.0.0", From e69840e0e232149497bf3f29a6cee8b8b12e5015 Mon Sep 17 00:00:00 2001 From: Stefan Date: Sun, 16 Jan 2022 17:53:59 +0100 Subject: [PATCH 3/8] feat: update workflow --- .github/workflows/e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 5630ca0..3d6a807 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -12,6 +12,6 @@ jobs: - name: E2E Tests uses: cypress-io/github-action@v2 with: - install: npm ci build: npm run build start: npm run e2e + record: false From e2b7547784e10d40a1214e79ae5800c9493ddce9 Mon Sep 17 00:00:00 2001 From: Stefan Date: Sun, 16 Jan 2022 18:01:13 +0100 Subject: [PATCH 4/8] feat: update runner --- .github/workflows/e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 3d6a807..c3e5b73 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -4,7 +4,7 @@ on: [push] jobs: cypress-run: - runs-on: ubuntu-latest + runs-on: ubuntu-18.04 steps: - name: Checkout uses: actions/checkout@v2 From 8c60f039b4a85b9f9f88112f63b61e91de53188f Mon Sep 17 00:00:00 2001 From: Stefan Date: Sun, 16 Jan 2022 18:08:58 +0100 Subject: [PATCH 5/8] feat: integrate with cypress --- .github/workflows/e2e.yml | 4 +++- cypress.json | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index c3e5b73..1f3fa9b 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -14,4 +14,6 @@ jobs: with: build: npm run build start: npm run e2e - record: false + env: + CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/cypress.json b/cypress.json index 0d7eafd..634fbbb 100644 --- a/cypress.json +++ b/cypress.json @@ -1,4 +1,5 @@ { + "projectId": "1wyx8f", "chromeWebSecurity": false, "baseUrl": "http://localhost:4000/admin", "env": { From 75ca6e443e830c546537ed00f4e864662eb1692f Mon Sep 17 00:00:00 2001 From: Stefan Date: Sun, 16 Jan 2022 18:11:40 +0100 Subject: [PATCH 6/8] feat: enable recording --- .github/workflows/e2e.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 1f3fa9b..22f2597 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -12,6 +12,7 @@ jobs: - name: E2E Tests uses: cypress-io/github-action@v2 with: + record: true build: npm run build start: npm run e2e env: From 84b13c0a6966ec0fd5f2a18d90d98b33b873508f Mon Sep 17 00:00:00 2001 From: Stefan Date: Mon, 17 Jan 2022 07:44:23 +0100 Subject: [PATCH 7/8] feat: purge before build --- .github/workflows/e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 22f2597..c9c19db 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -13,7 +13,7 @@ jobs: uses: cypress-io/github-action@v2 with: record: true - build: npm run build + build: rm -rf burdy && npm run build start: npm run e2e env: CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} From bc0f6232a21c48aed46c1bd23975e75710cc1c3d Mon Sep 17 00:00:00 2001 From: Stefan Date: Mon, 17 Jan 2022 07:48:05 +0100 Subject: [PATCH 8/8] fix --- .github/workflows/e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index c9c19db..22f2597 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -13,7 +13,7 @@ jobs: uses: cypress-io/github-action@v2 with: record: true - build: rm -rf burdy && npm run build + build: npm run build start: npm run e2e env: CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}