From 06e2e11da84c7c065d1365ea19b42109d29b7e11 Mon Sep 17 00:00:00 2001 From: mahula Date: Sun, 10 Jul 2022 20:23:21 +0200 Subject: [PATCH 001/304] add initial e2e test setup utilizing Playwright --- e2e-tests/playwright/Dockerfile | 14 ++++++++ e2e-tests/playwright/README.md | 24 ++++++++++++++ e2e-tests/playwright/tests/global-setup.ts | 8 +++++ .../playwright/tests/gradido_login.spec.ts | 15 +++++++++ .../playwright/tests/models/login_page.ts | 33 +++++++++++++++++++ .../playwright/tests/models/welcome_page.ts | 13 ++++++++ .../playwright/tests/playwright.config.ts | 19 +++++++++++ 7 files changed, 126 insertions(+) create mode 100644 e2e-tests/playwright/Dockerfile create mode 100644 e2e-tests/playwright/README.md create mode 100644 e2e-tests/playwright/tests/global-setup.ts create mode 100644 e2e-tests/playwright/tests/gradido_login.spec.ts create mode 100644 e2e-tests/playwright/tests/models/login_page.ts create mode 100644 e2e-tests/playwright/tests/models/welcome_page.ts create mode 100644 e2e-tests/playwright/tests/playwright.config.ts diff --git a/e2e-tests/playwright/Dockerfile b/e2e-tests/playwright/Dockerfile new file mode 100644 index 000000000..ef8d51984 --- /dev/null +++ b/e2e-tests/playwright/Dockerfile @@ -0,0 +1,14 @@ +############################################################################### +# Dockerfile to create a ready to use Playwright Docker image for end-to-end +# testing +############################################################################### +ARG PLAYWIRGHT_VERSION=1.23.2 + +FROM mcr.microsoft.com/playwright:v$PLAYWIRGHT_VERSION-focal + +WORKDIR /tests + +RUN npm install playwright@$PLAYWIRGHT_VERSION +RUN npm install -D @playwright/test + +COPY tests/ /tests diff --git a/e2e-tests/playwright/README.md b/e2e-tests/playwright/README.md new file mode 100644 index 000000000..7f01b780e --- /dev/null +++ b/e2e-tests/playwright/README.md @@ -0,0 +1,24 @@ +# Gradido End-to-End Testing with [Playwright](https://playwright.dev/) (CI-ready via Docker) + + +A sample setup to show-case Playwright (using Typescript) as an end-to-end testing tool for Gradido runniing in a Docker container. +Here we have a simple UI-based happy path login test running against the DEV system. + +## Precondition +Since dependencies and configurations for Github Actions integration is not set up yet, please run + +```bash +docker-compose up +``` + +to boot up the DEV system, before running the test. + +## Execute the test + +```bash +# build a Docker image from the Dockerfile +docker build -t gradido_e2e-tests-playwright . + +# run the Docker container and execute the given tests +docker run -it gradido_e2e-tests-playwright npx playwright test +``` diff --git a/e2e-tests/playwright/tests/global-setup.ts b/e2e-tests/playwright/tests/global-setup.ts new file mode 100644 index 000000000..6f9dad9c4 --- /dev/null +++ b/e2e-tests/playwright/tests/global-setup.ts @@ -0,0 +1,8 @@ +import { FullConfig } from '@playwright/test'; + +async function globalSetup(config: FullConfig) { + process.env.EMAIL = 'bibi@bloxberg.de'; + process.env.PASSWORD = 'Aa12345_'; +} + +export default globalSetup; diff --git a/e2e-tests/playwright/tests/gradido_login.spec.ts b/e2e-tests/playwright/tests/gradido_login.spec.ts new file mode 100644 index 000000000..0853780d1 --- /dev/null +++ b/e2e-tests/playwright/tests/gradido_login.spec.ts @@ -0,0 +1,15 @@ +import { test, expect } from '@playwright/test'; +import { LoginPage } from './models/login_page'; +import { WelcomePage } from './models/welcome_page'; + + +test('Gradido login test (happy path)', async ({ page }) => { + const { EMAIL, PASSWORD } = process.env; + const loginPage = new LoginPage(page); + await loginPage.goto(); + await loginPage.enterEmail(EMAIL); + await loginPage.enterPassword(PASSWORD); + await loginPage.submitLogin(); + // assertions + await expect(page).toHaveURL('./overview'); +}); diff --git a/e2e-tests/playwright/tests/models/login_page.ts b/e2e-tests/playwright/tests/models/login_page.ts new file mode 100644 index 000000000..418adc555 --- /dev/null +++ b/e2e-tests/playwright/tests/models/login_page.ts @@ -0,0 +1,33 @@ +import { expect, test, Locator, Page } from '@playwright/test'; + +export class LoginPage { + readonly page: Page; + readonly url: string; + readonly emailInput: Locator; + readonly passwordInput: Locator; + readonly submitBtn: Locator; + + constructor(page: Page) { + this.page = page; + this.url = './login'; + this.emailInput = page.locator('id=Email-input-field'); + this.passwordInput = page.locator('id=Passwort-input-field'); + this.submitBtn = page.locator('text=Anmeldung'); + } + + async goto() { + await this.page.goto(this.url); + } + + async enterEmail(email: string) { + await this.emailInput.fill(email); + } + + async enterPassword(password: string) { + await this.passwordInput.fill(password); + } + + async submitLogin() { + await this.submitBtn.click(); + } +} diff --git a/e2e-tests/playwright/tests/models/welcome_page.ts b/e2e-tests/playwright/tests/models/welcome_page.ts new file mode 100644 index 000000000..81d73a771 --- /dev/null +++ b/e2e-tests/playwright/tests/models/welcome_page.ts @@ -0,0 +1,13 @@ +import { expect, Locator, Page } from '@playwright/test'; + +export class WelcomePage { + readonly page: Page; + readonly url: string; + readonly profileLink: Locator; + + constructor(page: Page){ + this.page = page; + this.url = './overview'; + this.profileLink = page.locator('href=/profile'); + } +} diff --git a/e2e-tests/playwright/tests/playwright.config.ts b/e2e-tests/playwright/tests/playwright.config.ts new file mode 100644 index 000000000..073c34b06 --- /dev/null +++ b/e2e-tests/playwright/tests/playwright.config.ts @@ -0,0 +1,19 @@ +import type { PlaywrightTestConfig } from '@playwright/test'; + +const config: PlaywrightTestConfig = { + globalSetup: require.resolve('./global-setup'), + ignoreHTTPSErrors: true, + locale: 'de-DE', + reporter: process.env.CI ? 'github' : 'list', + retries: 1, + screenshot: 'only-on-failure', + testDir: '.', + timeout: 30000, + trace: 'on-first-retry', + video: 'never', + viewport: { width: 1280, height: 720 }, + use: { + baseURL: process.env.URL || 'http://localhost:3000', + }, +}; +export default config; From aa2e07565cbac0463b1032f786312cba91e22e37 Mon Sep 17 00:00:00 2001 From: mahula Date: Tue, 12 Jul 2022 10:15:32 +0200 Subject: [PATCH 002/304] add initial e2e test setup utilizing Cypress --- e2e-tests/cypress/Dockerfile | 65 +++++++++++++++++++ e2e-tests/cypress/README.md | 26 ++++++++ e2e-tests/cypress/tests/cypress.config.js | 15 +++++ .../tests/cypress/e2e/gradido_login.cy.js | 21 ++++++ .../tests/cypress/e2e/models/LoginPage.js | 21 ++++++ .../cypress/tests/cypress/fixtures/users.json | 7 ++ 6 files changed, 155 insertions(+) create mode 100644 e2e-tests/cypress/Dockerfile create mode 100644 e2e-tests/cypress/README.md create mode 100644 e2e-tests/cypress/tests/cypress.config.js create mode 100644 e2e-tests/cypress/tests/cypress/e2e/gradido_login.cy.js create mode 100644 e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.js create mode 100644 e2e-tests/cypress/tests/cypress/fixtures/users.json diff --git a/e2e-tests/cypress/Dockerfile b/e2e-tests/cypress/Dockerfile new file mode 100644 index 000000000..5251e071a --- /dev/null +++ b/e2e-tests/cypress/Dockerfile @@ -0,0 +1,65 @@ +############################################################################### +# Dockerfile to create a ready-to-use Cypress Docker image for end-to-end +# testing. +# +# This Dockerfile is based on the Dockerfile using Node.js 16.14.2 and +# Cypress 10.3.0 +# (https://github.com/cypress-io/cypress-docker-images/blob/master/included/10.3.0/Dockerfile) +# from Cypress.io Docker images. +############################################################################### +FROM cypress/browsers:node16.14.2-slim-chrome100-ff99-edge + +# avoid too many progress messages +# https://github.com/cypress-io/cypress/issues/1243 +ENV CI=1 \ +# disable shared memory X11 affecting Cypress v4 and Chrome +# https://github.com/cypress-io/cypress-docker-images/issues/270 + QT_X11_NO_MITSHM=1 \ + _X11_NO_MITSHM=1 \ + _MITSHM=0 \ + # point Cypress at the /root/cache no matter what user account is used + # see https://on.cypress.io/caching + CYPRESS_CACHE_FOLDER=/root/.cache/Cypress \ + # Allow projects to reference globally installed cypress + NODE_PATH=/usr/local/lib/node_modules + +# should be root user +RUN echo "whoami: $(whoami)" \ + && npm config -g set user $(whoami) \ + # command "id" should print: + # uid=0(root) gid=0(root) groups=0(root) + # which means the current user is root + && id \ + && npm install -g "cypress@10.3.0" \ + && cypress verify \ + # Cypress cache and installed version + # should be in the root user's home folder + && cypress cache path \ + && cypress cache list \ + && cypress info \ + && cypress version \ + # give every user read access to the "/root" folder where the binary is cached + # we really only need to worry about the top folder, fortunately + && ls -la /root \ + && chmod 755 /root \ + # always grab the latest Yarn + # otherwise the base image might have old versions + # NPM does not need to be installed as it is already included with Node. + && npm i -g yarn@latest \ + # Show where Node loads required modules from + && node -p 'module.paths' \ + # should print Cypress version + # plus Electron and bundled Node versions + && cypress version \ + && echo " node version: $(node -v) \n" \ + "npm version: $(npm -v) \n" \ + "yarn version: $(yarn -v) \n" \ + "debian version: $(cat /etc/debian_version) \n" \ + "user: $(whoami) \n" \ + "chrome: $(google-chrome --version || true) \n" \ + "firefox: $(firefox --version || true) \n" + +WORKDIR /tests +COPY tests/ /tests + +# ENTRYPOINT ["cypress", "run"] diff --git a/e2e-tests/cypress/README.md b/e2e-tests/cypress/README.md new file mode 100644 index 000000000..5cadedff4 --- /dev/null +++ b/e2e-tests/cypress/README.md @@ -0,0 +1,26 @@ +# Gradido End-to-End Testing with [Cypress](https://www.cypress.io/) (CI-ready via Docker) + + +A sample setup to show-case Cypress as an end-to-end testing tool for Gradido running in a Docker container. +Here we have a simple UI-based happy path login test running against the DEV system. + +## Precondition +Since dependencies and configurations for Github Actions integration is not set up yet, please run in root directory + +```bash +docker-compose up +``` + +to boot up the DEV system, before running the test. + +## Execute the test + +```bash +cd e2e-tests/cypress + +# build a Docker image from the Dockerfile +docker build -t gradido_e2e-tests-cypress . + +# run the Docker container and execute the given tests +docker run -it gradido_e2e-tests-cypress cypress run +``` diff --git a/e2e-tests/cypress/tests/cypress.config.js b/e2e-tests/cypress/tests/cypress.config.js new file mode 100644 index 000000000..00f1ece46 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress.config.js @@ -0,0 +1,15 @@ +const { defineConfig } = require('cypress') + +module.exports = defineConfig({ + e2e: { + baseUrl: 'http://localhost:3000', + chromeWebSecurity: false, + supportFile: false, + viewportHeight: 720, + viewportWidth: 1280, + retries: { + runMode: 2, + openMode: 0 + } + } +}) diff --git a/e2e-tests/cypress/tests/cypress/e2e/gradido_login.cy.js b/e2e-tests/cypress/tests/cypress/e2e/gradido_login.cy.js new file mode 100644 index 000000000..2a2f8b8ce --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/e2e/gradido_login.cy.js @@ -0,0 +1,21 @@ +import users from '../fixtures/users' +import LoginPage from './models/LoginPage' + +describe('Gradido', () => { + let userData; + + before(() => { + cy.fixture('users').then((usersFixture) => { + userData = usersFixture; + }); + }); + + it('login test (happy path)', () => { + const loginPage = new LoginPage(); + loginPage.goto(); + loginPage.enterEmail(userData.user.email); + loginPage.enterPassword(userData.user.password); + loginPage.submitLogin(); + cy.url().should('be.equal', `${Cypress.config('baseUrl')}/overview`); + }); +}); diff --git a/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.js b/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.js new file mode 100644 index 000000000..6a0245aa2 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.js @@ -0,0 +1,21 @@ +class LoginPage { + goto() { + cy.visit('/') + } + + enterEmail(email) { + cy.get('[id=Email-input-field]').clear().type(email) + return this + } + + enterPassword(password) { + cy.get('[id=Passwors-input-field]').clear().type(password) + return this + } + + submitLogin() { + cy.get('[type=submit]').click() + } +} + +export default LoginPage diff --git a/e2e-tests/cypress/tests/cypress/fixtures/users.json b/e2e-tests/cypress/tests/cypress/fixtures/users.json new file mode 100644 index 000000000..f13e203f0 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/fixtures/users.json @@ -0,0 +1,7 @@ +{ + "user": { + "email": "bibi@bloxberg.de", + "password": "Aa12345_", + "name": "Bibi Bloxberg" + } +} From c55a8b121408c57dffe5bec9dcac90559fe628c5 Mon Sep 17 00:00:00 2001 From: mahula Date: Tue, 12 Jul 2022 11:24:58 +0200 Subject: [PATCH 003/304] Update Readme information --- e2e-tests/README.md | 7 +++++++ e2e-tests/playwright/README.md | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 e2e-tests/README.md diff --git a/e2e-tests/README.md b/e2e-tests/README.md new file mode 100644 index 000000000..f53618ab4 --- /dev/null +++ b/e2e-tests/README.md @@ -0,0 +1,7 @@ +# Gradido end-to-end tests + +This is still WIP. + +For automated end-to-end testing one of the frameworks Cypress or Playwright will be utilized. + +For more details on how to run them, see the subfolders' README instructions. diff --git a/e2e-tests/playwright/README.md b/e2e-tests/playwright/README.md index 7f01b780e..3ebc9ce2f 100644 --- a/e2e-tests/playwright/README.md +++ b/e2e-tests/playwright/README.md @@ -5,7 +5,7 @@ A sample setup to show-case Playwright (using Typescript) as an end-to-end testi Here we have a simple UI-based happy path login test running against the DEV system. ## Precondition -Since dependencies and configurations for Github Actions integration is not set up yet, please run +Since dependencies and configurations for Github Actions integration is not set up yet, please run in root directory ```bash docker-compose up From 9b37ac9e8b79921ab87b620436484ea012a32142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Fri, 15 Jul 2022 02:49:34 +0200 Subject: [PATCH 004/304] some small updates --- .../UC_Introduction_of_Gradido-ID.md | 286 +++++++++--------- 1 file changed, 146 insertions(+), 140 deletions(-) diff --git a/docu/Concepts/TechnicalRequirements/UC_Introduction_of_Gradido-ID.md b/docu/Concepts/TechnicalRequirements/UC_Introduction_of_Gradido-ID.md index e3c0ac2d7..5da969eac 100644 --- a/docu/Concepts/TechnicalRequirements/UC_Introduction_of_Gradido-ID.md +++ b/docu/Concepts/TechnicalRequirements/UC_Introduction_of_Gradido-ID.md @@ -1,140 +1,146 @@ -# Introduction of Gradido-ID - -## Motivation - -To introduce the Gradido-ID base on the requirement to identify an user account per technical key instead of using an email-address. Such a technical key ensures an exact identification of an user account without giving detailed information for possible missusage. - -Additionally the Gradido-ID allows to administrade any user account data like changing the email address or define several email addresses without any side effects on the identification of the user account. - -## Definition - -The formalized definition of the Gradido-ID can be found in the document [BenutzerVerwaltung#Gradido-ID](../BusinessRequirements/BenutzerVerwaltung#Gradido-ID). - -## Steps of Introduction - -To Introduce the Gradido-ID there are several steps necessary. The first step is to define a proper database schema with additional columns and tables followed by data migration steps to add or initialize the new columns and tables by keeping valid data at all. - -The second step is to decribe all concerning business logic processes, which have to be adapted by introducing the Gradido-ID. - -### Database-Schema - -#### Users-Table - -The entity users has to be changed by adding the following columns. - -| Column | Type | Description | -| ------------------------ | ------ | -------------------------------------------------------------------------------------- | -| gradidoID | String | technical unique key of the user as UUID (version 4) | -| alias | String | a business unique key of the user | -| passphraseEncryptionType | int | defines the type of encrypting the passphrase: 1 = email (default), 2 = gradidoID, ... | -| emailID | int | technical foreign key to the new entity Contact | - -##### Email vs emailID - -The existing column `email`, will now be changed to the primary email contact, which will be stored as a contact entry in the new `UserContacts` table. It is necessary to decide if the content of the `email `will be changed to the foreign key `emailID `to the contact entry with the email address or if the email itself will be kept as a denormalized and duplicate value in the `users `table. - -The preferred and proper solution will be to add a new column `Users.emailId `as foreign key to the `UsersContact `entry and delete the `Users.email` column after the migration of the email address in the `UsersContact `table. - -#### new UserContacts-Table - -A new entity `UserContacts `is introduced to store several contacts of different types like email, telephone or other kinds of contact addresses. - -| Column | Type | Description | -| --------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| id | int | the technical key of a contact entity | -| type | int | Defines the type of contact entry as enum: Email, Phone, etc | -| usersID | int | Defines the foreign key to the `Users` table | -| email | String | defines the address of a contact entry of type Email | -| phone | String | defines the address of a contact entry of type Phone | -| contactChannels | String | define the contact channel as comma separated list for which this entry is confirmed by the user e.g. main contact (default), infomail, contracting, advertisings, ... | - -### Database-Migration - -After the adaption of the database schema and to keep valid consistent data, there must be several steps of data migration to initialize the new and changed columns and tables. - -#### Initialize GradidoID - -In a one-time migration create for each entry of the `Users `tabel an unique UUID (version4). - -#### Primary Email Contact - -In a one-time migration read for each entry of the `Users `table the `Users.id` and `Users.email` and create for it a new entry in the `UsersContact `table, by initializing the contact-values with: - -* id = new technical key -* type = Enum-Email -* userID = `Users.id` -* email = `Users.email` -* phone = null -* usedChannel = Enum-"main contact" - -and update the `Users `entry with `Users.emailId = UsersContact.Id` and `Users.passphraseEncryptionType = 1` - -After this one-time migration the column `Users.email` can be deleted. - -### Adaption of BusinessLogic - -The following logic or business processes has to be adapted for introducing the Gradido-ID - -#### Read-Write Access of Users-Table especially Email - -The ORM mapping has to be adapted to the changed and new database schema. - -#### Registration Process - -The logic of the registration process has to be adapted by - -* initializing the `Users.userID` with a unique UUID -* creating a new `UsersContact `entry with the given email address and *maincontact* as `usedChannel ` -* set `emailID `in the `Users `table as foreign key to the new `UsersContact `entry -* set `Users.passphraseEncrpytionType = 2` and encrypt the passphrase with the `Users.userID` instead of the `UsersContact.email` - -#### Login Process - -The logic of the login process has to be adapted by - -* search the users data by reading the `Users `and the `UsersContact` table with the email (or alias as soon as the user can maintain his profil with an alias) as input -* depending on the `Users.passphraseEncryptionType` decrypt the stored password - * = 1 : with the email - * = 2 : with the userID - -#### Password En/Decryption - -The logic of the password en/decryption has to be adapted by encapsulate the logic to be controlled with an input parameter. The input parameter can be the email or the userID. - -#### Change Password Process - -The logic of change password has to be adapted by - -* if the `Users.passphraseEncryptionType` = 1, then - - * read the users email address from the `UsersContact `table - * give the email address as input for the password decryption of the existing password - * use the `Users.userID` as input for the password encryption fo the new password - * change the `Users.passphraseEnrycptionType` to the new value =2 -* if the `Users.passphraseEncryptionType` = 2, then - - * give the `Users.userID` as input for the password decryption of the existing password - * use the `Users.userID` as input for the password encryption fo the new password - -#### Search- and Access Logic - -A new logic has to be introduced to search the user identity per different input values. That means searching the user data must be possible by - -* searching per email (only with maincontact as contactchannel) -* searching per userID -* searching per alias - -#### Identity-Mapping - -A new mapping logic will be necessary to allow using unmigrated APIs like GDT-servers api. So it must be possible to give this identity-mapping logic the following input to get the respective output: - -* email -> userID -* email -> alias -* userID -> email -* userID -> alias -* alias -> email -* alias -> userID - -#### GDT-Access - -To use the GDT-servers api the used identifier for GDT has to be switch from email to userID. +# Introduction of Gradido-ID + +## Motivation + +The introduction of the Gradido-ID base on the requirement to identify an user account per technical key instead of using an email-address. Such a technical key ensures an exact identification of an user account without giving detailed information for possible missusage. + +Additionally the Gradido-ID allows to administrade any user account data like changing the email address or define several email addresses without any side effects on the identification of the user account. + +## Definition + +The formalized definition of the Gradido-ID can be found in the document [BenutzerVerwaltung#Gradido-ID](../BusinessRequirements/BenutzerVerwaltung#Gradido-ID). + +## Steps of Introduction + +To Introduce the Gradido-ID there are several steps necessary. The first step is to define a proper database schema with additional columns and tables followed by data migration steps to add or initialize the new columns and tables by keeping valid data at all. + +The second step is to decribe all concerning business logic processes, which have to be adapted by introducing the Gradido-ID. + +### Database-Schema + +#### Users-Table + +The entity users has to be changed by adding the following columns. + +| Column | Type | Description | +| ------------------------ | ------ | ----------------------------------------------------------------------------------------------------------------- | +| gradidoID | String | technical unique key of the user as UUID (version 4) | +| alias | String | a business unique key of the user | +| passphraseEncryptionType | int | defines the type of encrypting the passphrase: 1 = email (default), 2 = gradidoID, ... | +| emailID | int | technical foreign key to the entry with type Email and contactChannel=maincontact of the new entity UserContacts | + +##### Email vs emailID + +The existing column `email`, will now be changed to the primary email contact, which will be stored as a contact entry in the new `UserContacts` table. It is necessary to decide if the content of the `email `will be changed to the foreign key `emailID `to the contact entry with the email address or if the email itself will be kept as a denormalized and duplicate value in the `users `table. + +The preferred and proper solution will be to add a new column `Users.emailId `as foreign key to the `UsersContact `entry and delete the `Users.email` column after the migration of the email address in the `UsersContact `table. + +#### new UserContacts-Table + +A new entity `UserContacts `is introduced to store several contacts of different types like email, telephone or other kinds of contact addresses. + +| Column | Type | Description | +| --------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| id | int | the technical key of a contact entity | +| type | int | Defines the type of contact entry as enum: Email, Phone, etc | +| usersID | int | Defines the foreign key to the `Users` table | +| email | String | defines the address of a contact entry of type Email | +| phone | String | defines the address of a contact entry of type Phone | +| contactChannels | String | define the contact channel as comma separated list for which this entry is confirmed by the user e.g. main contact (default), infomail, contracting, advertisings, ... | + +### Database-Migration + +After the adaption of the database schema and to keep valid consistent data, there must be several steps of data migration to initialize the new and changed columns and tables. + +#### Initialize GradidoID + +In a one-time migration create for each entry of the `Users `tabel an unique UUID (version4). + +#### Primary Email Contact + +In a one-time migration read for each entry of the `Users `table the `Users.id` and `Users.email` and create for it a new entry in the `UsersContact `table, by initializing the contact-values with: + +* id = new technical key +* type = Enum-Email +* userID = `Users.id` +* email = `Users.email` +* phone = null +* usedChannel = Enum-"main contact" + +and update the `Users `entry with `Users.emailId = UsersContact.Id` and `Users.passphraseEncryptionType = 1` + +After this one-time migration the column `Users.email` can be deleted. + +### Adaption of BusinessLogic + +The following logic or business processes has to be adapted for introducing the Gradido-ID + +#### Read-Write Access of Users-Table especially Email + +The ORM mapping has to be adapted to the changed and new database schema. + +#### Registration Process + +The logic of the registration process has to be adapted by + +* initializing the `Users.userID` with a unique UUID +* creating a new `UsersContact `entry with the given email address and *maincontact* as `usedChannel ` +* set `emailID `in the `Users `table as foreign key to the new `UsersContact `entry +* set `Users.passphraseEncrpytionType = 2` and encrypt the passphrase with the `Users.userID` instead of the `UsersContact.email` + +#### Login Process + +The logic of the login process has to be adapted by + +* search the users data by reading the `Users `and the `UsersContact` table with the email (or alias as soon as the user can maintain his profil with an alias) as input +* depending on the `Users.passphraseEncryptionType` decrypt the stored password + * = 1 : with the email + * = 2 : with the userID + +#### Password En/Decryption + +The logic of the password en/decryption has to be adapted by encapsulate the logic to be controlled with an input parameter. The input parameter can be the email or the userID. + +#### Change Password Process + +The logic of change password has to be adapted by + +* if the `Users.passphraseEncryptionType` = 1, then + + * read the users email address from the `UsersContact `table + * give the email address as input for the password decryption of the existing password + * use the `Users.userID` as input for the password encryption for the new password + * change the `Users.passphraseEnrycptionType` to the new value =2 +* if the `Users.passphraseEncryptionType` = 2, then + + * give the `Users.userID` as input for the password decryption of the existing password + * use the `Users.userID` as input for the password encryption fo the new password + +#### Search- and Access Logic + +A new logic has to be introduced to search the user identity per different input values. That means searching the user data must be possible by + +* searching per email (only with maincontact as contactchannel) +* searching per userID +* searching per alias + +#### Identity-Mapping + +A new mapping logic will be necessary to allow using unmigrated APIs like GDT-servers api. So it must be possible to give this identity-mapping logic the following input to get the respective output: + +* email -> userID +* email -> gradidoID +* email -> alias +* userID -> gradidoID +* userID -> email +* userID -> alias +* alias -> gradidoID +* alias -> email +* alias -> userID +* gradidoID -> email +* gradidoID -> userID +* gradidoID -> alias + +#### GDT-Access + +To use the GDT-servers api the used identifier for GDT has to be switch from email to userID. From 7eb1f1ad74c1473b5012034c39595d432a9e28da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Fri, 15 Jul 2022 03:40:26 +0200 Subject: [PATCH 005/304] add database migrations --- .../0044-adapt_users_table_for_gradidoid.ts | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 database/migrations/0044-adapt_users_table_for_gradidoid.ts diff --git a/database/migrations/0044-adapt_users_table_for_gradidoid.ts b/database/migrations/0044-adapt_users_table_for_gradidoid.ts new file mode 100644 index 000000000..29fae353e --- /dev/null +++ b/database/migrations/0044-adapt_users_table_for_gradidoid.ts @@ -0,0 +1,42 @@ +/* MIGRATION TO ADD GRADIDO_ID + * + * This migration adds new columns to the table `users` and creates the + * new table `user_contacts` + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` + CREATE TABLE IF NOT EXISTS \`user_contacts\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`type\` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, + \`users_id\` int(10) unsigned NOT NULL, + \`email\` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL UNIQUE, + \`email_hash\` binary(32) NULL, + \`email_checked\` tinyint(4) NOT NULL DEFAULT 0, + \`phone\` varchar(255) COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + \`created_at\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + \`updated_at\` datetime NULL DEFAULT NULL, + \`deleted_at\` datetime NULL DEFAULT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) + + await queryFn('ALTER TABLE `users` ADD COLUMN `gradido_id` varchar(36) NULL AFTER `id`;') + await queryFn('ALTER TABLE `users` ADD COLUMN `alias` varchar(20) NULL AFTER `gradido_id`;') + await queryFn( + 'ALTER TABLE `users` ADD COLUMN `passphrase_encrypt_type` varchar(36) NULL AFTER `privkey`;', + ) + await queryFn('ALTER TABLE `users` ADD COLUMN `email_id` int(10) NULL AFTER `email`;') +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // write downgrade logic as parameter of queryFn + await queryFn(`DROP TABLE IF EXISTS \`user_contacts\`;`) + + await queryFn('ALTER TABLE `users` DROP COLUMN `gradido_id`;') + await queryFn('ALTER TABLE `users` DROP COLUMN `alias`;') + await queryFn('ALTER TABLE `users` DROP COLUMN `passphrase_encrypt_type`;') + await queryFn('ALTER TABLE `users` DROP COLUMN `email_id`;') +} From 0dca2725e723e67d2c716d56b303b5739eb254d6 Mon Sep 17 00:00:00 2001 From: mahula Date: Fri, 15 Jul 2022 14:20:24 +0200 Subject: [PATCH 006/304] fix typo in POM file --- e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.js b/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.js index 6a0245aa2..38933942f 100644 --- a/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.js +++ b/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.js @@ -9,7 +9,7 @@ class LoginPage { } enterPassword(password) { - cy.get('[id=Passwors-input-field]').clear().type(password) + cy.get('[id=Password-input-field]').clear().type(password) return this } From d419462b7b4d916d9b72a5833cf949e393e3aa3a Mon Sep 17 00:00:00 2001 From: mahula Date: Fri, 15 Jul 2022 14:29:18 +0200 Subject: [PATCH 007/304] use yarn instead of npm with cypress tests --- e2e-tests/cypress/README.md | 2 +- e2e-tests/cypress/tests/package.json | 17 + e2e-tests/cypress/tests/yarn.lock | 1126 ++++++++++++++++++++++++++ 3 files changed, 1144 insertions(+), 1 deletion(-) create mode 100644 e2e-tests/cypress/tests/package.json create mode 100644 e2e-tests/cypress/tests/yarn.lock diff --git a/e2e-tests/cypress/README.md b/e2e-tests/cypress/README.md index 5cadedff4..69c1d7642 100644 --- a/e2e-tests/cypress/README.md +++ b/e2e-tests/cypress/README.md @@ -22,5 +22,5 @@ cd e2e-tests/cypress docker build -t gradido_e2e-tests-cypress . # run the Docker container and execute the given tests -docker run -it gradido_e2e-tests-cypress cypress run +docker run -it gradido_e2e-tests-cypress yarn run cypress-e2e-tests ``` diff --git a/e2e-tests/cypress/tests/package.json b/e2e-tests/cypress/tests/package.json new file mode 100644 index 000000000..c311cf407 --- /dev/null +++ b/e2e-tests/cypress/tests/package.json @@ -0,0 +1,17 @@ +{ + "name": "gradido-e2e-tests-cypress", + "version": "1.0.0", + "description": "End-to-end tests with Cypress", + "main": "yarn run cypress run", + "repository": "https://github.com/gradido/gradido/e2e-tests/cypress", + "author": "Mathias Lenz", + "license": "Apache-2.0", + "private": false, + "scripts": { + "cypress-e2e-tests": "yarn run cypress run", + "lint": "eslint --max-warnings=0 --ext .js,.ts ." + }, + "dependencies": { + "cypress": "^10.3.0" + } +} diff --git a/e2e-tests/cypress/tests/yarn.lock b/e2e-tests/cypress/tests/yarn.lock new file mode 100644 index 000000000..e106a617f --- /dev/null +++ b/e2e-tests/cypress/tests/yarn.lock @@ -0,0 +1,1126 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@cypress/request@^2.88.10": + version "2.88.10" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce" + integrity sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + http-signature "~1.3.6" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^8.3.2" + +"@cypress/xvfb@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== + dependencies: + debug "^3.1.0" + lodash.once "^4.1.1" + +"@types/node@*": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.4.tgz#48aedbf35efb3af1248e4cd4d792c730290cd5d6" + integrity sha512-M0+G6V0Y4YV8cqzHssZpaNCqvYwlCiulmm0PwpNLF55r/+cT8Ol42CHRU1SEaYFH2rTwiiE1aYg/2g2rrtGdPA== + +"@types/node@^14.14.31": + version "14.18.22" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.22.tgz#fd2a15dca290fc9ad565b672fde746191cd0c6e6" + integrity sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw== + +"@types/sinonjs__fake-timers@8.1.1": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" + integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== + +"@types/sizzle@^2.3.2": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" + integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== + +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async@^3.2.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +blob-util@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== + +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +cachedir@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" + integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-more-types@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== + +ci-info@^3.2.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" + integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-table3@~0.6.1: + version "0.6.2" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.2.tgz#aaf5df9d8b5bf12634dc8b3040806a0c07120d2a" + integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.16: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cypress@10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.3.0.tgz#fae8d32f0822fcfb938e79c7c31ef344794336ae" + integrity sha512-txkQWKzvBVnWdCuKs5Xc08gjpO89W2Dom2wpZgT9zWZT5jXxqPIxqP/NC1YArtkpmp3fN5HW8aDjYBizHLUFvg== + dependencies: + "@cypress/request" "^2.88.10" + "@cypress/xvfb" "^1.2.4" + "@types/node" "^14.14.31" + "@types/sinonjs__fake-timers" "8.1.1" + "@types/sizzle" "^2.3.2" + arch "^2.2.0" + blob-util "^2.0.2" + bluebird "^3.7.2" + buffer "^5.6.0" + cachedir "^2.3.0" + chalk "^4.1.0" + check-more-types "^2.24.0" + cli-cursor "^3.1.0" + cli-table3 "~0.6.1" + commander "^5.1.0" + common-tags "^1.8.0" + dayjs "^1.10.4" + debug "^4.3.2" + enquirer "^2.3.6" + eventemitter2 "^6.4.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.6" + ospath "^1.2.2" + pretty-bytes "^5.6.0" + proxy-from-env "1.0.0" + request-progress "^3.0.0" + semver "^7.3.2" + supports-color "^8.1.1" + tmp "~0.2.1" + untildify "^4.0.0" + yauzl "^2.10.0" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +dayjs@^1.10.4: + version "1.11.3" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.3.tgz#4754eb694a624057b9ad2224b67b15d552589258" + integrity sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A== + +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.1, debug@^4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +eventemitter2@^6.4.3: + version "6.4.6" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.6.tgz#92d56569cc147a4d9b9da9e942e89b20ce236b0a" + integrity sha512-OHqo4wbHX5VbvlbB6o6eDwhYmiTjrpWACjF8Pmof/GTD6rdBNdZFNck3xlhqOiQFGCOoq3uzHvA0cQpFHIGVAQ== + +execa@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + 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" + +executable@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +getos@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== + dependencies: + async "^3.2.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +http-signature@~1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" + integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== + dependencies: + assert-plus "^1.0.0" + jsprim "^2.0.2" + sshpk "^1.14.1" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-installed-globally@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" + integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +lazy-ass@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== + +listr2@^3.8.3: + version "3.14.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.1" + through "^2.3.8" + wrap-ansi "^7.0.0" + +lodash.once@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +ospath@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +pify@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pretty-bytes@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +proxy-from-env@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== + +psl@^1.1.28: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +request-progress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== + dependencies: + throttleit "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rxjs@^7.5.1: + version "7.5.6" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc" + integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^7.3.2: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +sshpk@^1.14.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tslib@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" From eaabed0bc35584a585f4f911059119618f2d6f8a Mon Sep 17 00:00:00 2001 From: mahula Date: Fri, 15 Jul 2022 14:33:38 +0200 Subject: [PATCH 008/304] add eslint to package config --- e2e-tests/cypress/tests/package.json | 3 +- e2e-tests/cypress/tests/yarn.lock | 379 ++++++++++++++++++++++++++- 2 files changed, 375 insertions(+), 7 deletions(-) diff --git a/e2e-tests/cypress/tests/package.json b/e2e-tests/cypress/tests/package.json index c311cf407..2b8f6f161 100644 --- a/e2e-tests/cypress/tests/package.json +++ b/e2e-tests/cypress/tests/package.json @@ -12,6 +12,7 @@ "lint": "eslint --max-warnings=0 --ext .js,.ts ." }, "dependencies": { - "cypress": "^10.3.0" + "cypress": "^10.3.0", + "eslint": "^8.19.0" } } diff --git a/e2e-tests/cypress/tests/yarn.lock b/e2e-tests/cypress/tests/yarn.lock index e106a617f..7ff7c56eb 100644 --- a/e2e-tests/cypress/tests/yarn.lock +++ b/e2e-tests/cypress/tests/yarn.lock @@ -39,6 +39,35 @@ debug "^3.1.0" lodash.once "^4.1.1" +"@eslint/eslintrc@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" + integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.2" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@humanwhocodes/config-array@^0.9.2": + version "0.9.5" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" + integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@types/node@*": version "18.0.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.4.tgz#48aedbf35efb3af1248e4cd4d792c730290cd5d6" @@ -66,6 +95,16 @@ dependencies: "@types/node" "*" +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.7.1: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -74,6 +113,16 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ansi-colors@^4.1.1: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" @@ -103,6 +152,11 @@ arch@^2.2.0: resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + asn1@~0.2.3: version "0.2.6" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" @@ -198,12 +252,17 @@ cachedir@^2.3.0: resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -294,7 +353,7 @@ core-util-is@1.0.2: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== -cross-spawn@^7.0.0: +cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -303,7 +362,7 @@ cross-spawn@^7.0.0: shebang-command "^2.0.0" which "^2.0.1" -cypress@10.3.0: +cypress@^10.3.0: version "10.3.0" resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.3.0.tgz#fae8d32f0822fcfb938e79c7c31ef344794336ae" integrity sha512-txkQWKzvBVnWdCuKs5Xc08gjpO89W2Dom2wpZgT9zWZT5jXxqPIxqP/NC1YArtkpmp3fN5HW8aDjYBizHLUFvg== @@ -377,11 +436,23 @@ debug@^4.1.1, debug@^4.3.2: dependencies: ms "2.1.2" +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -414,6 +485,110 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.19.0: + version "8.19.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.19.0.tgz#7342a3cbc4fbc5c106a1eefe0fd0b50b6b1a7d28" + integrity sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw== + dependencies: + "@eslint/eslintrc" "^1.3.0" + "@humanwhocodes/config-array" "^0.9.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.2" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^9.3.2: + version "9.3.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" + integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== + dependencies: + acorn "^8.7.1" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + eventemitter2@^6.4.3: version "6.4.6" resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.6.tgz#92d56569cc147a4d9b9da9e942e89b20ce236b0a" @@ -467,6 +642,21 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -481,6 +671,26 @@ figures@^3.2.0: dependencies: escape-string-regexp "^1.0.5" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" + integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -510,6 +720,11 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -531,6 +746,13 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob@^7.1.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -550,6 +772,13 @@ global-dirs@^3.0.0: dependencies: ini "2.0.0" +globals@^13.15.0: + version "13.16.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.16.0.tgz#9be4aca28f311aaeb974ea54978ebbb5e35ce46a" + integrity sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q== + dependencies: + type-fest "^0.20.2" + graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -579,6 +808,24 @@ ieee754@^1.1.13: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -609,11 +856,23 @@ is-ci@^3.0.0: dependencies: ci-info "^3.2.0" +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-glob@^4.0.0, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + is-installed-globally@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" @@ -652,16 +911,33 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + json-schema@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -691,6 +967,14 @@ lazy-ass@^1.6.0: resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + listr2@^3.8.3: version "3.14.0" resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" @@ -705,6 +989,11 @@ listr2@^3.8.3: through "^2.3.8" wrap-ansi "^7.0.0" +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.once@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" @@ -762,7 +1051,7 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^3.1.1: +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -784,6 +1073,11 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + npm-run-path@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -805,6 +1099,18 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + ospath@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" @@ -817,6 +1123,13 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -842,6 +1155,11 @@ pify@^2.2.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + pretty-bytes@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" @@ -865,7 +1183,7 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.1: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -875,6 +1193,11 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + request-progress@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" @@ -882,6 +1205,11 @@ request-progress@^3.0.0: dependencies: throttleit "^1.0.0" +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -895,7 +1223,7 @@ rfdc@^1.3.0: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^3.0.0: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -997,6 +1325,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -1011,6 +1344,11 @@ supports-color@^8.1.1: dependencies: has-flag "^4.0.0" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + throttleit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" @@ -1053,6 +1391,18 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -1068,11 +1418,23 @@ untildify@^4.0.0: resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -1089,6 +1451,11 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" From 9860a0509d5050ac6d2369d1cf040806d9306b1a Mon Sep 17 00:00:00 2001 From: mahula Date: Fri, 15 Jul 2022 15:09:57 +0200 Subject: [PATCH 009/304] rework cypress tests dockerfile: - reduce to necessary dependencies - control browser installation (chromium, firefox) - use yarn for cypress installation --- e2e-tests/cypress/Dockerfile | 77 +++++++++++------------------------- 1 file changed, 22 insertions(+), 55 deletions(-) diff --git a/e2e-tests/cypress/Dockerfile b/e2e-tests/cypress/Dockerfile index 5251e071a..8119ea08d 100644 --- a/e2e-tests/cypress/Dockerfile +++ b/e2e-tests/cypress/Dockerfile @@ -2,64 +2,31 @@ # Dockerfile to create a ready-to-use Cypress Docker image for end-to-end # testing. # -# This Dockerfile is based on the Dockerfile using Node.js 16.14.2 and -# Cypress 10.3.0 -# (https://github.com/cypress-io/cypress-docker-images/blob/master/included/10.3.0/Dockerfile) -# from Cypress.io Docker images. +# Based on the images containing several browsers, provided by Cypress.io +# (https://github.com/cypress-io/cypress-docker-images/tree/master/browsers) +# this Dockerfile is based a slim Linux Dockerfile using Node.js 16.14.2. +# +# Here the latest stable versions of the browsers Chromium and Firefox are +# installed before installing Cypress. ############################################################################### -FROM cypress/browsers:node16.14.2-slim-chrome100-ff99-edge +FROM cypress/base:16.14.2-slim -# avoid too many progress messages -# https://github.com/cypress-io/cypress/issues/1243 -ENV CI=1 \ -# disable shared memory X11 affecting Cypress v4 and Chrome -# https://github.com/cypress-io/cypress-docker-images/issues/270 - QT_X11_NO_MITSHM=1 \ - _X11_NO_MITSHM=1 \ - _MITSHM=0 \ - # point Cypress at the /root/cache no matter what user account is used - # see https://on.cypress.io/caching - CYPRESS_CACHE_FOLDER=/root/.cache/Cypress \ - # Allow projects to reference globally installed cypress - NODE_PATH=/usr/local/lib/node_modules +# install dependencies +RUN apt-get -qq update > /dev/null && \ + apt-get -qq install -y bzip2 mplayer wget > /dev/null -# should be root user -RUN echo "whoami: $(whoami)" \ - && npm config -g set user $(whoami) \ - # command "id" should print: - # uid=0(root) gid=0(root) groups=0(root) - # which means the current user is root - && id \ - && npm install -g "cypress@10.3.0" \ - && cypress verify \ - # Cypress cache and installed version - # should be in the root user's home folder - && cypress cache path \ - && cypress cache list \ - && cypress info \ - && cypress version \ - # give every user read access to the "/root" folder where the binary is cached - # we really only need to worry about the top folder, fortunately - && ls -la /root \ - && chmod 755 /root \ - # always grab the latest Yarn - # otherwise the base image might have old versions - # NPM does not need to be installed as it is already included with Node. - && npm i -g yarn@latest \ - # Show where Node loads required modules from - && node -p 'module.paths' \ - # should print Cypress version - # plus Electron and bundled Node versions - && cypress version \ - && echo " node version: $(node -v) \n" \ - "npm version: $(npm -v) \n" \ - "yarn version: $(yarn -v) \n" \ - "debian version: $(cat /etc/debian_version) \n" \ - "user: $(whoami) \n" \ - "chrome: $(google-chrome --version || true) \n" \ - "firefox: $(firefox --version || true) \n" +# install Chromium browser +RUN apt-get -qq install -y chromium > /dev/null + +# install Firefox browser +RUN wget --no-verbose -O /tmp/firefox.tar.bz2 "https://download.mozilla.org/?product=firefox-latest&os=linux64&lang=en-US" && \ + tar -C /opt -xjf /tmp/firefox.tar.bz2 && \ + rm /tmp/firefox.tar.bz2 && \ + ln -fs /opt/firefox/firefox /usr/bin/firefox + +# clean up +RUN rm -rf /var/lib/apt/lists/* && apt-get -qq clean > /dev/null WORKDIR /tests COPY tests/ /tests - -# ENTRYPOINT ["cypress", "run"] +RUN yarn install From 4e9e834df497526b5a81f5e8d0e346114ab2f476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Fri, 15 Jul 2022 16:37:32 +0200 Subject: [PATCH 010/304] adapt users table --- .../User.ts | 109 ++++++++++++++++++ database/entity/User.ts | 2 +- database/entity/index.ts | 2 + .../0044-adapt_users_table_for_gradidoid.ts | 2 +- 4 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 database/entity/0044-adapt_users_table_for_gradidoid/User.ts diff --git a/database/entity/0044-adapt_users_table_for_gradidoid/User.ts b/database/entity/0044-adapt_users_table_for_gradidoid/User.ts new file mode 100644 index 000000000..658638b5e --- /dev/null +++ b/database/entity/0044-adapt_users_table_for_gradidoid/User.ts @@ -0,0 +1,109 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, DeleteDateColumn } from 'typeorm' + +@Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) +export class User extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ + name: 'gradido_id', + length: 36, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + gradidoID: string + + @Column({ + name: 'alias', + length: 20, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + alias: string + + @Column({ name: 'public_key', type: 'binary', length: 32, default: null, nullable: true }) + pubKey: Buffer + + @Column({ name: 'privkey', type: 'binary', length: 80, default: null, nullable: true }) + privKey: Buffer + + @Column({ + name: 'passphrase_encrypt_type', + length: 36, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + passphraseEncryptType: string + + @Column({ length: 255, unique: true, nullable: false, collation: 'utf8mb4_unicode_ci' }) + email: string + + @Column({ name: 'email_id', type: 'int', unsigned: true, nullable: true, default: null }) + emailId?: number | null + + @Column({ + name: 'first_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + firstName: string + + @Column({ + name: 'last_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + lastName: string + + @DeleteDateColumn() + deletedAt: Date | null + + @Column({ type: 'bigint', default: 0, unsigned: true }) + password: BigInt + + @Column({ name: 'email_hash', type: 'binary', length: 32, default: null, nullable: true }) + emailHash: Buffer + + @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP', nullable: false }) + createdAt: Date + + @Column({ name: 'email_checked', type: 'bool', nullable: false, default: false }) + emailChecked: boolean + + @Column({ length: 4, default: 'de', collation: 'utf8mb4_unicode_ci', nullable: false }) + language: string + + @Column({ name: 'is_admin', type: 'datetime', nullable: true, default: null }) + isAdmin: Date | null + + @Column({ name: 'referrer_id', type: 'int', unsigned: true, nullable: true, default: null }) + referrerId?: number | null + + @Column({ + name: 'contribution_link_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + contributionLinkId?: number | null + + @Column({ name: 'publisher_id', default: 0 }) + publisherId: number + + @Column({ + type: 'text', + name: 'passphrase', + collation: 'utf8mb4_unicode_ci', + nullable: true, + default: null, + }) + passphrase: string +} diff --git a/database/entity/User.ts b/database/entity/User.ts index 99b8c8ca9..a29e87cd7 100644 --- a/database/entity/User.ts +++ b/database/entity/User.ts @@ -1 +1 @@ -export { User } from './0040-add_contribution_link_id_to_user/User' +export { User } from './0044-adapt_users_table_for_gradidoid/User' diff --git a/database/entity/index.ts b/database/entity/index.ts index 266c40740..76acba3fa 100644 --- a/database/entity/index.ts +++ b/database/entity/index.ts @@ -5,6 +5,7 @@ import { Migration } from './Migration' import { Transaction } from './Transaction' import { TransactionLink } from './TransactionLink' import { User } from './User' +import { UserContact } from './UserContact' import { Contribution } from './Contribution' export const entities = [ @@ -16,4 +17,5 @@ export const entities = [ Transaction, TransactionLink, User, + UserContact, ] diff --git a/database/migrations/0044-adapt_users_table_for_gradidoid.ts b/database/migrations/0044-adapt_users_table_for_gradidoid.ts index 29fae353e..eb5f8e2cf 100644 --- a/database/migrations/0044-adapt_users_table_for_gradidoid.ts +++ b/database/migrations/0044-adapt_users_table_for_gradidoid.ts @@ -1,6 +1,6 @@ /* MIGRATION TO ADD GRADIDO_ID * - * This migration adds new columns to the table `users` and creates the + * This migration adds new columns to the table `users` and creates the * new table `user_contacts` */ From 138891dfe36ad44f5375cabe388995195850f2e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Fri, 15 Jul 2022 16:37:49 +0200 Subject: [PATCH 011/304] add user_contacts table --- .../UserContact.ts | 40 +++++++++++++++++++ database/entity/UserContact.ts | 1 + 2 files changed, 41 insertions(+) create mode 100644 database/entity/0044-adapt_users_table_for_gradidoid/UserContact.ts create mode 100644 database/entity/UserContact.ts diff --git a/database/entity/0044-adapt_users_table_for_gradidoid/UserContact.ts b/database/entity/0044-adapt_users_table_for_gradidoid/UserContact.ts new file mode 100644 index 000000000..41f622722 --- /dev/null +++ b/database/entity/0044-adapt_users_table_for_gradidoid/UserContact.ts @@ -0,0 +1,40 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, DeleteDateColumn } from 'typeorm' + +@Entity('user_contacts', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) +export class UserContact extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ + name: 'type', + length: 100, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + type: string + + @Column({ name: 'users_id', type: 'int', unsigned: true, nullable: false }) + usersId?: number | null + + @Column({ length: 255, unique: true, nullable: false, collation: 'utf8mb4_unicode_ci' }) + email: string + + @Column({ name: 'email_hash', type: 'binary', length: 32, default: null, nullable: true }) + emailHash: Buffer + + @Column({ name: 'email_checked', type: 'bool', nullable: false, default: false }) + emailChecked: boolean + + @Column({ length: 255, unique: false, nullable: true, collation: 'utf8mb4_unicode_ci' }) + phone: string + + @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP', nullable: false }) + createdAt: Date + + @DeleteDateColumn() + updatedAt: Date | null + + @DeleteDateColumn() + deletedAt: Date | null +} diff --git a/database/entity/UserContact.ts b/database/entity/UserContact.ts new file mode 100644 index 000000000..dce775516 --- /dev/null +++ b/database/entity/UserContact.ts @@ -0,0 +1 @@ +export { UserContact } from './0044-adapt_users_table_for_gradidoid/UserContact' From e8bcda810a3addc8c2d9d14852c05cebf1512791 Mon Sep 17 00:00:00 2001 From: mahula Date: Mon, 18 Jul 2022 22:26:47 +0200 Subject: [PATCH 012/304] fix selection if identifiers for login POM in Playwright tests --- e2e-tests/playwright/tests/models/login_page.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/e2e-tests/playwright/tests/models/login_page.ts b/e2e-tests/playwright/tests/models/login_page.ts index 418adc555..50abb4933 100644 --- a/e2e-tests/playwright/tests/models/login_page.ts +++ b/e2e-tests/playwright/tests/models/login_page.ts @@ -11,8 +11,8 @@ export class LoginPage { this.page = page; this.url = './login'; this.emailInput = page.locator('id=Email-input-field'); - this.passwordInput = page.locator('id=Passwort-input-field'); - this.submitBtn = page.locator('text=Anmeldung'); + this.passwordInput = page.locator('id=Password-input-field'); + this.submitBtn = page.locator('text=Login'); } async goto() { From a04610153bc5d4c9a776b8db6e17b1669499233e Mon Sep 17 00:00:00 2001 From: mahula Date: Mon, 18 Jul 2022 22:28:31 +0200 Subject: [PATCH 013/304] set Playwright test to utilize webkit --- e2e-tests/playwright/tests/playwright.config.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/e2e-tests/playwright/tests/playwright.config.ts b/e2e-tests/playwright/tests/playwright.config.ts index 073c34b06..84b010dc5 100644 --- a/e2e-tests/playwright/tests/playwright.config.ts +++ b/e2e-tests/playwright/tests/playwright.config.ts @@ -14,6 +14,8 @@ const config: PlaywrightTestConfig = { viewport: { width: 1280, height: 720 }, use: { baseURL: process.env.URL || 'http://localhost:3000', + browserName: 'webkit', + }, }; export default config; From 196e0e661d737978196d648e8dbb7289ec0a4da4 Mon Sep 17 00:00:00 2001 From: mahula Date: Mon, 18 Jul 2022 22:50:58 +0200 Subject: [PATCH 014/304] refactor Dockerfile to avoid hardcoded versioning of Playwright --- e2e-tests/playwright/Dockerfile | 44 +++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/e2e-tests/playwright/Dockerfile b/e2e-tests/playwright/Dockerfile index ef8d51984..c0dfbde47 100644 --- a/e2e-tests/playwright/Dockerfile +++ b/e2e-tests/playwright/Dockerfile @@ -1,14 +1,42 @@ ############################################################################### -# Dockerfile to create a ready to use Playwright Docker image for end-to-end -# testing +# Dockerfile to create a ready-to-use Playwright Docker image for end-to-end +# testing. +# +# To avoid hardcoded versoning of Playwright, this Dockerfile is a custom +# version of the ready-to-use Dockerfile privided by Playwright developement +# (https://github.com/microsoft/playwright/blob/main/utils/docker/Dockerfile.focal) +# +# Here the latest stable versions of the browsers Chromium, Firefox, and Webkit +# (Safari) are installed, icluding all dependencies based on Ubuntu specified by +# Playwright developement. ############################################################################### -ARG PLAYWIRGHT_VERSION=1.23.2 -FROM mcr.microsoft.com/playwright:v$PLAYWIRGHT_VERSION-focal +FROM ubuntu:focal -WORKDIR /tests +# set a timezone for the Playwright browser dependency installation +ARG TZ=Europe/Berlin -RUN npm install playwright@$PLAYWIRGHT_VERSION -RUN npm install -D @playwright/test +ARG DOCKER_WORKDIR=/tests/ +WORKDIR $DOCKER_WORKDIR -COPY tests/ /tests +# package manager preparation +RUN apt-get -qq update && apt-get install -qq -y curl gpg > /dev/null +# for Node.js +RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - +# for Yarn +RUN curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ + echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list + +# install node v16 and Yarn +RUN apt-get -qq update && apt-get install -qq -y nodejs yarn + +COPY tests/package.json tests/yarn.lock $DOCKER_WORKDIR + +# install Playwright with all dependencies +# for the browsers chromium, firefox, and webkit +RUN yarn install && yarn playwright install --with-deps + +# clean up +RUN rm -rf /var/lib/apt/lists/* && apt-get -qq clean + +COPY tests/ $DOCKER_WORKDIR From 5d15ea7d7afe50914e97eb2d74a2b8fa6b324ff4 Mon Sep 17 00:00:00 2001 From: clauspeterhuebner <86960882+clauspeterhuebner@users.noreply.github.com> Date: Tue, 19 Jul 2022 02:45:01 +0200 Subject: [PATCH 015/304] Update database/entity/0044-adapt_users_table_for_gradidoid/User.ts Co-authored-by: Moriz Wahl --- database/entity/0044-adapt_users_table_for_gradidoid/User.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/entity/0044-adapt_users_table_for_gradidoid/User.ts b/database/entity/0044-adapt_users_table_for_gradidoid/User.ts index 658638b5e..ca6d80cb9 100644 --- a/database/entity/0044-adapt_users_table_for_gradidoid/User.ts +++ b/database/entity/0044-adapt_users_table_for_gradidoid/User.ts @@ -8,7 +8,7 @@ export class User extends BaseEntity { @Column({ name: 'gradido_id', length: 36, - nullable: true, + nullable: false, default: null, collation: 'utf8mb4_unicode_ci', }) From 950241a2f0696a3b0b3828766608e4f73ca0e5a9 Mon Sep 17 00:00:00 2001 From: clauspeterhuebner <86960882+clauspeterhuebner@users.noreply.github.com> Date: Tue, 19 Jul 2022 02:46:06 +0200 Subject: [PATCH 016/304] Update database/entity/0044-adapt_users_table_for_gradidoid/UserContact.ts Co-authored-by: Moriz Wahl --- .../0044-adapt_users_table_for_gradidoid/UserContact.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/database/entity/0044-adapt_users_table_for_gradidoid/UserContact.ts b/database/entity/0044-adapt_users_table_for_gradidoid/UserContact.ts index 41f622722..53aac52ab 100644 --- a/database/entity/0044-adapt_users_table_for_gradidoid/UserContact.ts +++ b/database/entity/0044-adapt_users_table_for_gradidoid/UserContact.ts @@ -14,8 +14,8 @@ export class UserContact extends BaseEntity { }) type: string - @Column({ name: 'users_id', type: 'int', unsigned: true, nullable: false }) - usersId?: number | null + @Column({ name: 'user_id', type: 'int', unsigned: true, nullable: false }) + userId: number @Column({ length: 255, unique: true, nullable: false, collation: 'utf8mb4_unicode_ci' }) email: string From 3a9186d192e64f85cabd1d8f6a4f7233d5d2d33e Mon Sep 17 00:00:00 2001 From: clauspeterhuebner <86960882+clauspeterhuebner@users.noreply.github.com> Date: Tue, 19 Jul 2022 02:47:17 +0200 Subject: [PATCH 017/304] Update database/migrations/0044-adapt_users_table_for_gradidoid.ts Co-authored-by: Moriz Wahl --- database/migrations/0044-adapt_users_table_for_gradidoid.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migrations/0044-adapt_users_table_for_gradidoid.ts b/database/migrations/0044-adapt_users_table_for_gradidoid.ts index eb5f8e2cf..4ef06e715 100644 --- a/database/migrations/0044-adapt_users_table_for_gradidoid.ts +++ b/database/migrations/0044-adapt_users_table_for_gradidoid.ts @@ -12,7 +12,7 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis CREATE TABLE IF NOT EXISTS \`user_contacts\` ( \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, \`type\` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, - \`users_id\` int(10) unsigned NOT NULL, + \`user_id\` int(10) unsigned NOT NULL, \`email\` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL UNIQUE, \`email_hash\` binary(32) NULL, \`email_checked\` tinyint(4) NOT NULL DEFAULT 0, From c02e12fa969412defd0a9d5fa9bf497c539db45d Mon Sep 17 00:00:00 2001 From: clauspeterhuebner <86960882+clauspeterhuebner@users.noreply.github.com> Date: Tue, 19 Jul 2022 02:47:36 +0200 Subject: [PATCH 018/304] Update database/migrations/0044-adapt_users_table_for_gradidoid.ts Co-authored-by: Moriz Wahl --- database/migrations/0044-adapt_users_table_for_gradidoid.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migrations/0044-adapt_users_table_for_gradidoid.ts b/database/migrations/0044-adapt_users_table_for_gradidoid.ts index 4ef06e715..f1500c8c1 100644 --- a/database/migrations/0044-adapt_users_table_for_gradidoid.ts +++ b/database/migrations/0044-adapt_users_table_for_gradidoid.ts @@ -23,7 +23,7 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis PRIMARY KEY (\`id\`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) - await queryFn('ALTER TABLE `users` ADD COLUMN `gradido_id` varchar(36) NULL AFTER `id`;') + await queryFn('ALTER TABLE `users` ADD COLUMN `gradido_id` UUID NOT NULL DEFAULT UUID() AFTER `id`;') await queryFn('ALTER TABLE `users` ADD COLUMN `alias` varchar(20) NULL AFTER `gradido_id`;') await queryFn( 'ALTER TABLE `users` ADD COLUMN `passphrase_encrypt_type` varchar(36) NULL AFTER `privkey`;', From 126495676f0956f814f5141f2ec000a7f1f5ffb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 19 Jul 2022 02:51:37 +0200 Subject: [PATCH 019/304] upgrade DB_VERSION to 0044 --- backend/src/config/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index 2120fce71..101d2d702 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -10,7 +10,7 @@ Decimal.set({ }) const constants = { - DB_VERSION: '0043-add_event_protocol_table', + DB_VERSION: '0044-adapt_users_table_for_gradidoid', DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0 LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info From f125f967f2909f9c6338e8e89b57c6f5eaf2507b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 19 Jul 2022 02:52:54 +0200 Subject: [PATCH 020/304] delete columns passphraseEncryptType and emailHash --- .../0044-adapt_users_table_for_gradidoid/User.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/database/entity/0044-adapt_users_table_for_gradidoid/User.ts b/database/entity/0044-adapt_users_table_for_gradidoid/User.ts index 658638b5e..c6d26524a 100644 --- a/database/entity/0044-adapt_users_table_for_gradidoid/User.ts +++ b/database/entity/0044-adapt_users_table_for_gradidoid/User.ts @@ -29,15 +29,6 @@ export class User extends BaseEntity { @Column({ name: 'privkey', type: 'binary', length: 80, default: null, nullable: true }) privKey: Buffer - @Column({ - name: 'passphrase_encrypt_type', - length: 36, - nullable: true, - default: null, - collation: 'utf8mb4_unicode_ci', - }) - passphraseEncryptType: string - @Column({ length: 255, unique: true, nullable: false, collation: 'utf8mb4_unicode_ci' }) email: string @@ -68,9 +59,6 @@ export class User extends BaseEntity { @Column({ type: 'bigint', default: 0, unsigned: true }) password: BigInt - @Column({ name: 'email_hash', type: 'binary', length: 32, default: null, nullable: true }) - emailHash: Buffer - @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP', nullable: false }) createdAt: Date From 5baf558e778e27b066291215bab4d8573bb6aa0f Mon Sep 17 00:00:00 2001 From: mahula Date: Tue, 19 Jul 2022 08:35:48 +0200 Subject: [PATCH 021/304] update README regarding yarn usage --- e2e-tests/playwright/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e-tests/playwright/README.md b/e2e-tests/playwright/README.md index 3ebc9ce2f..a5fb742ef 100644 --- a/e2e-tests/playwright/README.md +++ b/e2e-tests/playwright/README.md @@ -20,5 +20,5 @@ to boot up the DEV system, before running the test. docker build -t gradido_e2e-tests-playwright . # run the Docker container and execute the given tests -docker run -it gradido_e2e-tests-playwright npx playwright test +docker run -it gradido_e2e-tests-playwright yarn playwright-e2e-tests ``` From 5ab925d82323179bc687c01065588372c7aca887 Mon Sep 17 00:00:00 2001 From: mahula Date: Tue, 19 Jul 2022 11:03:25 +0200 Subject: [PATCH 022/304] update both README file regarding using the hosts network for local testing --- e2e-tests/cypress/README.md | 4 +--- e2e-tests/playwright/README.md | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/e2e-tests/cypress/README.md b/e2e-tests/cypress/README.md index 69c1d7642..b1ddae514 100644 --- a/e2e-tests/cypress/README.md +++ b/e2e-tests/cypress/README.md @@ -16,11 +16,9 @@ to boot up the DEV system, before running the test. ## Execute the test ```bash -cd e2e-tests/cypress - # build a Docker image from the Dockerfile docker build -t gradido_e2e-tests-cypress . # run the Docker container and execute the given tests -docker run -it gradido_e2e-tests-cypress yarn run cypress-e2e-tests +docker run -it --network=host gradido_e2e-tests-cypress yarn run cypress-e2e-tests ``` diff --git a/e2e-tests/playwright/README.md b/e2e-tests/playwright/README.md index a5fb742ef..a3a2b34bb 100644 --- a/e2e-tests/playwright/README.md +++ b/e2e-tests/playwright/README.md @@ -20,5 +20,5 @@ to boot up the DEV system, before running the test. docker build -t gradido_e2e-tests-playwright . # run the Docker container and execute the given tests -docker run -it gradido_e2e-tests-playwright yarn playwright-e2e-tests +docker run -it --network=host gradido_e2e-tests-playwright yarn playwright-e2e-tests ``` From fda966d273fba47b39d86bfc5ebc7f7d7e5eddb7 Mon Sep 17 00:00:00 2001 From: mahula Date: Tue, 19 Jul 2022 13:05:07 +0200 Subject: [PATCH 023/304] update cypress dockerfile --- e2e-tests/cypress/Dockerfile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/e2e-tests/cypress/Dockerfile b/e2e-tests/cypress/Dockerfile index 8119ea08d..8c8e00da8 100644 --- a/e2e-tests/cypress/Dockerfile +++ b/e2e-tests/cypress/Dockerfile @@ -11,6 +11,9 @@ ############################################################################### FROM cypress/base:16.14.2-slim +ARG DOCKER_WORKDIR=/tests/ +WORKDIR $DOCKER_WORKDIR + # install dependencies RUN apt-get -qq update > /dev/null && \ apt-get -qq install -y bzip2 mplayer wget > /dev/null @@ -27,6 +30,7 @@ RUN wget --no-verbose -O /tmp/firefox.tar.bz2 "https://download.mozilla.org/?pro # clean up RUN rm -rf /var/lib/apt/lists/* && apt-get -qq clean > /dev/null -WORKDIR /tests -COPY tests/ /tests +COPY tests/package.json tests/yarn.lock $DOCKER_WORKDIR + RUN yarn install +COPY tests/ $DOCKER_WORKDIR From 0e2bb874372532cf20cb7a181ddecf8219018cff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 19 Jul 2022 23:36:59 +0200 Subject: [PATCH 024/304] return migration back to 0039 --- backend/src/config/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index 101d2d702..6340fb697 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -10,7 +10,7 @@ Decimal.set({ }) const constants = { - DB_VERSION: '0044-adapt_users_table_for_gradidoid', + DB_VERSION: '0039-contributions_table', DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0 LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info From ab765e7a8f223abab45186bb351b0396ee9a31d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 19 Jul 2022 23:51:38 +0200 Subject: [PATCH 025/304] shift User from migration 0044 to 0039 --- database/entity/User.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/entity/User.ts b/database/entity/User.ts index a29e87cd7..2226e4d51 100644 --- a/database/entity/User.ts +++ b/database/entity/User.ts @@ -1 +1 @@ -export { User } from './0044-adapt_users_table_for_gradidoid/User' +export { User } from './0039-contributions_table/User' From cca6226b55cc4bf72350121141686f532098534c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Thu, 21 Jul 2022 23:15:29 +0200 Subject: [PATCH 026/304] new table user_contacts and change table users --- .../migrations/0044-adapt_users_table_for_gradidoid.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/database/migrations/0044-adapt_users_table_for_gradidoid.ts b/database/migrations/0044-adapt_users_table_for_gradidoid.ts index f1500c8c1..7b9cdbc94 100644 --- a/database/migrations/0044-adapt_users_table_for_gradidoid.ts +++ b/database/migrations/0044-adapt_users_table_for_gradidoid.ts @@ -23,10 +23,11 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis PRIMARY KEY (\`id\`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) - await queryFn('ALTER TABLE `users` ADD COLUMN `gradido_id` UUID NOT NULL DEFAULT UUID() AFTER `id`;') - await queryFn('ALTER TABLE `users` ADD COLUMN `alias` varchar(20) NULL AFTER `gradido_id`;') await queryFn( - 'ALTER TABLE `users` ADD COLUMN `passphrase_encrypt_type` varchar(36) NULL AFTER `privkey`;', + 'ALTER TABLE `users` ADD COLUMN `gradido_id` varchar(36) NOT NULL UNIQUE DEFAULT UUID() AFTER `id`;', + ) + await queryFn( + 'ALTER TABLE `users` ADD COLUMN `alias` varchar(20) NULL UNIQUE AFTER `gradido_id`;', ) await queryFn('ALTER TABLE `users` ADD COLUMN `email_id` int(10) NULL AFTER `email`;') } @@ -37,6 +38,5 @@ export async function downgrade(queryFn: (query: string, values?: any[]) => Prom await queryFn('ALTER TABLE `users` DROP COLUMN `gradido_id`;') await queryFn('ALTER TABLE `users` DROP COLUMN `alias`;') - await queryFn('ALTER TABLE `users` DROP COLUMN `passphrase_encrypt_type`;') await queryFn('ALTER TABLE `users` DROP COLUMN `email_id`;') } From cb4ee4590ad5ed68a7408a1fefe3d0b79178ed52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Thu, 21 Jul 2022 23:16:19 +0200 Subject: [PATCH 027/304] adapt User and UserContact entity --- .../0044-adapt_users_table_for_gradidoid/User.ts | 16 ++++++++++++++-- .../UserContact.ts | 6 +++--- database/entity/User.ts | 2 +- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/database/entity/0044-adapt_users_table_for_gradidoid/User.ts b/database/entity/0044-adapt_users_table_for_gradidoid/User.ts index f4063f65c..1e7e9d8d8 100644 --- a/database/entity/0044-adapt_users_table_for_gradidoid/User.ts +++ b/database/entity/0044-adapt_users_table_for_gradidoid/User.ts @@ -1,4 +1,13 @@ -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, DeleteDateColumn } from 'typeorm' +import { + BaseEntity, + Entity, + PrimaryGeneratedColumn, + Column, + DeleteDateColumn, + OneToMany, + JoinColumn, +} from 'typeorm' +import { Contribution } from '../Contribution' @Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) export class User extends BaseEntity { @@ -9,7 +18,6 @@ export class User extends BaseEntity { name: 'gradido_id', length: 36, nullable: false, - default: null, collation: 'utf8mb4_unicode_ci', }) gradidoID: string @@ -94,4 +102,8 @@ export class User extends BaseEntity { default: null, }) passphrase: string + + @OneToMany(() => Contribution, (contribution) => contribution.user) + @JoinColumn({ name: 'user_id' }) + contributions?: Contribution[] } diff --git a/database/entity/0044-adapt_users_table_for_gradidoid/UserContact.ts b/database/entity/0044-adapt_users_table_for_gradidoid/UserContact.ts index 53aac52ab..fee0afeda 100644 --- a/database/entity/0044-adapt_users_table_for_gradidoid/UserContact.ts +++ b/database/entity/0044-adapt_users_table_for_gradidoid/UserContact.ts @@ -29,12 +29,12 @@ export class UserContact extends BaseEntity { @Column({ length: 255, unique: false, nullable: true, collation: 'utf8mb4_unicode_ci' }) phone: string - @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP', nullable: false }) + @Column({ name: 'created_at', default: () => 'CURRENT_TIMESTAMP', nullable: false }) createdAt: Date - @DeleteDateColumn() + @DeleteDateColumn({ name: 'updated_at', nullable: true }) updatedAt: Date | null - @DeleteDateColumn() + @DeleteDateColumn({ name: 'deleted_at', nullable: true }) deletedAt: Date | null } diff --git a/database/entity/User.ts b/database/entity/User.ts index 2226e4d51..a29e87cd7 100644 --- a/database/entity/User.ts +++ b/database/entity/User.ts @@ -1 +1 @@ -export { User } from './0039-contributions_table/User' +export { User } from './0044-adapt_users_table_for_gradidoid/User' From 26985ef49c7eac8fd0161a6650ef470673086c04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Thu, 21 Jul 2022 23:17:05 +0200 Subject: [PATCH 028/304] switch DB_VERSION to 0044 --- backend/src/config/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index 6340fb697..101d2d702 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -10,7 +10,7 @@ Decimal.set({ }) const constants = { - DB_VERSION: '0039-contributions_table', + DB_VERSION: '0044-adapt_users_table_for_gradidoid', DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0 LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info From 86a0ab731fb18e9735f9929f1e969396e11242db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Thu, 21 Jul 2022 23:18:31 +0200 Subject: [PATCH 029/304] adapt UserResolver and Test to database changes --- backend/src/graphql/resolver/UserResolver.test.ts | 5 ++++- backend/src/graphql/resolver/UserResolver.ts | 4 ++-- backend/src/util/communityUser.ts | 4 +++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index a2a499224..9034df8f6 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -111,13 +111,16 @@ describe('UserResolver', () => { expect(user).toEqual([ { id: expect.any(Number), + gradidoID: expect.any(String), + alias: null, email: 'peter@lustig.de', + emailId: null, firstName: 'Peter', lastName: 'Lustig', password: '0', pubKey: null, privKey: null, - emailHash: expect.any(Buffer), + // emailHash: expect.any(Buffer), createdAt: expect.any(Date), emailChecked: false, passphrase: expect.any(String), diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index a89a8cb0b..f61414e42 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -377,7 +377,7 @@ export class UserResolver { // const keyPair = KeyPairEd25519Create(passphrase) // return pub, priv Key // const passwordHash = SecretKeyCryptographyCreateKey(email, password) // return short and long hash // const encryptedPrivkey = SecretKeyCryptographyEncrypt(keyPair[1], passwordHash[1]) - const emailHash = getEmailHash(email) + // const emailHash = getEmailHash(email) const eventRegister = new EventRegister() const eventRedeemRegister = new EventRedeemRegister() @@ -386,7 +386,7 @@ export class UserResolver { dbUser.email = email dbUser.firstName = firstName dbUser.lastName = lastName - dbUser.emailHash = emailHash + // dbUser.emailHash = emailHash dbUser.language = language dbUser.publisherId = publisherId dbUser.passphrase = passphrase.join(' ') diff --git a/backend/src/util/communityUser.ts b/backend/src/util/communityUser.ts index 1a84c2cdf..c90e786c6 100644 --- a/backend/src/util/communityUser.ts +++ b/backend/src/util/communityUser.ts @@ -6,6 +6,8 @@ import { User } from '@model/User' const communityDbUser: dbUser = { id: -1, + gradidoID: '11111111-2222-3333-4444-55555555', + alias: '', email: 'support@gradido.net', firstName: 'Gradido', lastName: 'Akademie', @@ -13,7 +15,7 @@ const communityDbUser: dbUser = { privKey: Buffer.from(''), deletedAt: null, password: BigInt(0), - emailHash: Buffer.from(''), + // emailHash: Buffer.from(''), createdAt: new Date(), emailChecked: false, language: '', From afd123e133c5f02e4628f3f84fbd5eee13b7373c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Wed, 27 Jul 2022 01:09:55 +0200 Subject: [PATCH 030/304] correct the merge-conflict solving --- docker-compose.override.yml | 124 ------------------------------------ 1 file changed, 124 deletions(-) diff --git a/docker-compose.override.yml b/docker-compose.override.yml index fbd0cd734..f8fde0430 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -1,129 +1,5 @@ version: "3.4" -services: - - ######################################################## - # FRONTEND ############################################# - ######################################################## - frontend: - # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there - image: gradido/frontend:local-development - build: - target: development - environment: - - NODE_ENV="development" - # - DEBUG=true - volumes: - # This makes sure the docker container has its own node modules. - # Therefore it is possible to have a different node version on the host machine - - frontend_node_modules:/app/node_modules - # bind the local folder to the docker to allow live reload - - ./frontend:/app - - ######################################################## - # ADMIN INTERFACE ###################################### - ######################################################## - admin: - # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there - image: gradido/admin:local-development - build: - target: development - environment: - - NODE_ENV="development" - # - DEBUG=true - volumes: - # This makes sure the docker container has its own node modules. - # Therefore it is possible to have a different node version on the host machine - - admin_node_modules:/app/node_modules - # bind the local folder to the docker to allow live reload - - ./admin:/app - - ######################################################## - # BACKEND ############################################## - ######################################################## - backend: - # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there - image: gradido/backend:local-development - build: - target: development - networks: - - external-net - - internal-net - environment: - - NODE_ENV="development" - volumes: - # This makes sure the docker container has its own node modules. - # Therefore it is possible to have a different node version on the host machine - - backend_node_modules:/app/node_modules - - backend_database_node_modules:/database/node_modules - - backend_database_build:/database/build - # bind the local folder to the docker to allow live reload - - ./backend:/app - - ./database:/database - - ######################################################## - # DATABASE ############################################## - ######################################################## - database: - # we always run on production here since else the service lingers - # feel free to change this behaviour if it seems useful - # Due to problems with the volume caching the built files - # we changed this to test build. This keeps the service running. - # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there - image: gradido/database:local-test_up - build: - target: test_up - environment: - - NODE_ENV="development" - volumes: - # This makes sure the docker container has its own node modules. - # Therefore it is possible to have a different node version on the host machine - - database_node_modules:/app/node_modules - - database_build:/app/build - # bind the local folder to the docker to allow live reload - - ./database:/app - - ######################################################### - ## MARIADB ############################################## - ######################################################### - mariadb: - networks: - - internal-net - - external-net - - ######################################################### - ## NGINX ################################################ - ######################################################### - nginx: - volumes: - - ./logs/nginx:/var/log/nginx - - ######################################################### - ## PHPMYADMIN ########################################### - ######################################################### - phpmyadmin: - image: phpmyadmin - environment: - - PMA_ARBITRARY=1 - #restart: always - ports: - - 8074:80 - networks: - - internal-net - - external-net - volumes: - - /sessions - -volumes: - frontend_node_modules: - admin_node_modules: - backend_node_modules: - backend_database_node_modules: - backend_database_build: - database_node_modules: - database_build: -version: "3.4" - services: ######################################################## From 0aa51115780cc296d9ac2d0944cf9c5409786492 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 2 Aug 2022 02:34:16 +0200 Subject: [PATCH 031/304] switch 0044 to 0045 Migration --- .../User.ts | 0 .../UserContact.ts | 0 database/entity/User.ts | 2 +- database/entity/UserContact.ts | 2 +- .../0044-adapt_users_table_for_gradidoid.ts | 42 --------- .../0045-adapt_users_table_for_gradidoid.ts | 90 +++++++++++++++++++ .../UC_Introduction_of_Gradido-ID.md | 33 ++++--- 7 files changed, 115 insertions(+), 54 deletions(-) rename database/entity/{0044-adapt_users_table_for_gradidoid => 0045-adapt_users_table_for_gradidoid}/User.ts (100%) rename database/entity/{0044-adapt_users_table_for_gradidoid => 0045-adapt_users_table_for_gradidoid}/UserContact.ts (100%) delete mode 100644 database/migrations/0044-adapt_users_table_for_gradidoid.ts create mode 100644 database/migrations/0045-adapt_users_table_for_gradidoid.ts diff --git a/database/entity/0044-adapt_users_table_for_gradidoid/User.ts b/database/entity/0045-adapt_users_table_for_gradidoid/User.ts similarity index 100% rename from database/entity/0044-adapt_users_table_for_gradidoid/User.ts rename to database/entity/0045-adapt_users_table_for_gradidoid/User.ts diff --git a/database/entity/0044-adapt_users_table_for_gradidoid/UserContact.ts b/database/entity/0045-adapt_users_table_for_gradidoid/UserContact.ts similarity index 100% rename from database/entity/0044-adapt_users_table_for_gradidoid/UserContact.ts rename to database/entity/0045-adapt_users_table_for_gradidoid/UserContact.ts diff --git a/database/entity/User.ts b/database/entity/User.ts index a29e87cd7..89b5d3d7f 100644 --- a/database/entity/User.ts +++ b/database/entity/User.ts @@ -1 +1 @@ -export { User } from './0044-adapt_users_table_for_gradidoid/User' +export { User } from './0045-adapt_users_table_for_gradidoid/User' diff --git a/database/entity/UserContact.ts b/database/entity/UserContact.ts index dce775516..ac47fac24 100644 --- a/database/entity/UserContact.ts +++ b/database/entity/UserContact.ts @@ -1 +1 @@ -export { UserContact } from './0044-adapt_users_table_for_gradidoid/UserContact' +export { UserContact } from './0045-adapt_users_table_for_gradidoid/UserContact' diff --git a/database/migrations/0044-adapt_users_table_for_gradidoid.ts b/database/migrations/0044-adapt_users_table_for_gradidoid.ts deleted file mode 100644 index 7b9cdbc94..000000000 --- a/database/migrations/0044-adapt_users_table_for_gradidoid.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* MIGRATION TO ADD GRADIDO_ID - * - * This migration adds new columns to the table `users` and creates the - * new table `user_contacts` - */ - -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { - await queryFn(` - CREATE TABLE IF NOT EXISTS \`user_contacts\` ( - \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, - \`type\` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, - \`user_id\` int(10) unsigned NOT NULL, - \`email\` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL UNIQUE, - \`email_hash\` binary(32) NULL, - \`email_checked\` tinyint(4) NOT NULL DEFAULT 0, - \`phone\` varchar(255) COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, - \`created_at\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - \`updated_at\` datetime NULL DEFAULT NULL, - \`deleted_at\` datetime NULL DEFAULT NULL, - PRIMARY KEY (\`id\`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) - - await queryFn( - 'ALTER TABLE `users` ADD COLUMN `gradido_id` varchar(36) NOT NULL UNIQUE DEFAULT UUID() AFTER `id`;', - ) - await queryFn( - 'ALTER TABLE `users` ADD COLUMN `alias` varchar(20) NULL UNIQUE AFTER `gradido_id`;', - ) - await queryFn('ALTER TABLE `users` ADD COLUMN `email_id` int(10) NULL AFTER `email`;') -} - -export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { - // write downgrade logic as parameter of queryFn - await queryFn(`DROP TABLE IF EXISTS \`user_contacts\`;`) - - await queryFn('ALTER TABLE `users` DROP COLUMN `gradido_id`;') - await queryFn('ALTER TABLE `users` DROP COLUMN `alias`;') - await queryFn('ALTER TABLE `users` DROP COLUMN `email_id`;') -} diff --git a/database/migrations/0045-adapt_users_table_for_gradidoid.ts b/database/migrations/0045-adapt_users_table_for_gradidoid.ts new file mode 100644 index 000000000..65c2d4b97 --- /dev/null +++ b/database/migrations/0045-adapt_users_table_for_gradidoid.ts @@ -0,0 +1,90 @@ +/* MIGRATION TO ADD GRADIDO_ID + * + * This migration adds new columns to the table `users` and creates the + * new table `user_contacts` + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` + CREATE FUNCTION UuidToBin(_uuid BINARY(36)) + RETURNS BINARY(16) + LANGUAGE SQL DETERMINISTIC CONTAINS SQL SQL SECURITY INVOKER + RETURN + UNHEX(CONCAT( + SUBSTR(_uuid, 15, 4), + SUBSTR(_uuid, 10, 4), + SUBSTR(_uuid, 1, 8), + SUBSTR(_uuid, 20, 4), + SUBSTR(_uuid, 25) ));`) + + await queryFn(` + CREATE FUNCTION UuidFromBin(_bin BINARY(16)) + RETURNS BINARY(36) + LANGUAGE SQL DETERMINISTIC CONTAINS SQL SQL SECURITY INVOKER + RETURN + LCASE(CONCAT_WS('-', + HEX(SUBSTR(_bin, 5, 4)), + HEX(SUBSTR(_bin, 3, 2)), + HEX(SUBSTR(_bin, 1, 2)), + HEX(SUBSTR(_bin, 9, 2)), + HEX(SUBSTR(_bin, 11)) + ));`) + + await queryFn(` + CREATE TABLE IF NOT EXISTS \`user_contacts\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`type\` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, + \`user_id\` int(10) unsigned NOT NULL, + \`email\` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + \`email_verification_code\` bigint(20) unsigned NOT NULL, + \`email_opt_in_type_id\` int NOT NULL, + \`email_resend_count\` int DEFAULT '0', + \`email_checked\` tinyint(4) NOT NULL DEFAULT 0, + \`phone\` varchar(255) COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + \`created_at\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + \`updated_at\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + \`deleted_at\` datetime NULL DEFAULT NULL, + PRIMARY KEY (\`id\`), + UNIQUE KEY \`email_verification_code\` (\`email_verification_code\`), + UNIQUE KEY \`email\` (\`email\`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) + + await queryFn( + 'ALTER TABLE `users` ADD COLUMN `gradido_id` BINARY(16) NOT NULL UNIQUE DEFAULT UuidToBin(UUID()) AFTER `id`;', + ) + await queryFn( + 'ALTER TABLE `users` ADD COLUMN `alias` varchar(20) NULL UNIQUE AFTER `gradido_id`;', + ) + await queryFn('ALTER TABLE `users` ADD COLUMN `email_id` int(10) NULL AFTER `email`;') + await queryFn(` + INSERT INTO gradido_community.user_contacts + (type, user_id, email, email_verification_code, email_opt_in_type_id, email_resent_count, email_checked, created_at, updated_at, deleted_at) + SELECT + 'EMAIL' as type, + u.id as user_id, + u.email, + e.verification_code, + e.email_opt_in_type_id, + e.resend_count, + u.email_checked, + e.created, + e.updated, + u.deletedAt + FROM + gradido_community.users as u, + gradido_community.login_email_opt_in as e + WHERE + u.id = e.user_id;`) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // write downgrade logic as parameter of queryFn + await queryFn(`DROP TABLE IF EXISTS \`user_contacts\`;`) + + await queryFn('ALTER TABLE `users` DROP COLUMN `gradido_id`;') + await queryFn('ALTER TABLE `users` DROP COLUMN `alias`;') + await queryFn('ALTER TABLE `users` DROP COLUMN `email_id`;') +} diff --git a/docu/Concepts/TechnicalRequirements/UC_Introduction_of_Gradido-ID.md b/docu/Concepts/TechnicalRequirements/UC_Introduction_of_Gradido-ID.md index 5da969eac..c8eb12524 100644 --- a/docu/Concepts/TechnicalRequirements/UC_Introduction_of_Gradido-ID.md +++ b/docu/Concepts/TechnicalRequirements/UC_Introduction_of_Gradido-ID.md @@ -39,14 +39,21 @@ The preferred and proper solution will be to add a new column `Users.emailId `as A new entity `UserContacts `is introduced to store several contacts of different types like email, telephone or other kinds of contact addresses. -| Column | Type | Description | -| --------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| id | int | the technical key of a contact entity | -| type | int | Defines the type of contact entry as enum: Email, Phone, etc | -| usersID | int | Defines the foreign key to the `Users` table | -| email | String | defines the address of a contact entry of type Email | -| phone | String | defines the address of a contact entry of type Phone | -| contactChannels | String | define the contact channel as comma separated list for which this entry is confirmed by the user e.g. main contact (default), infomail, contracting, advertisings, ... | +| Column | Type | Description | +| --------------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| id | int | the technical key of a contact entity | +| type | int | Defines the type of contact entry as enum: Email, Phone, etc | +| userID | int | Defines the foreign key to the `Users` table | +| email | String | defines the address of a contact entry of type Email | +| emailVerificationCode | unsinged bigint(20) | unique code to verify email or password reset | +| emailOptInType | int | REGISTER=1, RESET_PASSWORD=2 | +| emailResendCount | int | counter how often the email was resend | +| emailChecked | boolean | flag if email is verified and confirmed | +| createdAt | DateTime | point of time the Contact was created | +| updatedAt | DateTime | point of time the Contact was updated | +| deletedAt | DateTime | point of time the Contact was soft deleted | +| phone | String | defines the address of a contact entry of type Phone | +| contactChannels | String | define the contact channel as comma separated list for which this entry is confirmed by the user e.g. main contact (default), infomail, contracting, advertisings, ... | ### Database-Migration @@ -58,18 +65,24 @@ In a one-time migration create for each entry of the `Users `tabel an unique UUI #### Primary Email Contact -In a one-time migration read for each entry of the `Users `table the `Users.id` and `Users.email` and create for it a new entry in the `UsersContact `table, by initializing the contact-values with: +In a one-time migration read for each entry of the `Users `table the `Users.id` and `Users.email`, select from the table `login_email_opt_in` the entry with the `login_email_opt_in.user_id` = `Users.id` and create a new entry in the `UsersContact `table, by initializing the contact-values with: * id = new technical key * type = Enum-Email * userID = `Users.id` * email = `Users.email` +* emailVerifyCode = `login_email_opt_in.verification_code` +* emailOptInType = `login_email_opt_in.email_opt_in_type_id` +* emailResendCount = `login_email_opt_in.resent_count` +* emailChecked = `Users.emailChecked` +* createdAt = `login_email_opt_in.created_at` +* updatedAt = `login_email_opt_in.updated_at` * phone = null * usedChannel = Enum-"main contact" and update the `Users `entry with `Users.emailId = UsersContact.Id` and `Users.passphraseEncryptionType = 1` -After this one-time migration the column `Users.email` can be deleted. +After this one-time migration and a verification, which ensures that all data are migrated, then the columns `Users.email`, `Users.emailChecked`, `Users.emailHash` and the table `login_email_opt_in` can be deleted. ### Adaption of BusinessLogic From 153b2a2c4e11f35794a875b639d9a58aae97e63a Mon Sep 17 00:00:00 2001 From: mahula Date: Wed, 3 Aug 2022 23:17:34 +0200 Subject: [PATCH 032/304] set up cypress to utilize cucumber and for tests in typescript --- e2e-tests/cypress/tests/cypress.config.ts | 43 + e2e-tests/cypress/tests/package.json | 15 +- e2e-tests/cypress/tests/tsconfig.json | 10 + e2e-tests/cypress/tests/yarn.lock | 3214 ++++++++++++++++++++- 4 files changed, 3228 insertions(+), 54 deletions(-) create mode 100644 e2e-tests/cypress/tests/cypress.config.ts create mode 100644 e2e-tests/cypress/tests/tsconfig.json diff --git a/e2e-tests/cypress/tests/cypress.config.ts b/e2e-tests/cypress/tests/cypress.config.ts new file mode 100644 index 000000000..0f1d6aa01 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress.config.ts @@ -0,0 +1,43 @@ +import { defineConfig } from "cypress"; +import { addCucumberPreprocessorPlugin } from "@badeball/cypress-cucumber-preprocessor"; +import browserify from "@badeball/cypress-cucumber-preprocessor/browserify"; + +async function setupNodeEvents( + on: Cypress.PluginEvents, + config: Cypress.PluginConfigOptions +): Promise { + await addCucumberPreprocessorPlugin(on, config); + + on( + "file:preprocessor", + browserify(config, { + typescript: require.resolve("typescript"), + }) + ); + + on('after:run', (results) => { + if (results) { + // results will be undefined in interactive mode + console.log(results.status) + } + }); + + return config; +} + +export default defineConfig({ + e2e: { + specPattern: "**/*.feature", + excludeSpecPattern: "*.js", + baseUrl: 'http://localhost:3000', + chromeWebSecurity: false, + supportFile: false, + viewportHeight: 720, + viewportWidth: 1280, + retries: { + runMode: 2, + openMode: 0 + }, + setupNodeEvents + } +}) diff --git a/e2e-tests/cypress/tests/package.json b/e2e-tests/cypress/tests/package.json index 2b8f6f161..b3229deb6 100644 --- a/e2e-tests/cypress/tests/package.json +++ b/e2e-tests/cypress/tests/package.json @@ -7,12 +7,21 @@ "author": "Mathias Lenz", "license": "Apache-2.0", "private": false, + "cypress-cucumber-preprocessor": { + "nonGlobalStepDefinitions": true, + "json": { + "enabled": true + } + }, "scripts": { - "cypress-e2e-tests": "yarn run cypress run", + "cypress-e2e-tests": "yarn run cypress run -e \"TAGS=not @skip\"", "lint": "eslint --max-warnings=0 --ext .js,.ts ." }, "dependencies": { - "cypress": "^10.3.0", - "eslint": "^8.19.0" + "@badeball/cypress-cucumber-preprocessor": "^12.0.0", + "@cypress/browserify-preprocessor": "^3.0.2", + "cypress": "^10.4.0", + "eslint": "^8.19.0", + "typescript": "^4.7.4" } } diff --git a/e2e-tests/cypress/tests/tsconfig.json b/e2e-tests/cypress/tests/tsconfig.json new file mode 100644 index 000000000..e9739ec00 --- /dev/null +++ b/e2e-tests/cypress/tests/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "es2016", + "lib": ["es6", "dom"], + "baseUrl": "../node_modules", + "types": ["cypress", "node"], + "strict": true + }, + "include": ["**/*.ts"] +} diff --git a/e2e-tests/cypress/tests/yarn.lock b/e2e-tests/cypress/tests/yarn.lock index 7ff7c56eb..a21ad455f 100644 --- a/e2e-tests/cypress/tests/yarn.lock +++ b/e2e-tests/cypress/tests/yarn.lock @@ -2,11 +2,1072 @@ # yarn lockfile v1 +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" + integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== + +"@babel/core@^7.16.0": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" + integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.10" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.10" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.18.10" + "@babel/types" "^7.18.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.10.tgz#794f328bfabdcbaf0ebf9bf91b5b57b61fa77a2a" + integrity sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA== + dependencies: + "@babel/types" "^7.18.10" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" + integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== + dependencies: + "@babel/compat-data" "^7.18.8" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.18.6": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz#d802ee16a64a9e824fcbf0a2ffc92f19d58550ce" + integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" + +"@babel/helper-create-regexp-features-plugin@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz#3e35f4e04acbbf25f1b3534a657610a000543d3c" + integrity sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.1.0" + +"@babel/helper-define-polyfill-provider@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz#bd10d0aca18e8ce012755395b05a79f45eca5073" + integrity sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" + integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== + dependencies: + "@babel/template" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-member-expression-to-functions@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" + integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== + dependencies: + "@babel/types" "^7.18.9" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" + integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" + integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== + +"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6" + integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" + integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== + dependencies: + "@babel/types" "^7.18.9" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" + integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== + +"@babel/helper-validator-identifier@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helper-wrap-function@^7.18.9": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.10.tgz#a7fcd3ab9b1be4c9b52cf7d7fdc1e88c2ce93396" + integrity sha512-95NLBP59VWdfK2lyLKe6eTMq9xg+yWKzxzxbJ1wcYNi1Auz200+83fMDADjRxBvc2QQor5zja2yTQzXGhk2GtQ== + dependencies: + "@babel/helper-function-name" "^7.18.9" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/helpers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" + integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== + dependencies: + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.18.10", "@babel/parser@^7.18.8": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.10.tgz#94b5f8522356e69e8277276adf67ed280c90ecc1" + integrity sha512-TYk3OA0HKL6qNryUayb5UUEhM/rkOQozIBEA5ITXh5DWrSp0TlUQXMyZmnWxG/DizSWBeeQ0Zbc5z8UGaaqoeg== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" + integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + +"@babel/plugin-proposal-async-generator-functions@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz#85ea478c98b0095c3e4102bff3b67d306ed24952" + integrity sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" + integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" + integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.16.0", "@babel/plugin-proposal-object-rest-spread@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7" + integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q== + dependencies: + "@babel/compat-data" "^7.18.8" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.18.8" + +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" + integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503" + integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4" + integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" + integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" + integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-remap-async-to-generator" "^7.18.6" + +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-block-scoping@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d" + integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-classes@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz#90818efc5b9746879b869d5ce83eb2aa48bbc3da" + integrity sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" + integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-destructuring@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz#68906549c021cb231bee1db21d3b5b095f8ee292" + integrity sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-for-of@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" + integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-modules-amd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21" + integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883" + integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz#545df284a7ac6a05125e3e405e536c5853099a06" + integrity sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-validator-identifier" "^7.18.6" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz#c89bfbc7cc6805d692f3a49bc5fc1b630007246d" + integrity sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + +"@babel/plugin-transform-parameters@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a" + integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-display-name@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.18.6" + +"@babel/plugin-transform-react-jsx@^7.18.6": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz#ea47b2c4197102c196cbd10db9b3bb20daa820f1" + integrity sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.18.10" + +"@babel/plugin-transform-react-pure-annotations@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" + integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73" + integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + regenerator-transform "^0.15.0" + +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-runtime@^7.16.0": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz#37d14d1fa810a368fd635d4d1476c0154144a96f" + integrity sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + babel-plugin-polyfill-corejs2 "^0.3.2" + babel-plugin-polyfill-corejs3 "^0.5.3" + babel-plugin-polyfill-regenerator "^0.4.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-spread@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz#6ea7a6297740f381c540ac56caf75b05b74fb664" + integrity sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/preset-env@^7.16.0": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.10.tgz#83b8dfe70d7eea1aae5a10635ab0a5fe60dfc0f4" + integrity sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA== + dependencies: + "@babel/compat-data" "^7.18.8" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.18.10" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.18.9" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.18.9" + "@babel/plugin-transform-classes" "^7.18.9" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.18.9" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.18.6" + "@babel/plugin-transform-modules-commonjs" "^7.18.6" + "@babel/plugin-transform-modules-systemjs" "^7.18.9" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.18.9" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.18.10" + babel-plugin-polyfill-corejs2 "^0.3.2" + babel-plugin-polyfill-corejs3 "^0.5.3" + babel-plugin-polyfill-regenerator "^0.4.0" + core-js-compat "^3.22.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.16.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" + integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-react-display-name" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + +"@babel/runtime@^7.16.0", "@babel/runtime@^7.8.4": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" + integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.18.10", "@babel/template@^7.18.6": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.10.tgz#37ad97d1cb00efa869b91dd5d1950f8a6cf0cb08" + integrity sha512-J7ycxg0/K9XCtLyHf0cz2DqDihonJeIo+z+HEdRe9YuT8TY4A66i+Ab2/xZCEW7Ro60bPCBBfqqboHSamoV3+g== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.10" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.4.4": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.10.tgz#4908e81b6b339ca7c6b7a555a5fc29446f26dde6" + integrity sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ== + dependencies: + "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-validator-identifier" "^7.18.6" + to-fast-properties "^2.0.0" + +"@badeball/cypress-configuration@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@badeball/cypress-configuration/-/cypress-configuration-4.0.0.tgz#c13eaf2ff344be15a64b75b97b02a6c8e916060a" + integrity sha512-NFQRmXJ4EG/34dI+3QfdcscFz+nvgXEGeXwK6UhX/1HahIrMDbzov1xJradCCyTu4ZwILbXpZfUocS64nVHTQQ== + dependencies: + "@babel/parser" "^7.18.8" + debug "^4.3.2" + esbuild "^0.11.12" + glob "^7.1.6" + minimatch "^3.0.4" + node-hook "^1.0.0" + +"@badeball/cypress-cucumber-preprocessor@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@badeball/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-12.0.0.tgz#e21d798d33ce0d247473fa3fc5ca6a3570f331a3" + integrity sha512-JQxs8oaorgIhUdVo6iQQO7FGe+wmrzrPOyW7Y07lAiGaLLKB7icHHOvEWtjO2PAz3jGZeQMmnk+vHxPmFRyBAQ== + dependencies: + "@badeball/cypress-configuration" "^4.0.0" + "@cucumber/cucumber-expressions" "^16.0.0" + "@cucumber/gherkin" "^24.0.0" + "@cucumber/html-formatter" "^19.2.0" + "@cucumber/message-streams" "^4.0.1" + "@cucumber/messages" "^19.1.2" + "@cucumber/tag-expressions" "^4.1.0" + base64-js "^1.5.1" + chalk "^4.1.2" + common-ancestor-path "^1.0.1" + cosmiconfig "^7.0.1" + debug "^4.2.0" + glob "^7.2.0" + is-path-inside "^3.0.3" + resolve-pkg "^2.0.0" + uuid "^8.3.2" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@cucumber/cucumber-expressions@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@cucumber/cucumber-expressions/-/cucumber-expressions-16.0.0.tgz#f8bc43da26f12db8f0d74ff3031a881e4fa4516d" + integrity sha512-HTh+Pg7oQ5aLuCkSbD2Q6jBaE40M3R/XaLEz+UqD5d9dZRu6P38W4LTooV5bV6dZgBunlMLK8+6ug2ziYvRddw== + dependencies: + regexp-match-indices "1.0.2" + +"@cucumber/gherkin@^24.0.0": + version "24.0.0" + resolved "https://registry.yarnpkg.com/@cucumber/gherkin/-/gherkin-24.0.0.tgz#b0d2ab328caa5357491f1117c31195d3e545da0c" + integrity sha512-b7OsnvX1B8myDAKMc+RAiUX9bzgtNdjGsiMj10O13xu2HBWIOQ19EqBJ4xLO5CFG/lGk1J/+L0lANQVowxLVBg== + dependencies: + "@cucumber/messages" "^19.0.0" + +"@cucumber/html-formatter@^19.2.0": + version "19.2.0" + resolved "https://registry.yarnpkg.com/@cucumber/html-formatter/-/html-formatter-19.2.0.tgz#47b9fcb58fbb48d0e6124fd2e867d9c6fe299470" + integrity sha512-qGms4588jmVF/G3fTbgZvxn6OQw9GaTFV007nZZ9/10M9DfrgRqjFjVxVI9TPV63xOLPicEVoqsKZtcECbdMSA== + +"@cucumber/message-streams@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@cucumber/message-streams/-/message-streams-4.0.1.tgz#a5339d3504594bb2edb5732aaae94dddb24d0970" + integrity sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA== + +"@cucumber/messages@^19.0.0", "@cucumber/messages@^19.1.2": + version "19.1.2" + resolved "https://registry.yarnpkg.com/@cucumber/messages/-/messages-19.1.2.tgz#cc846c191b124deb352dd1992bd49a82f30b0add" + integrity sha512-vhWkNmQco+7tk/DWqpN0/R9KTNvsKsXVfZ7IsJs+dEeWmTuRztklHq8lJalwMSQBl71+2/KqGHzOO4BMTC9wIQ== + dependencies: + "@types/uuid" "8.3.4" + class-transformer "0.5.1" + reflect-metadata "0.1.13" + uuid "8.3.2" + +"@cucumber/tag-expressions@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@cucumber/tag-expressions/-/tag-expressions-4.1.0.tgz#9a91b0e0dd2f2ba703e3038c52b49b9ac06c2c6f" + integrity sha512-chTnjxV3vryL75N90wJIMdMafXmZoO2JgNJLYpsfcALL2/IQrRiny3vM9DgD5RDCSt1LNloMtb7rGey9YWxCsA== + +"@cypress/browserify-preprocessor@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@cypress/browserify-preprocessor/-/browserify-preprocessor-3.0.2.tgz#1dbecae394937aed47a3524cad47086c2ded8c50" + integrity sha512-y6mlFR+IR2cqcm3HabSp7AEcX9QfF1EUL4eOaw/7xexdhmdQU8ez6piyRopZQob4BK8oKTsc9PkupsU2rzjqMA== + dependencies: + "@babel/core" "^7.16.0" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-object-rest-spread" "^7.16.0" + "@babel/plugin-transform-runtime" "^7.16.0" + "@babel/preset-env" "^7.16.0" + "@babel/preset-react" "^7.16.0" + "@babel/runtime" "^7.16.0" + babel-plugin-add-module-exports "^1.0.4" + babelify "^10.0.0" + bluebird "^3.7.2" + browserify "^16.2.3" + coffeeify "^3.0.1" + coffeescript "^1.12.7" + debug "^4.3.2" + fs-extra "^9.0.0" + lodash.clonedeep "^4.5.0" + through2 "^2.0.0" + watchify "^4.0.0" + "@cypress/request@^2.88.10": version "2.88.10" resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce" @@ -54,29 +1115,100 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@humanwhocodes/config-array@^0.9.2": - version "0.9.5" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" - integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== +"@humanwhocodes/config-array@^0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" + integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" minimatch "^3.0.4" +"@humanwhocodes/gitignore-to-minimatch@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" + integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== + "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.14" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" + integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + "@types/node@*": - version "18.0.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.4.tgz#48aedbf35efb3af1248e4cd4d792c730290cd5d6" - integrity sha512-M0+G6V0Y4YV8cqzHssZpaNCqvYwlCiulmm0PwpNLF55r/+cT8Ol42CHRU1SEaYFH2rTwiiE1aYg/2g2rrtGdPA== + version "18.6.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.6.3.tgz#4e4a95b6fe44014563ceb514b2598b3e623d1c98" + integrity sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg== "@types/node@^14.14.31": - version "14.18.22" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.22.tgz#fd2a15dca290fc9ad565b672fde746191cd0c6e6" - integrity sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw== + version "14.18.23" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.23.tgz#70f5f20b0b1b38f696848c1d3647bb95694e615e" + integrity sha512-MhbCWN18R4GhO8ewQWAFK4TGQdBpXWByukz7cWyJmXhvRuCIaM/oWytGPqVmDzgEnnaIc9ss6HbU5mUi+vyZPA== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/sinonjs__fake-timers@8.1.1": version "8.1.1" @@ -88,6 +1220,11 @@ resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== +"@types/uuid@8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + "@types/yauzl@^2.9.1": version "2.10.0" resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" @@ -95,15 +1232,42 @@ dependencies: "@types/node" "*" +JSONStream@^1.0.3: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.7.1: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.0.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.8.0: + version "8.8.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== aggregate-error@^3.0.0: version "3.1.0" @@ -140,6 +1304,13 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -147,6 +1318,14 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +anymatch@^3.1.0, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + arch@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" @@ -157,6 +1336,21 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + asn1@~0.2.3: version "0.2.6" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" @@ -169,6 +1363,14 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== +assert@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" @@ -189,6 +1391,11 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -199,12 +1406,53 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +babel-plugin-add-module-exports@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz#6caa4ddbe1f578c6a5264d4d3e6c8a2720a7ca2b" + integrity sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg== + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-polyfill-corejs2@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz#e4c31d4c89b56f3cf85b92558954c66b54bd972d" + integrity sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.2" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz#d7e09c9a899079d71a8b670c6181af56ec19c5c7" + integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.2" + core-js-compat "^3.21.0" + +babel-plugin-polyfill-regenerator@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz#8f51809b6d5883e07e71548d75966ff7635527fe" + integrity sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.2" + +babelify@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/babelify/-/babelify-10.0.0.tgz#fe73b1a22583f06680d8d072e25a1e0d1d1d7fb5" + integrity sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.1: +base64-js@^1.0.2, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -216,6 +1464,11 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + blob-util@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" @@ -226,6 +1479,16 @@ bluebird@^3.7.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -234,11 +1497,231 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-pack@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774" + integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA== + dependencies: + JSONStream "^1.0.3" + combine-source-map "~0.8.0" + defined "^1.0.0" + safe-buffer "^5.1.1" + through2 "^2.0.0" + umd "^3.0.0" + +browser-resolve@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" + integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== + dependencies: + resolve "^1.17.0" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserify@^16.2.3: + version "16.5.2" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.5.2.tgz#d926835e9280fa5fd57f5bc301f2ef24a972ddfe" + integrity sha512-TkOR1cQGdmXU9zW4YukWzWVSJwrxmNdADFbqbE3HFgQWe5wqZmOawqZ7J/8MPCwk/W8yY7Y0h+7mOtcZxLP23g== + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^2.0.0" + browserify-zlib "~0.2.0" + buffer "~5.2.1" + cached-path-relative "^1.0.0" + concat-stream "^1.6.0" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.0" + domain-browser "^1.2.0" + duplexer2 "~0.1.2" + events "^2.0.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "^1.0.0" + inherits "~2.0.1" + insert-module-globals "^7.0.0" + labeled-stream-splicer "^2.0.0" + mkdirp-classic "^0.5.2" + module-deps "^6.2.3" + os-browserify "~0.3.0" + parents "^1.0.1" + path-browserify "~0.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^2.0.0" + stream-http "^3.0.0" + string_decoder "^1.1.1" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "0.0.1" + url "~0.11.0" + util "~0.10.1" + vm-browserify "^1.0.0" + xtend "^4.0.0" + +browserify@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-17.0.0.tgz#4c48fed6c02bfa2b51fd3b670fddb805723cdc22" + integrity sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w== + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^2.0.0" + browserify-zlib "~0.2.0" + buffer "~5.2.1" + cached-path-relative "^1.0.0" + concat-stream "^1.6.0" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.1" + domain-browser "^1.2.0" + duplexer2 "~0.1.2" + events "^3.0.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "^1.0.0" + inherits "~2.0.1" + insert-module-globals "^7.2.1" + labeled-stream-splicer "^2.0.0" + mkdirp-classic "^0.5.2" + module-deps "^6.2.3" + os-browserify "~0.3.0" + parents "^1.0.1" + path-browserify "^1.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum-object "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^3.0.0" + stream-http "^3.0.0" + string_decoder "^1.1.1" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "0.0.1" + url "~0.11.0" + util "~0.12.0" + vm-browserify "^1.0.0" + xtend "^4.0.0" + +browserslist@^4.20.2, browserslist@^4.21.3: + version "4.21.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" + integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== + dependencies: + caniuse-lite "^1.0.30001370" + electron-to-chromium "^1.4.202" + node-releases "^2.0.6" + update-browserslist-db "^1.0.5" + buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" @@ -247,22 +1730,62 @@ buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@~5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" + integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + +cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.1.0.tgz#865576dfef39c0d6a7defde794d078f5308e3ef3" + integrity sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA== + cachedir@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +caniuse-lite@^1.0.30001370: + version "1.0.30001373" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz#2dc3bc3bfcb5d5a929bec11300883040d7b4b4be" + integrity sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -chalk@^4.0.0, chalk@^4.1.0: +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -275,11 +1798,39 @@ check-more-types@^2.24.0: resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== +chokidar@^3.4.0: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + ci-info@^3.2.0: version "3.3.2" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-transformer@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.5.1.tgz#24147d5dffd2a6cea930a3250a677addf96ab336" + integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw== + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -309,6 +1860,26 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" +coffeeify@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/coffeeify/-/coffeeify-3.0.1.tgz#5e2753000c50bd24c693115f33864248dd11136c" + integrity sha512-Qjnr7UX6ldK1PHV7wCnv7AuCd4q19KTUtwJnu/6JRJB4rfm12zvcXtKdacUoePOKr1I4ka/ydKiwWpNAdsQb0g== + dependencies: + convert-source-map "^1.3.0" + through2 "^2.0.0" + +coffeescript@^1.12.7: + version "1.12.7" + resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.12.7.tgz#e57ee4c4867cf7f606bfc4a0f2d550c0981ddd27" + integrity sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -316,6 +1887,11 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" @@ -326,6 +1902,16 @@ colorette@^2.0.16: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== +combine-source-map@^0.8.0, combine-source-map@~0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" + integrity sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg== + dependencies: + convert-source-map "~1.1.0" + inline-source-map "~0.6.0" + lodash.memoize "~3.0.3" + source-map "~0.5.3" + combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -338,6 +1924,11 @@ commander@^5.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== +common-ancestor-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" + integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== + common-tags@^1.8.0: version "1.8.2" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" @@ -348,11 +1939,98 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== + +convert-source-map@^1.3.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@~1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" + integrity sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg== + +core-js-compat@^3.21.0, core-js-compat@^3.22.1: + version "3.24.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.24.1.tgz#d1af84a17e18dfdd401ee39da9996f9a7ba887de" + integrity sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw== + dependencies: + browserslist "^4.21.3" + semver "7.0.0" + core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -362,10 +2040,27 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -cypress@^10.3.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.3.0.tgz#fae8d32f0822fcfb938e79c7c31ef344794336ae" - integrity sha512-txkQWKzvBVnWdCuKs5Xc08gjpO89W2Dom2wpZgT9zWZT5jXxqPIxqP/NC1YArtkpmp3fN5HW8aDjYBizHLUFvg== +crypto-browserify@^3.0.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +cypress@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.4.0.tgz#bb5b3b6588ad49eff172fecf5778cc0da2980e4e" + integrity sha512-OM7F8MRE01SHQRVVzunid1ZK1m90XTxYnl+7uZfIrB4CYqUDCrZEeSyCXzIbsS6qcaijVCAhqDL60SxG8N6hew== dependencies: "@cypress/request" "^2.88.10" "@cypress/xvfb" "^1.2.4" @@ -410,6 +2105,11 @@ cypress@^10.3.0: untildify "^4.0.0" yauzl "^2.10.0" +dash-ast@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" + integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA== + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -418,9 +2118,9 @@ dashdash@^1.12.0: assert-plus "^1.0.0" dayjs@^1.10.4: - version "1.11.3" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.3.tgz#4754eb694a624057b9ad2224b67b15d552589258" - integrity sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A== + version "1.11.4" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.4.tgz#3b3c10ca378140d8917e06ebc13a4922af4f433e" + integrity sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g== debug@^3.1.0: version "3.2.7" @@ -429,7 +2129,7 @@ debug@^3.1.0: dependencies: ms "^2.1.1" -debug@^4.1.1, debug@^4.3.2: +debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -441,11 +2141,67 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ== + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +deps-sort@^2.0.0, deps-sort@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d" + integrity sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw== + dependencies: + JSONStream "^1.0.3" + shasum-object "^1.0.0" + subarg "^1.0.0" + through2 "^2.0.0" + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detective@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" + integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== + dependencies: + acorn-node "^1.8.2" + defined "^1.0.0" + minimist "^1.2.6" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -453,6 +2209,18 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +domain-browser@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== + dependencies: + readable-stream "^2.0.2" + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -461,6 +2229,24 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +electron-to-chromium@^1.4.202: + version "1.4.210" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.210.tgz#12611fe874b833a3bf3671438b5893aba7858980" + integrity sha512-kSiX4tuyZijV7Cz0MWVmGT8K2siqaOA4Z66K5dCttPPRh0HicOcOAEj1KlC8O8J1aOS/1M8rGofOzksLKaHWcQ== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -480,6 +2266,61 @@ enquirer@^2.3.6: dependencies: ansi-colors "^4.1.1" +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" + integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.4.3" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +esbuild@^0.11.12: + version "0.11.23" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.11.23.tgz#c42534f632e165120671d64db67883634333b4b8" + integrity sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -516,12 +2357,13 @@ eslint-visitor-keys@^3.3.0: integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== eslint@^8.19.0: - version "8.19.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.19.0.tgz#7342a3cbc4fbc5c106a1eefe0fd0b50b6b1a7d28" - integrity sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw== + version "8.21.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.21.0.tgz#1940a68d7e0573cef6f50037addee295ff9be9ef" + integrity sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA== dependencies: "@eslint/eslintrc" "^1.3.0" - "@humanwhocodes/config-array" "^0.9.2" + "@humanwhocodes/config-array" "^0.10.4" + "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -531,14 +2373,17 @@ eslint@^8.19.0: eslint-scope "^7.1.1" eslint-utils "^3.0.0" eslint-visitor-keys "^3.3.0" - espree "^9.3.2" + espree "^9.3.3" esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" + find-up "^5.0.0" functional-red-black-tree "^1.0.1" glob-parent "^6.0.1" globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -556,12 +2401,12 @@ eslint@^8.19.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^9.3.2: - version "9.3.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" - integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== +espree@^9.3.2, espree@^9.3.3: + version "9.3.3" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.3.tgz#2dd37c4162bb05f433ad3c1a52ddf8a49dc08e9d" + integrity sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng== dependencies: - acorn "^8.7.1" + acorn "^8.8.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" @@ -590,9 +2435,27 @@ esutils@^2.0.2: integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== eventemitter2@^6.4.3: - version "6.4.6" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.6.tgz#92d56569cc147a4d9b9da9e942e89b20ce236b0a" - integrity sha512-OHqo4wbHX5VbvlbB6o6eDwhYmiTjrpWACjF8Pmof/GTD6rdBNdZFNck3xlhqOiQFGCOoq3uzHvA0cQpFHIGVAQ== + version "6.4.7" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== + +events@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" + integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg== + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" execa@4.1.0: version "4.1.0" @@ -647,6 +2510,17 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -657,6 +2531,18 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-safe-stringify@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -678,6 +2564,21 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -691,6 +2592,13 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -705,7 +2613,7 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -fs-extra@^9.1.0: +fs-extra@^9.0.0, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -720,11 +2628,55 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-assigned-identifiers@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" + integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -732,6 +2684,14 @@ get-stream@^5.0.0, get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + getos@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" @@ -746,6 +2706,13 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob-parent@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" @@ -753,7 +2720,7 @@ glob-parent@^6.0.1: dependencies: is-glob "^4.0.3" -glob@^7.1.3: +glob@^7.1.0, glob@^7.1.3, glob@^7.1.6, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -772,23 +2739,112 @@ global-dirs@^3.0.0: dependencies: ini "2.0.0" +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + globals@^13.15.0: - version "13.16.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.16.0.tgz#9be4aca28f311aaeb974ea54978ebbb5e35ce46a" - integrity sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q== + version "13.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== dependencies: type-fest "^0.20.2" +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +htmlescape@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" + integrity sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg== + http-signature@~1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" @@ -798,12 +2854,17 @@ http-signature@~1.3.6: jsprim "^2.0.2" sshpk "^1.14.1" +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -839,16 +2900,103 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + ini@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== +inline-source-map@~0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" + integrity sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA== + dependencies: + source-map "~0.5.3" + +insert-module-globals@^7.0.0, insert-module-globals@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.1.tgz#d5e33185181a4e1f33b15f7bf100ee91890d5cb3" + integrity sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg== + dependencies: + JSONStream "^1.0.3" + acorn-node "^1.5.2" + combine-source-map "^0.8.0" + concat-stream "^1.6.1" + is-buffer "^1.1.0" + path-is-absolute "^1.0.1" + process "~0.11.0" + through2 "^2.0.0" + undeclared-identifiers "^1.1.2" + xtend "^4.0.0" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + is-ci@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" @@ -856,6 +3004,20 @@ is-ci@^3.0.0: dependencies: ci-info "^3.2.0" +is-core-module@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -866,7 +3028,14 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.0, is-glob@^4.0.3: +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -881,16 +3050,73 @@ is-installed-globally@~0.4.0: global-dirs "^3.0.0" is-path-inside "^3.0.2" -is-path-inside@^3.0.2: +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67" + integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -901,6 +3127,18 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -911,6 +3149,11 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -923,6 +3166,21 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -938,11 +3196,23 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stable-stringify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" + integrity sha512-nKtD/Qxm7tWdZqJoldEC7fF0S41v0mWbeaXG3637stOWfyGxTgWTYE2wtfKmjzpvxv2MA2xzxsXOIiwUpkX6Qw== + dependencies: + jsonify "~0.0.0" + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== +json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -952,6 +3222,16 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA== + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + jsprim@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" @@ -962,6 +3242,14 @@ jsprim@^2.0.2: json-schema "0.4.0" verror "1.10.0" +labeled-stream-splicer@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21" + integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw== + dependencies: + inherits "^2.0.1" + stream-splicer "^2.0.0" + lazy-ass@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" @@ -975,6 +3263,11 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + listr2@^3.8.3: version "3.14.0" resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" @@ -989,6 +3282,28 @@ listr2@^3.8.3: through "^2.3.8" wrap-ansi "^7.0.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.memoize@~3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" + integrity sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -1029,11 +3344,41 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -1051,6 +3396,16 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -1058,11 +3413,37 @@ minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.6: +minimist@^1.1.0, minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +module-deps@^6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.3.tgz#15490bc02af4b56cf62299c7c17cba32d71a96ee" + integrity sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA== + dependencies: + JSONStream "^1.0.3" + browser-resolve "^2.0.0" + cached-path-relative "^1.0.2" + concat-stream "~1.6.0" + defined "^1.0.0" + detective "^5.2.0" + duplexer2 "^0.1.2" + inherits "^2.0.1" + parents "^1.0.0" + readable-stream "^2.0.2" + resolve "^1.4.0" + stream-combiner2 "^1.1.1" + subarg "^1.0.0" + through2 "^2.0.0" + xtend "^4.0.0" + ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -1078,6 +3459,21 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +node-hook@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-hook/-/node-hook-1.0.0.tgz#82ca39af991d726d5c7952e59c992378bb296f7e" + integrity sha512-tBTIHwkzXvbesP0fY495VsqSWCOS5Ttt5+mAmeqUC1yglCiSYarNewfi2Q+HOL+M6pZYYqwGU6jIi5+gIHQbpg== + +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + npm-run-path@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -1085,6 +3481,31 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.12.0, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -1111,11 +3532,37 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +os-browserify@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== + ospath@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== +outpipe@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" + integrity sha512-BnNY/RwnDrkmQdUa9U+OfN/Y7AWmKuUPCCd+hbRclZnnANvYpO72zp/a6Q4n829hPbdqEac31XCcsvlEvb+rtA== + dependencies: + shell-quote "^1.4.2" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -1123,6 +3570,11 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -1130,7 +3582,50 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -path-is-absolute@^1.0.0: +parents@^1.0.0, parents@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" + integrity sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg== + dependencies: + path-platform "~0.11.15" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-browserify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-browserify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== @@ -1140,6 +3635,32 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-platform@~0.11.15: + version "0.11.15" + resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" + integrity sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -1150,6 +3671,16 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + pify@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -1165,6 +3696,16 @@ pretty-bytes@^5.6.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@~0.11.0: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + proxy-from-env@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" @@ -1175,6 +3716,18 @@ psl@^1.1.28: resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -1183,6 +3736,16 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== + +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -1193,11 +3756,151 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== +querystring-es3@~0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +read-only-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" + integrity sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w== + dependencies: + readable-stream "^2.0.2" + +readable-stream@3, readable-stream@^3.5.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reflect-metadata@0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regenerate-unicode-properties@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" + integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" + integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp-match-indices@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regexp-match-indices/-/regexp-match-indices-1.0.2.tgz#cf20054a6f7d5b3e116a701a7b00f82889d10da6" + integrity sha512-DwZuAkt8NF5mKwGGER1EGh2PRqyvhRhhLviH+R8y8dIuaQROlUfXjt4s9ZTXstIsSkptf06BSvwcEmmfheJJWQ== + dependencies: + regexp-tree "^0.1.11" + +regexp-tree@^0.1.11: + version "0.1.24" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.24.tgz#3d6fa238450a4d66e5bc9c4c14bb720e2196829d" + integrity sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw== + +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== +regexpu-core@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d" + integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.0.1" + regjsgen "^0.6.0" + regjsparser "^0.8.2" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +regjsgen@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" + integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== + +regjsparser@^0.8.2: + version "0.8.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" + integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== + dependencies: + jsesc "~0.5.0" + request-progress@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" @@ -1210,6 +3913,27 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg/-/resolve-pkg-2.0.0.tgz#ac06991418a7623edc119084edc98b0e6bf05a41" + integrity sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ== + dependencies: + resolve-from "^5.0.0" + +resolve@^1.1.4, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.4.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -1218,6 +3942,11 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rfdc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" @@ -1230,6 +3959,21 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + rxjs@^7.5.1: version "7.5.6" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc" @@ -1237,16 +3981,31 @@ rxjs@^7.5.1: dependencies: tslib "^2.1.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.2: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + semver@^7.3.2: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" @@ -1254,6 +4013,29 @@ semver@^7.3.2: dependencies: lru-cache "^6.0.0" +sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shasum-object@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shasum-object/-/shasum-object-1.0.0.tgz#0b7b74ff5b66ecf9035475522fa05090ac47e29e" + integrity sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg== + dependencies: + fast-safe-stringify "^2.0.7" + +shasum@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" + integrity sha512-UTzHm/+AzKfO9RgPgRpDIuMSNie1ubXRaljjlhFMNGYoG7z+rm9AHLPMf70R7887xboDH9Q+5YQbWKObFHEAtw== + dependencies: + json-stable-stringify "~0.0.0" + sha.js "~2.4.4" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -1266,11 +4048,35 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.4.2, shell-quote@^1.6.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + signal-exit@^3.0.2: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" @@ -1289,6 +4095,11 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +source-map@~0.5.3: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + sshpk@^1.14.1: version "1.17.0" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" @@ -1304,6 +4115,48 @@ sshpk@^1.14.1: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +stream-browserify@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + +stream-combiner2@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + integrity sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw== + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + +stream-http@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" + integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + +stream-splicer@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd" + integrity sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.2" + string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -1313,6 +4166,38 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -1330,6 +4215,20 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +subarg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + integrity sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg== + dependencies: + minimist "^1.1.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -1344,6 +4243,18 @@ supports-color@^8.1.1: dependencies: has-flag "^4.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +syntax-error@^1.1.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" + integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== + dependencies: + acorn-node "^1.2.0" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -1354,11 +4265,33 @@ throttleit@^1.0.0: resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== -through@^2.3.8: +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + +"through@>=2.2.7 <3", through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +timers-browserify@^1.0.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" + integrity sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q== + dependencies: + process "~0.11.0" + tmp@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" @@ -1366,6 +4299,18 @@ tmp@~0.2.1: dependencies: rimraf "^3.0.0" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -1379,6 +4324,11 @@ tslib@^2.1.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -1408,6 +4358,65 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +typescript@^4.7.4: + version "4.7.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" + integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== + +umd@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" + integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undeclared-identifiers@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f" + integrity sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw== + dependencies: + acorn-node "^1.3.0" + dash-ast "^1.0.0" + get-assigned-identifiers "^1.2.0" + simple-concat "^1.0.0" + xtend "^4.0.1" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -1418,6 +4427,14 @@ untildify@^4.0.0: resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== +update-browserslist-db@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" + integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -1425,7 +4442,46 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -uuid@^8.3.2: +url@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== + dependencies: + inherits "2.0.1" + +util@~0.10.1: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + +util@~0.12.0: + version "0.12.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" + integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + +uuid@8.3.2, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -1444,6 +4500,47 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vm-browserify@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +watchify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/watchify/-/watchify-4.0.0.tgz#53b002d51e7b0eb640b851bb4de517a689973392" + integrity sha512-2Z04dxwoOeNxa11qzWumBTgSAohTC0+ScuY7XMenPnH+W2lhTcpEOJP4g2EIG/SWeLadPk47x++Yh+8BqPM/lA== + dependencies: + anymatch "^3.1.0" + browserify "^17.0.0" + chokidar "^3.4.0" + defined "^1.0.0" + outpipe "^1.1.0" + through2 "^4.0.2" + xtend "^4.0.2" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.2: + version "1.1.8" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" + integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.9" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -1479,11 +4576,21 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + yauzl@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" @@ -1491,3 +4598,8 @@ yauzl@^2.10.0: dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From f959182660077f47b0216f5fb55bf9bc6b1a48e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Fri, 5 Aug 2022 03:31:13 +0200 Subject: [PATCH 033/304] add package uuid --- package.json | 3 ++- yarn.lock | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index bf8eced01..fca1994b3 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "release": "scripts/release.sh" }, "dependencies": { - "auto-changelog": "^2.4.0" + "auto-changelog": "^2.4.0", + "uuid": "^8.3.2" } } diff --git a/yarn.lock b/yarn.lock index d9c16e6f7..2c8f9b681 100644 --- a/yarn.lock +++ b/yarn.lock @@ -81,6 +81,11 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.1.tgz#2749d4b8b5b7d67460b4a418023ff73c3fefa60a" integrity sha512-EWhx3fHy3M9JbaeTnO+rEqzCe1wtyQClv6q3YWq0voOj4E+bMZBErVS1GAHPDiRGONYq34M1/d8KuQMgvi6Gjw== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" From f836abf4d3b2838ffd354a7e11fc889ad08e72c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Fri, 5 Aug 2022 03:33:41 +0200 Subject: [PATCH 034/304] migration of users and user_contacts including merge of email_optin content --- .../0045-adapt_users_table_for_gradidoid.ts | 162 +++++++++++++++--- 1 file changed, 136 insertions(+), 26 deletions(-) diff --git a/database/migrations/0045-adapt_users_table_for_gradidoid.ts b/database/migrations/0045-adapt_users_table_for_gradidoid.ts index 65c2d4b97..cc94ab7aa 100644 --- a/database/migrations/0045-adapt_users_table_for_gradidoid.ts +++ b/database/migrations/0045-adapt_users_table_for_gradidoid.ts @@ -7,20 +7,56 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/no-explicit-any */ +import { v4 as uuidv4 } from 'uuid'; + export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + /* await queryFn(` - CREATE FUNCTION UuidToBin(_uuid BINARY(36)) + CREATE FUNCTION uuid_v4s() + RETURNS CHAR(36) + BEGIN + -- 1th and 2nd block are made of 6 random bytes + SET @h1 = HEX(RANDOM_BYTES(4)); + SET @h2 = HEX(RANDOM_BYTES(2)); + + -- 3th block will start with a 4 indicating the version, remaining is random + SET @h3 = SUBSTR(HEX(RANDOM_BYTES(2)), 2, 3); + + -- 4th block first nibble can only be 8, 9 A or B, remaining is random + SET @h4 = CONCAT(HEX(FLOOR(ASCII(RANDOM_BYTES(1)) / 64)+8), + SUBSTR(HEX(RANDOM_BYTES(2)), 2, 3)); + + -- 5th block is made of 6 random bytes + SET @h5 = HEX(RANDOM_BYTES(6)); + + -- Build the complete UUID + RETURN LOWER(CONCAT( + @h1, '-', @h2, '-4', @h3, '-', @h4, '-', @h5 + )); + END`) + + + + SELECT LOWER(CONCAT( + HEX(RANDOM_BYTES(4)), '-', + HEX(RANDOM_BYTES(2)), '-4', + SUBSTR(HEX(RANDOM_BYTES(2)), 2, 3), '-', + CONCAT(HEX(FLOOR(ASCII(RANDOM_BYTES(1)) / 64)+8),SUBSTR(HEX(RANDOM_BYTES(2)), 2, 3)), '-', + HEX(RANDOM_BYTES(6)) + + + await queryFn( + `CREATE FUNCTION UuidToBin(_uuid BINARY(36)) RETURNS BINARY(16) LANGUAGE SQL DETERMINISTIC CONTAINS SQL SQL SECURITY INVOKER - RETURN + RETURN UNHEX(CONCAT( SUBSTR(_uuid, 15, 4), SUBSTR(_uuid, 10, 4), SUBSTR(_uuid, 1, 8), SUBSTR(_uuid, 20, 4), - SUBSTR(_uuid, 25) ));`) - - await queryFn(` + SUBSTR(_uuid, 25) )); + // CREATE FUNCTION UuidFromBin(_bin BINARY(16)) RETURNS BINARY(36) LANGUAGE SQL DETERMINISTIC CONTAINS SQL SQL SECURITY INVOKER @@ -31,15 +67,49 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis HEX(SUBSTR(_bin, 1, 2)), HEX(SUBSTR(_bin, 9, 2)), HEX(SUBSTR(_bin, 11)) - ));`) + )); + + // + DELIMITER ; + + + + CREATE FUNCTION BIN_TO_UUID(b BINARY(16)) + RETURNS CHAR(36) + BEGIN + DECLARE hexStr CHAR(32); + SET hexStr = HEX(b); + RETURN LOWER(CONCAT( + SUBSTR(hexStr, 1, 8), '-', + SUBSTR(hexStr, 9, 4), '-', + SUBSTR(hexStr, 13, 4), '-', + SUBSTR(hexStr, 17, 4), '-', + SUBSTR(hexStr, 21) + )); + END `) + + await queryFn(` DELIMITER ;`) + + await queryFn(`DELIMITER $$ + + CREATE FUNCTION UUID_TO_BIN(uuid CHAR(36)) + RETURNS BINARY(16) + BEGIN + RETURN UNHEX(REPLACE(uuid, '-', '')); + END + + $$ + + DELIMITER ;`) +*/ await queryFn(` CREATE TABLE IF NOT EXISTS \`user_contacts\` ( \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, \`type\` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, \`user_id\` int(10) unsigned NOT NULL, - \`email\` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - \`email_verification_code\` bigint(20) unsigned NOT NULL, + \`email\` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL UNIQUE, + \`email_verification_code\` bigint(20) unsigned NOT NULL UNIQUE, \`email_opt_in_type_id\` int NOT NULL, \`email_resend_count\` int DEFAULT '0', \`email_checked\` tinyint(4) NOT NULL DEFAULT 0, @@ -51,33 +121,73 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis UNIQUE KEY \`email_verification_code\` (\`email_verification_code\`), UNIQUE KEY \`email\` (\`email\`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) + console.log('user_contacts created...') + + // First add gradido_id as nullable column without Default + await queryFn('ALTER TABLE `users` ADD COLUMN `gradido_id` CHAR(36) NULL UNIQUE AFTER `id`;') + console.log('users.gradido_id added...\n') + + // Second update gradido_id with ensured unique uuidv4 + console.log('search for all users with gradido_id is null...\n') + const usersToUpdate = await queryFn(`SELECT 'u.id', 'u.gradido_id' FROM 'users' as u WHERE 'u.gradido_id' is null`) + for (const id in usersToUpdate) { + const user = usersToUpdate[id] + console.log('found user: %s\n', user) + let gradidoId = null + let countIds = null + do { + gradidoId = uuidv4() + console.log('uuid: %s\n', gradidoId) + countIds = await queryFn('SELECT COUNT(*) FROM `users` as u WHERE u.gradido_id = ${gradidoId}') + console.log('found uuids: %d\n', countIds[0]) + } while (countIds[0] > 0) + await queryFn('UPDATE `users` SET `gradido_id` = ${gradidoId} WHERE `id` = ${user.id}') + console.log('update user with id=%d and gradidoId=%s\n', user.id, gradidoId) + } + + // third modify gradido_id to not nullable and unique + await queryFn('ALTER TABLE `users` MODIFY COLUMN `gradido_id` CHAR(36) NOT NULL UNIQUE;') + console.log('alter users.gradido_id to NOT NULL and UNIQUE...\n') - await queryFn( - 'ALTER TABLE `users` ADD COLUMN `gradido_id` BINARY(16) NOT NULL UNIQUE DEFAULT UuidToBin(UUID()) AFTER `id`;', - ) await queryFn( 'ALTER TABLE `users` ADD COLUMN `alias` varchar(20) NULL UNIQUE AFTER `gradido_id`;', ) + console.log('users.alias added...\n') + await queryFn('ALTER TABLE `users` ADD COLUMN `email_id` int(10) NULL AFTER `email`;') + console.log('users.email_id added...\n') + + // merge values from login_email_opt_in table with users.email in new user_contacts table await queryFn(` - INSERT INTO gradido_community.user_contacts - (type, user_id, email, email_verification_code, email_opt_in_type_id, email_resent_count, email_checked, created_at, updated_at, deleted_at) + INSERT INTO 'user_contacts' + ('type', 'user_id', 'email', 'email_verification_code', 'email_opt_in_type_id', 'email_resent_count', 'email_checked', 'created_at', 'updated_at', 'deleted_at') SELECT - 'EMAIL' as type, - u.id as user_id, - u.email, - e.verification_code, - e.email_opt_in_type_id, - e.resend_count, - u.email_checked, - e.created, - e.updated, - u.deletedAt + "EMAIL" as 'type', + 'u.id' as 'user_id', + 'u.email', + 'e.verification_code' as 'email_verification_code', + 'e.email_opt_in_type_id', + 'e.resend_count' as 'email_resent_count', + 'u.email_checked', + 'e.created as created_at', + 'e.updated as updated_at', + 'u.deletedAt as deleted_at' FROM - gradido_community.users as u, - gradido_community.login_email_opt_in as e + 'users' as u, + 'login_email_opt_in' as e WHERE - u.id = e.user_id;`) + 'u.id' = 'e.user_id';`) + console.log('user_contacts inserted...\n') + + // insert in users table the email_id of the new created email-contacts + const contacts = await queryFn(`SELECT 'c.id', 'c.user_id' FROM 'user_contacts' as c`) + for (const id in contacts) { + const contact = contacts[id] + console.log('found contact: %s\n', contact) + await queryFn(`UPDATE 'users' as u SET 'u.email_id' = ${contact.id} WHERE 'u.id' = ${contact.user_id}`) + console.log('update users with id=%d and email_id=%d\n', contact.user_id, contact.id) + } + console.log('upgrade finished...\n') } export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { From dc76a4785d25f2bece24538b41fa206fe5db7a2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Mon, 8 Aug 2022 18:33:56 +0200 Subject: [PATCH 035/304] complete installation of uuid package --- database/package.json | 4 +++- database/yarn.lock | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/database/package.json b/database/package.json index 23ab63f2b..4e3591bbb 100644 --- a/database/package.json +++ b/database/package.json @@ -37,6 +37,7 @@ "typescript": "^4.3.5" }, "dependencies": { + "@types/uuid": "^8.3.4", "cross-env": "^7.0.3", "crypto": "^1.0.1", "decimal.js-light": "^2.5.1", @@ -44,6 +45,7 @@ "mysql2": "^2.3.0", "reflect-metadata": "^0.1.13", "ts-mysql-migrate": "^1.0.2", - "typeorm": "^0.2.38" + "typeorm": "^0.2.38", + "uuid": "^8.3.2" } } diff --git a/database/yarn.lock b/database/yarn.lock index e5d74929c..b30db4595 100644 --- a/database/yarn.lock +++ b/database/yarn.lock @@ -137,6 +137,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.3.tgz#7a8f2838603ea314d1d22bb3171d899e15c57bd5" integrity sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ== +"@types/uuid@^8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + "@types/zen-observable@0.8.3": version "0.8.3" resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3" @@ -2088,6 +2093,11 @@ util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" From dea11232591f6e34ce25454fbd9a61e0eb81f08b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Mon, 8 Aug 2022 18:34:38 +0200 Subject: [PATCH 036/304] first complete migration up and down run --- .../0045-adapt_users_table_for_gradidoid.ts | 94 ++++++++++--------- 1 file changed, 49 insertions(+), 45 deletions(-) diff --git a/database/migrations/0045-adapt_users_table_for_gradidoid.ts b/database/migrations/0045-adapt_users_table_for_gradidoid.ts index cc94ab7aa..e33d5af1a 100644 --- a/database/migrations/0045-adapt_users_table_for_gradidoid.ts +++ b/database/migrations/0045-adapt_users_table_for_gradidoid.ts @@ -7,7 +7,7 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { v4 as uuidv4 } from 'uuid'; +import { v4 as uuidv4 } from 'uuid' export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { /* @@ -117,84 +117,88 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis \`created_at\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, \`updated_at\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, \`deleted_at\` datetime NULL DEFAULT NULL, - PRIMARY KEY (\`id\`), - UNIQUE KEY \`email_verification_code\` (\`email_verification_code\`), - UNIQUE KEY \`email\` (\`email\`) + PRIMARY KEY (\`id\`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) - console.log('user_contacts created...') + // console.log('user_contacts created...') // First add gradido_id as nullable column without Default - await queryFn('ALTER TABLE `users` ADD COLUMN `gradido_id` CHAR(36) NULL UNIQUE AFTER `id`;') - console.log('users.gradido_id added...\n') + await queryFn('ALTER TABLE `users` ADD COLUMN `gradido_id` CHAR(36) NULL AFTER `id`;') + // console.log('users.gradido_id added...\n') // Second update gradido_id with ensured unique uuidv4 - console.log('search for all users with gradido_id is null...\n') - const usersToUpdate = await queryFn(`SELECT 'u.id', 'u.gradido_id' FROM 'users' as u WHERE 'u.gradido_id' is null`) + // console.log('search for all users with gradido_id is null...\n') + const usersToUpdate = await queryFn('SELECT `id`, `gradido_id` FROM `users`') // WHERE 'u.gradido_id' is null`,) for (const id in usersToUpdate) { const user = usersToUpdate[id] - console.log('found user: %s\n', user) + // console.log('found user: %s\n', user) let gradidoId = null let countIds = null do { gradidoId = uuidv4() - console.log('uuid: %s\n', gradidoId) - countIds = await queryFn('SELECT COUNT(*) FROM `users` as u WHERE u.gradido_id = ${gradidoId}') - console.log('found uuids: %d\n', countIds[0]) + // console.log('uuid: %s\n', gradidoId) + countIds = await queryFn( + `SELECT COUNT(*) FROM \`users\` WHERE \`gradido_id\` = "${gradidoId}"`, + ) + // console.log('found uuids: %d\n', countIds[0]) } while (countIds[0] > 0) - await queryFn('UPDATE `users` SET `gradido_id` = ${gradidoId} WHERE `id` = ${user.id}') - console.log('update user with id=%d and gradidoId=%s\n', user.id, gradidoId) + await queryFn( + `UPDATE \`users\` SET \`gradido_id\` = "${gradidoId}" WHERE \`id\` = "${user.id}"`, + ) + // console.log('update user with id=%d and gradidoId=%s\n', user.id, gradidoId) } // third modify gradido_id to not nullable and unique await queryFn('ALTER TABLE `users` MODIFY COLUMN `gradido_id` CHAR(36) NOT NULL UNIQUE;') - console.log('alter users.gradido_id to NOT NULL and UNIQUE...\n') + // console.log('alter users.gradido_id to NOT NULL and UNIQUE...\n') await queryFn( 'ALTER TABLE `users` ADD COLUMN `alias` varchar(20) NULL UNIQUE AFTER `gradido_id`;', ) - console.log('users.alias added...\n') + // console.log('users.alias added...\n') await queryFn('ALTER TABLE `users` ADD COLUMN `email_id` int(10) NULL AFTER `email`;') - console.log('users.email_id added...\n') - + // console.log('users.email_id added...\n') + // merge values from login_email_opt_in table with users.email in new user_contacts table await queryFn(` - INSERT INTO 'user_contacts' - ('type', 'user_id', 'email', 'email_verification_code', 'email_opt_in_type_id', 'email_resent_count', 'email_checked', 'created_at', 'updated_at', 'deleted_at') + INSERT INTO user_contacts + (type, user_id, email, email_verification_code, email_opt_in_type_id, email_resend_count, email_checked, created_at, updated_at, deleted_at) SELECT - "EMAIL" as 'type', - 'u.id' as 'user_id', - 'u.email', - 'e.verification_code' as 'email_verification_code', - 'e.email_opt_in_type_id', - 'e.resend_count' as 'email_resent_count', - 'u.email_checked', - 'e.created as created_at', - 'e.updated as updated_at', - 'u.deletedAt as deleted_at' + 'EMAIL', + u.id as user_id, + u.email, + e.verification_code as email_verification_code, + e.email_opt_in_type_id, + e.resend_count as email_resend_count, + u.email_checked, + e.created as created_at, + e.updated as updated_at, + u.deletedAt as deleted_at\ FROM - 'users' as u, - 'login_email_opt_in' as e + users as u, + login_email_opt_in as e WHERE - 'u.id' = 'e.user_id';`) - console.log('user_contacts inserted...\n') - + u.id = e.user_id;`) + // console.log('user_contacts inserted...\n') + // insert in users table the email_id of the new created email-contacts - const contacts = await queryFn(`SELECT 'c.id', 'c.user_id' FROM 'user_contacts' as c`) + const contacts = await queryFn(`SELECT c.id, c.user_id FROM user_contacts as c`) for (const id in contacts) { const contact = contacts[id] - console.log('found contact: %s\n', contact) - await queryFn(`UPDATE 'users' as u SET 'u.email_id' = ${contact.id} WHERE 'u.id' = ${contact.user_id}`) - console.log('update users with id=%d and email_id=%d\n', contact.user_id, contact.id) + // console.log('found contact: %s\n', contact) + await queryFn( + `UPDATE users as u SET u.email_id = "${contact.id}" WHERE u.id = "${contact.user_id}"`, + ) + // console.log('update users with id=%d and email_id=%d\n', contact.user_id, contact.id) } - console.log('upgrade finished...\n') + // console.log('upgrade finished...\n') } export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { // write downgrade logic as parameter of queryFn - await queryFn(`DROP TABLE IF EXISTS \`user_contacts\`;`) + await queryFn(`DROP TABLE IF EXISTS user_contacts;`) - await queryFn('ALTER TABLE `users` DROP COLUMN `gradido_id`;') - await queryFn('ALTER TABLE `users` DROP COLUMN `alias`;') - await queryFn('ALTER TABLE `users` DROP COLUMN `email_id`;') + await queryFn('ALTER TABLE users DROP COLUMN gradido_id;') + await queryFn('ALTER TABLE users DROP COLUMN alias;') + await queryFn('ALTER TABLE users DROP COLUMN email_id;') } From f73f132d504f71d1caa6cb8703abad11b8f5ccff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Mon, 8 Aug 2022 19:24:07 +0200 Subject: [PATCH 037/304] remove email from user on dev_up and reconstruct on dev_down --- .../0045-adapt_users_table_for_gradidoid.ts | 120 ++---------------- 1 file changed, 13 insertions(+), 107 deletions(-) diff --git a/database/migrations/0045-adapt_users_table_for_gradidoid.ts b/database/migrations/0045-adapt_users_table_for_gradidoid.ts index e33d5af1a..8f3f83f28 100644 --- a/database/migrations/0045-adapt_users_table_for_gradidoid.ts +++ b/database/migrations/0045-adapt_users_table_for_gradidoid.ts @@ -10,99 +10,6 @@ import { v4 as uuidv4 } from 'uuid' export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { - /* - await queryFn(` - CREATE FUNCTION uuid_v4s() - RETURNS CHAR(36) - BEGIN - -- 1th and 2nd block are made of 6 random bytes - SET @h1 = HEX(RANDOM_BYTES(4)); - SET @h2 = HEX(RANDOM_BYTES(2)); - - -- 3th block will start with a 4 indicating the version, remaining is random - SET @h3 = SUBSTR(HEX(RANDOM_BYTES(2)), 2, 3); - - -- 4th block first nibble can only be 8, 9 A or B, remaining is random - SET @h4 = CONCAT(HEX(FLOOR(ASCII(RANDOM_BYTES(1)) / 64)+8), - SUBSTR(HEX(RANDOM_BYTES(2)), 2, 3)); - - -- 5th block is made of 6 random bytes - SET @h5 = HEX(RANDOM_BYTES(6)); - - -- Build the complete UUID - RETURN LOWER(CONCAT( - @h1, '-', @h2, '-4', @h3, '-', @h4, '-', @h5 - )); - END`) - - - - SELECT LOWER(CONCAT( - HEX(RANDOM_BYTES(4)), '-', - HEX(RANDOM_BYTES(2)), '-4', - SUBSTR(HEX(RANDOM_BYTES(2)), 2, 3), '-', - CONCAT(HEX(FLOOR(ASCII(RANDOM_BYTES(1)) / 64)+8),SUBSTR(HEX(RANDOM_BYTES(2)), 2, 3)), '-', - HEX(RANDOM_BYTES(6)) - - - await queryFn( - `CREATE FUNCTION UuidToBin(_uuid BINARY(36)) - RETURNS BINARY(16) - LANGUAGE SQL DETERMINISTIC CONTAINS SQL SQL SECURITY INVOKER - RETURN - UNHEX(CONCAT( - SUBSTR(_uuid, 15, 4), - SUBSTR(_uuid, 10, 4), - SUBSTR(_uuid, 1, 8), - SUBSTR(_uuid, 20, 4), - SUBSTR(_uuid, 25) )); - // - CREATE FUNCTION UuidFromBin(_bin BINARY(16)) - RETURNS BINARY(36) - LANGUAGE SQL DETERMINISTIC CONTAINS SQL SQL SECURITY INVOKER - RETURN - LCASE(CONCAT_WS('-', - HEX(SUBSTR(_bin, 5, 4)), - HEX(SUBSTR(_bin, 3, 2)), - HEX(SUBSTR(_bin, 1, 2)), - HEX(SUBSTR(_bin, 9, 2)), - HEX(SUBSTR(_bin, 11)) - )); - - // - DELIMITER ; - - - - CREATE FUNCTION BIN_TO_UUID(b BINARY(16)) - RETURNS CHAR(36) - BEGIN - DECLARE hexStr CHAR(32); - SET hexStr = HEX(b); - RETURN LOWER(CONCAT( - SUBSTR(hexStr, 1, 8), '-', - SUBSTR(hexStr, 9, 4), '-', - SUBSTR(hexStr, 13, 4), '-', - SUBSTR(hexStr, 17, 4), '-', - SUBSTR(hexStr, 21) - )); - END `) - - await queryFn(` DELIMITER ;`) - - await queryFn(`DELIMITER $$ - - CREATE FUNCTION UUID_TO_BIN(uuid CHAR(36)) - RETURNS BINARY(16) - BEGIN - RETURN UNHEX(REPLACE(uuid, '-', '')); - END - - $$ - - DELIMITER ;`) -*/ - await queryFn(` CREATE TABLE IF NOT EXISTS \`user_contacts\` ( \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, @@ -119,45 +26,35 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis \`deleted_at\` datetime NULL DEFAULT NULL, PRIMARY KEY (\`id\`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) - // console.log('user_contacts created...') // First add gradido_id as nullable column without Default await queryFn('ALTER TABLE `users` ADD COLUMN `gradido_id` CHAR(36) NULL AFTER `id`;') - // console.log('users.gradido_id added...\n') // Second update gradido_id with ensured unique uuidv4 - // console.log('search for all users with gradido_id is null...\n') const usersToUpdate = await queryFn('SELECT `id`, `gradido_id` FROM `users`') // WHERE 'u.gradido_id' is null`,) for (const id in usersToUpdate) { const user = usersToUpdate[id] - // console.log('found user: %s\n', user) let gradidoId = null let countIds = null do { gradidoId = uuidv4() - // console.log('uuid: %s\n', gradidoId) countIds = await queryFn( `SELECT COUNT(*) FROM \`users\` WHERE \`gradido_id\` = "${gradidoId}"`, ) - // console.log('found uuids: %d\n', countIds[0]) } while (countIds[0] > 0) await queryFn( `UPDATE \`users\` SET \`gradido_id\` = "${gradidoId}" WHERE \`id\` = "${user.id}"`, ) - // console.log('update user with id=%d and gradidoId=%s\n', user.id, gradidoId) } // third modify gradido_id to not nullable and unique await queryFn('ALTER TABLE `users` MODIFY COLUMN `gradido_id` CHAR(36) NOT NULL UNIQUE;') - // console.log('alter users.gradido_id to NOT NULL and UNIQUE...\n') await queryFn( 'ALTER TABLE `users` ADD COLUMN `alias` varchar(20) NULL UNIQUE AFTER `gradido_id`;', ) - // console.log('users.alias added...\n') await queryFn('ALTER TABLE `users` ADD COLUMN `email_id` int(10) NULL AFTER `email`;') - // console.log('users.email_id added...\n') // merge values from login_email_opt_in table with users.email in new user_contacts table await queryFn(` @@ -179,22 +76,31 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis login_email_opt_in as e WHERE u.id = e.user_id;`) - // console.log('user_contacts inserted...\n') // insert in users table the email_id of the new created email-contacts const contacts = await queryFn(`SELECT c.id, c.user_id FROM user_contacts as c`) for (const id in contacts) { const contact = contacts[id] - // console.log('found contact: %s\n', contact) await queryFn( `UPDATE users as u SET u.email_id = "${contact.id}" WHERE u.id = "${contact.user_id}"`, ) - // console.log('update users with id=%d and email_id=%d\n', contact.user_id, contact.id) } - // console.log('upgrade finished...\n') + // this step comes after verification and test + await queryFn('ALTER TABLE users DROP COLUMN email;') } export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // reconstruct the previous email back from contacts to users table + await queryFn('ALTER TABLE users ADD COLUMN email varchar(255) NULL AFTER privkey;') + const contacts = await queryFn(`SELECT c.id, c.email, c.user_id FROM user_contacts as c`) + for (const id in contacts) { + const contact = contacts[id] + await queryFn( + `UPDATE users SET email = "${contact.email}" WHERE id = "${contact.user_id}" and email_id = "${contact.id}"`, + ) + } + await queryFn('ALTER TABLE users MODIFY COLUMN email varchar(255) NOT NULL UNIQUE;') + // write downgrade logic as parameter of queryFn await queryFn(`DROP TABLE IF EXISTS user_contacts;`) From fadbc7068e9f38fdce056ff9445d2407ab43da55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 9 Aug 2022 03:56:22 +0200 Subject: [PATCH 038/304] start adaptions of users changes in backend --- backend/package.json | 1 + backend/src/graphql/enum/UserContactType.ts | 11 ++ backend/src/graphql/model/User.ts | 4 +- backend/src/graphql/resolver/UserResolver.ts | 143 ++++++++++++++++-- backend/src/util/communityUser.ts | 5 +- backend/yarn.lock | 5 + .../User.ts | 16 +- .../UserContact.ts | 13 +- 8 files changed, 176 insertions(+), 22 deletions(-) create mode 100644 backend/src/graphql/enum/UserContactType.ts diff --git a/backend/package.json b/backend/package.json index 50f26351d..bb4ab3e51 100644 --- a/backend/package.json +++ b/backend/package.json @@ -19,6 +19,7 @@ "dependencies": { "@types/jest": "^27.0.2", "@types/lodash.clonedeep": "^4.5.6", + "@types/uuid": "^8.3.4", "apollo-server-express": "^2.25.2", "apollo-server-testing": "^2.25.2", "axios": "^0.21.1", diff --git a/backend/src/graphql/enum/UserContactType.ts b/backend/src/graphql/enum/UserContactType.ts new file mode 100644 index 000000000..93c83830c --- /dev/null +++ b/backend/src/graphql/enum/UserContactType.ts @@ -0,0 +1,11 @@ +import { registerEnumType } from 'type-graphql' + +export enum UserContactType { + USER_CONTACT_EMAIL = 'EMAIL', + USER_CONTACT_PHONE = 'PHONE', +} + +registerEnumType(UserContactType, { + name: 'UserContactType', // this one is mandatory + description: 'Type of the user contact', // this one is optional +}) diff --git a/backend/src/graphql/model/User.ts b/backend/src/graphql/model/User.ts index 0642be630..3ea4e2c05 100644 --- a/backend/src/graphql/model/User.ts +++ b/backend/src/graphql/model/User.ts @@ -8,12 +8,12 @@ import { FULL_CREATION_AVAILABLE } from '../resolver/const/const' export class User { constructor(user: dbUser, creation: Decimal[] = FULL_CREATION_AVAILABLE) { this.id = user.id - this.email = user.email + this.email = user.emailContact.email this.firstName = user.firstName this.lastName = user.lastName this.deletedAt = user.deletedAt this.createdAt = user.createdAt - this.emailChecked = user.emailChecked + this.emailChecked = user.emailContact.emailChecked this.language = user.language this.publisherId = user.publisherId this.isAdmin = user.isAdmin diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index f61414e42..687cad68b 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -1,12 +1,12 @@ import fs from 'fs' import { backendLogger as logger } from '@/server/logger' - import { Context, getUser } from '@/server/context' import { Resolver, Query, Args, Arg, Authorized, Ctx, UseMiddleware, Mutation } from 'type-graphql' import { getConnection } from '@dbTools/typeorm' import CONFIG from '@/config' import { User } from '@model/User' import { User as DbUser } from '@entity/User' +import { UserContact as DbUserContact } from '@entity/UserContact' import { communityDbUser } from '@/util/communityUser' import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' import { ContributionLink as dbContributionLink } from '@entity/ContributionLink' @@ -32,6 +32,7 @@ import { EventSendConfirmationEmail, } from '@/event/Event' import { getUserCreation } from './util/creations' +import { UserContactType } from '../enum/UserContactType' // eslint-disable-next-line @typescript-eslint/no-var-requires const sodium = require('sodium-native') @@ -172,6 +173,19 @@ const SecretKeyCryptographyDecrypt = (encryptedMessage: Buffer, encryptionKey: B return message } +const newEmailContact = (email: string, userId: number): DbUserContact => { + logger.trace(`newEmailContact...`) + const emailContact = new DbUserContact() + emailContact.email = email + emailContact.userId = userId + emailContact.type = UserContactType.USER_CONTACT_EMAIL + emailContact.emailChecked = false + emailContact.emailOptInTypeId = OptInType.EMAIL_OPT_IN_REGISTER + emailContact.emailVerificationCode = random(64) + logger.debug(`newEmailContact...successful: ${emailContact}`) + return emailContact +} + const newEmailOptIn = (userId: number): LoginEmailOptIn => { logger.trace('newEmailOptIn...') const emailOptIn = new LoginEmailOptIn() @@ -182,6 +196,7 @@ const newEmailOptIn = (userId: number): LoginEmailOptIn => { return emailOptIn } +/* // needed by AdminResolver // checks if given code exists and can be resent // if optIn does not exits, it is created @@ -218,6 +233,36 @@ export const checkOptInCode = async ( logger.debug(`checkOptInCode...successful: ${optInCode} for userid=${userId}`) return optInCode } +*/ +export const checkEmailVerificationCode = async ( + emailContact: DbUserContact, + optInType: OptInType = OptInType.EMAIL_OPT_IN_REGISTER +): Promise => { + logger.info(`checkEmailVerificationCode... ${emailContact}`) + if (emailContact.updatedAt) { + if (!canEmailResend(emailContact.updatedAt)) { + logger.error(`email already sent less than ${printTimeDuration(CONFIG.EMAIL_CODE_REQUEST_TIME)} minutes ago`) + throw new Error( + `email already sent less than ${printTimeDuration( + CONFIG.EMAIL_CODE_REQUEST_TIME, + )} minutes ago`, + ) + } + emailContact.updatedAt = new Date() + emailContact.emailResendCount++ + } else { + logger.trace('create new EmailVerificationCode for userId=' + emailContact.userId) + emailContact.emailChecked = false + emailContact.emailVerificationCode = random(64) + } + emailContact.emailOptInTypeId = optInType + await DbUserContact.save(emailContact).catch(() => { + logger.error('Unable to save email verification code= ' + emailContact) + throw new Error('Unable to save email verification code.') + }) + logger.debug(`checkEmailVerificationCode...successful: ${emailContact}`) + return emailContact +} export const activationLink = (optInCode: LoginEmailOptIn): string => { logger.debug(`activationLink(${LoginEmailOptIn})...`) @@ -251,15 +296,31 @@ export class UserResolver { ): Promise { logger.info(`login with ${email}, ***, ${publisherId} ...`) email = email.trim().toLowerCase() + const dbUser = await findUserByEmail(email) + /* + const dbUserContact = await DbUserContact.findOneOrFail({ email }, { withDeleted: true }).catch( + () => { + logger.error(`UserContact with email=${email} does not exists`) + throw new Error('No user with this credentials') + }, + ) + const userId = dbUserContact.userId + const dbUser = await DbUser.findOneOrFail(userId).catch(() => { + logger.error(`User with emeilContact=${email} connected per userId=${userId} does not exist`) + throw new Error('No user with this credentials') + }) + */ + /* const dbUser = await DbUser.findOneOrFail({ email }, { withDeleted: true }).catch(() => { logger.error(`User with email=${email} does not exists`) throw new Error('No user with this credentials') }) + */ if (dbUser.deletedAt) { logger.error('The User was permanently deleted in database.') throw new Error('This user was permanently deleted. Contact support for questions.') } - if (!dbUser.emailChecked) { + if (!dbUser.emailContact.emailChecked) { logger.error('The Users email is not validate yet.') throw new Error('User email not validated') } @@ -339,11 +400,13 @@ export class UserResolver { // Validate email unique email = email.trim().toLowerCase() - // TODO we cannot use repository.count(), since it does not allow to specify if you want to include the soft deletes - const userFound = await DbUser.findOne({ email }, { withDeleted: true }) - logger.info(`DbUser.findOne(email=${email}) = ${userFound}`) + const foundUser = await findUserByEmail(email) - if (userFound) { + // TODO we cannot use repository.count(), since it does not allow to specify if you want to include the soft deletes + // const userFound = await DbUser.findOne({ email }, { withDeleted: true }) + logger.info(`DbUser.findOne(email=${email}) = ${foundUser}`) + + if (foundUser) { logger.info('User already exists with this email=' + email) // TODO: this is unsecure, but the current implementation of the login server. This way it can be queried if the user with given EMail is existent. @@ -382,8 +445,11 @@ export class UserResolver { const eventRegister = new EventRegister() const eventRedeemRegister = new EventRedeemRegister() const eventSendConfirmEmail = new EventSendConfirmationEmail() + // const dbEmailContact = new DbUserContact() + // dbEmailContact.email = email + const dbUser = new DbUser() - dbUser.email = email + // dbUser.emailContact = dbEmailContact dbUser.firstName = firstName dbUser.lastName = lastName // dbUser.emailHash = emailHash @@ -426,16 +492,29 @@ export class UserResolver { logger.error('Error while saving dbUser', error) throw new Error('error saving user') }) + const emailContact = newEmailContact(email, dbUser.id) + await queryRunner.manager.save(emailContact).catch((error) => { + logger.error('Error while saving emailContact', error) + throw new Error('error saving email user contact') + }) + dbUser.emailContact = emailContact + await queryRunner.manager.save(dbUser).catch((error) => { + logger.error('Error while updating dbUser', error) + throw new Error('error updating user') + }) + + /* const emailOptIn = newEmailOptIn(dbUser.id) await queryRunner.manager.save(emailOptIn).catch((error) => { logger.error('Error while saving emailOptIn', error) throw new Error('error saving email opt in') }) + */ const activationLink = CONFIG.EMAIL_LINK_VERIFICATION.replace( /{optin}/g, - emailOptIn.verificationCode.toString(), + emailContact.emailVerificationCode.toString(), ).replace(/{code}/g, redeemCode ? '/' + redeemCode : '') // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -482,16 +561,19 @@ export class UserResolver { async forgotPassword(@Arg('email') email: string): Promise { logger.info(`forgotPassword(${email})...`) email = email.trim().toLowerCase() - const user = await DbUser.findOne({ email }) + const user = await findUserByEmail(email) + // const user = await DbUser.findOne({ email }) if (!user) { logger.warn(`no user found with ${email}`) return true } // can be both types: REGISTER and RESET_PASSWORD - let optInCode = await LoginEmailOptIn.findOne({ - userId: user.id, - }) + // let optInCode = await LoginEmailOptIn.findOne({ + // userId: user.id, + // }) + let optInCode = user.emailContact.emailVerificationCode + optInCode = await checkEmailVerificationCode(user.emailContact, OptInType.EMAIL_OPT_IN_RESET_PASSWORD) optInCode = await checkOptInCode(optInCode, user.id, OptInType.EMAIL_OPT_IN_RESET_PASSWORD) logger.info(`optInCode for ${email}=${optInCode}`) @@ -727,25 +809,55 @@ export class UserResolver { logger.info('missing context.user for EloPage-check') return false } - const elopageBuys = hasElopageBuys(userEntity.email) + const elopageBuys = hasElopageBuys(userEntity.emailContact.email) logger.debug(`has ElopageBuys = ${elopageBuys}`) return elopageBuys } } +async function findUserByEmail(email: string): Promise { + const dbUserContact = await DbUserContact.findOneOrFail(email, { withDeleted: true }).catch( + () => { + logger.error(`UserContact with email=${email} does not exists`) + throw new Error('No user with this credentials') + }, + ) + const userId = dbUserContact.userId + const dbUser = await DbUser.findOneOrFail(userId).catch(() => { + logger.error(`User with emeilContact=${email} connected per userId=${userId} does not exist`) + throw new Error('No user with this credentials') + }) + return dbUser +} + +/* const isTimeExpired = (optIn: LoginEmailOptIn, duration: number): boolean => { const timeElapsed = Date.now() - new Date(optIn.updatedAt).getTime() // time is given in minutes return timeElapsed <= duration * 60 * 1000 } - +*/ +const isTimeExpired = (updatedAt: Date, duration: number): boolean => { + const timeElapsed = Date.now() - new Date(updatedAt).getTime() + // time is given in minutes + return timeElapsed <= duration * 60 * 1000 +} +/* const isOptInValid = (optIn: LoginEmailOptIn): boolean => { return isTimeExpired(optIn, CONFIG.EMAIL_CODE_VALID_TIME) } - +*/ +const isEmailVerificationCodeValid = (updatedAt: Date): boolean => { + return isTimeExpired(updatedAt, CONFIG.EMAIL_CODE_VALID_TIME) +} +/* const canResendOptIn = (optIn: LoginEmailOptIn): boolean => { return !isTimeExpired(optIn, CONFIG.EMAIL_CODE_REQUEST_TIME) } +*/ +const canEmailResend = (updatedAt: Date): boolean => { + return !isTimeExpired(updatedAt, CONFIG.EMAIL_CODE_REQUEST_TIME) +} const getTimeDurationObject = (time: number): { hours?: number; minutes: number } => { if (time > 60) { @@ -763,3 +875,4 @@ export const printTimeDuration = (duration: number): string => { if (time.hours) return `${time.hours} hours` + (result !== '' ? ` and ${result}` : '') return result } + diff --git a/backend/src/util/communityUser.ts b/backend/src/util/communityUser.ts index c90e786c6..65dee6728 100644 --- a/backend/src/util/communityUser.ts +++ b/backend/src/util/communityUser.ts @@ -2,13 +2,14 @@ import { SaveOptions, RemoveOptions } from '@dbTools/typeorm' import { User as dbUser } from '@entity/User' +// import { UserContact as EmailContact } from '@entity/UserContact' import { User } from '@model/User' const communityDbUser: dbUser = { id: -1, gradidoID: '11111111-2222-3333-4444-55555555', alias: '', - email: 'support@gradido.net', + // email: 'support@gradido.net', firstName: 'Gradido', lastName: 'Akademie', pubKey: Buffer.from(''), @@ -17,7 +18,7 @@ const communityDbUser: dbUser = { password: BigInt(0), // emailHash: Buffer.from(''), createdAt: new Date(), - emailChecked: false, + // emailChecked: false, language: '', isAdmin: null, publisherId: 0, diff --git a/backend/yarn.lock b/backend/yarn.lock index 53a53cb9b..731404d6d 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -1000,6 +1000,11 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/uuid@^8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + "@types/validator@^13.1.3": version "13.6.3" resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.6.3.tgz#31ca2e997bf13a0fffca30a25747d5b9f7dbb7de" diff --git a/database/entity/0045-adapt_users_table_for_gradidoid/User.ts b/database/entity/0045-adapt_users_table_for_gradidoid/User.ts index 1e7e9d8d8..69a085a87 100644 --- a/database/entity/0045-adapt_users_table_for_gradidoid/User.ts +++ b/database/entity/0045-adapt_users_table_for_gradidoid/User.ts @@ -6,8 +6,10 @@ import { DeleteDateColumn, OneToMany, JoinColumn, + OneToOne, } from 'typeorm' import { Contribution } from '../Contribution' +import { UserContact } from '../UserContact' @Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) export class User extends BaseEntity { @@ -37,11 +39,18 @@ export class User extends BaseEntity { @Column({ name: 'privkey', type: 'binary', length: 80, default: null, nullable: true }) privKey: Buffer + /* @Column({ length: 255, unique: true, nullable: false, collation: 'utf8mb4_unicode_ci' }) email: string + */ + @OneToOne(() => UserContact, { primary: true, cascade: true }) + @JoinColumn({ name: 'email_id' }) + emailContact: UserContact + /* @Column({ name: 'email_id', type: 'int', unsigned: true, nullable: true, default: null }) emailId?: number | null + */ @Column({ name: 'first_name', @@ -69,9 +78,10 @@ export class User extends BaseEntity { @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP', nullable: false }) createdAt: Date - + /* @Column({ name: 'email_checked', type: 'bool', nullable: false, default: false }) emailChecked: boolean + */ @Column({ length: 4, default: 'de', collation: 'utf8mb4_unicode_ci', nullable: false }) language: string @@ -106,4 +116,8 @@ export class User extends BaseEntity { @OneToMany(() => Contribution, (contribution) => contribution.user) @JoinColumn({ name: 'user_id' }) contributions?: Contribution[] + + @OneToMany(() => UserContact, (usercontact) => usercontact.userId) + @JoinColumn({ name: 'user_id' }) + usercontacts?: UserContact[] } diff --git a/database/entity/0045-adapt_users_table_for_gradidoid/UserContact.ts b/database/entity/0045-adapt_users_table_for_gradidoid/UserContact.ts index fee0afeda..7c2dff3db 100644 --- a/database/entity/0045-adapt_users_table_for_gradidoid/UserContact.ts +++ b/database/entity/0045-adapt_users_table_for_gradidoid/UserContact.ts @@ -20,8 +20,17 @@ export class UserContact extends BaseEntity { @Column({ length: 255, unique: true, nullable: false, collation: 'utf8mb4_unicode_ci' }) email: string - @Column({ name: 'email_hash', type: 'binary', length: 32, default: null, nullable: true }) - emailHash: Buffer + @Column({ name: 'email_verification_code', type: 'bigint', unsigned: true, unique: true }) + emailVerificationCode: BigInt + + @Column({ name: 'email_opt_in_type_id' }) + emailOptInTypeId: number + + @Column({ name: 'email_resend_count' }) + emailResendCount: number + + // @Column({ name: 'email_hash', type: 'binary', length: 32, default: null, nullable: true }) + // emailHash: Buffer @Column({ name: 'email_checked', type: 'bool', nullable: false, default: false }) emailChecked: boolean From 14bd9aae81f466871fa8153d7eea18344f3df4f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Thu, 18 Aug 2022 19:09:20 +0200 Subject: [PATCH 039/304] linting --- backend/src/util/communityUser.ts | 98 +++++++++++++++---------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/backend/src/util/communityUser.ts b/backend/src/util/communityUser.ts index 45fb6d4fb..2f0743270 100644 --- a/backend/src/util/communityUser.ts +++ b/backend/src/util/communityUser.ts @@ -1,49 +1,49 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ - -import { SaveOptions, RemoveOptions } from '@dbTools/typeorm' -import { User as dbUser } from '@entity/User' -import { UserContact } from '@entity/UserContact' -// import { UserContact as EmailContact } from '@entity/UserContact' -import { User } from '@model/User' - -const communityDbUser: dbUser = { - id: -1, - gradidoID: '11111111-2222-4333-4444-55555555', - alias: '', - // email: 'support@gradido.net', - emailContact: new UserContact(), - firstName: 'Gradido', - lastName: 'Akademie', - pubKey: Buffer.from(''), - privKey: Buffer.from(''), - deletedAt: null, - password: BigInt(0), - // emailHash: Buffer.from(''), - createdAt: new Date(), - // emailChecked: false, - language: '', - isAdmin: null, - publisherId: 0, - passphrase: '', - hasId: function (): boolean { - throw new Error('Function not implemented.') - }, - save: function (options?: SaveOptions): Promise { - throw new Error('Function not implemented.') - }, - remove: function (options?: RemoveOptions): Promise { - throw new Error('Function not implemented.') - }, - softRemove: function (options?: SaveOptions): Promise { - throw new Error('Function not implemented.') - }, - recover: function (options?: SaveOptions): Promise { - throw new Error('Function not implemented.') - }, - reload: function (): Promise { - throw new Error('Function not implemented.') - }, -} -const communityUser = new User(communityDbUser) - -export { communityDbUser, communityUser } +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import { SaveOptions, RemoveOptions } from '@dbTools/typeorm' +import { User as dbUser } from '@entity/User' +import { UserContact } from '@entity/UserContact' +// import { UserContact as EmailContact } from '@entity/UserContact' +import { User } from '@model/User' + +const communityDbUser: dbUser = { + id: -1, + gradidoID: '11111111-2222-4333-4444-55555555', + alias: '', + // email: 'support@gradido.net', + emailContact: new UserContact(), + firstName: 'Gradido', + lastName: 'Akademie', + pubKey: Buffer.from(''), + privKey: Buffer.from(''), + deletedAt: null, + password: BigInt(0), + // emailHash: Buffer.from(''), + createdAt: new Date(), + // emailChecked: false, + language: '', + isAdmin: null, + publisherId: 0, + passphrase: '', + hasId: function (): boolean { + throw new Error('Function not implemented.') + }, + save: function (options?: SaveOptions): Promise { + throw new Error('Function not implemented.') + }, + remove: function (options?: RemoveOptions): Promise { + throw new Error('Function not implemented.') + }, + softRemove: function (options?: SaveOptions): Promise { + throw new Error('Function not implemented.') + }, + recover: function (options?: SaveOptions): Promise { + throw new Error('Function not implemented.') + }, + reload: function (): Promise { + throw new Error('Function not implemented.') + }, +} +const communityUser = new User(communityDbUser) + +export { communityDbUser, communityUser } From d1d1711e0984c98fd98c602ee3d95b62d53665e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Fri, 19 Aug 2022 18:21:53 +0200 Subject: [PATCH 040/304] first draft of capturing alias --- .../BusinessRequirements/UC_Set_UserAlias.md | 65 ++++++++++++++++++ .../graphics/GradidoÜbersichtMaske.bmpr | Bin 679936 -> 705536 bytes .../image/RegisterWithAlias.png | Bin 0 -> 61286 bytes 3 files changed, 65 insertions(+) create mode 100644 docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md create mode 100644 docu/Concepts/BusinessRequirements/image/RegisterWithAlias.png diff --git a/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md b/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md new file mode 100644 index 000000000..d705928c8 --- /dev/null +++ b/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md @@ -0,0 +1,65 @@ +# User Alias + +Mit dem *Alias* für ein User wird zusätzlich ein eindeutiger menschenlesbarer Identifier neben der GradidoID als technischer Identifier eingeführt. Mit beiden Identifiern kann ein User eindeutig identifziert werden und beide können als Key nach aussen gegeben bzw. für Schnittstellen als Eingabe-Parameter in die Anwendung verwendet werden. + +Ziel dieser beiden Identifier ist von dem bisherig verwendeten Email-Identifier wegzukommen. Denn eine Email-Adresse hat für einen User einen anderen schützenswerten Privatsphären-Level als ein *Alias* oder die *GradidoID*, die beide rein auf die Gradido-Anwendung begrenzt sind. Über Email-Adressen wird gerne eine Social Engineering betrieben, um über einen User ein Profil aus den Social-Media-Netzwerken zu erstellen. Dies gilt es so weit wie möglich zu verhindern bzw. Gradido aus diesem Kreis der möglichen Datenquellen für Ausspähungen von Privatdaten herauszuhalten. + +## Identifizierung eines Users + +In der Gradido-Anwendung muss ein User eindeutig identifzierbar sein. Zur Identifikation eines Users gibt es unterschiedliche Anforderungen: + +* eindeutiger Schlüsselwert für einen User +* leicht für den Anwender zu merken +* einfache maschinelle Verarbeitung im System +* leichte Weitergabe des Schlüsselwertes ausserhalb des Systems +* u.a. + +### Schlüsselwerte + +Die hier aufgeführten Schlüsselwerte dienen in der Gradido-Anwendung zur eindeutigen Identifzierung eines Users: + +#### UserID + +Dies ist ein rein technischer Key und wird nur **innerhalb** der Anwendung zur Identifikation eines Users verwendet. Dieser Key wird niemals nach aussen gereicht und auch niemals zwischen mehreren Communities als Schlüsselwert eingesetzt oder ausgetauscht. Die UserID wird innerhalb des Systems bei der Registrierung mit dem Speichern eines neuen Users in der Datenbank erzeugt. Die Eindeutigkeit der UserID ist damit nur innerhalb dieser einen Datenbank der Gradido-Community sichergestellt. + +#### GradidoID + +Die GradidoID ist zwar auch ein rein technischer Key, doch wird dieser als eine UUID der Version 4 erstellt. Dies basiert auf einer (pseudo)zufällig generierten Zahl aus 16 Bytes mit einer theoretischen Konfliktfreiheit von ![2^{{122}}\approx 5{,}3169\cdot 10^{{36}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1924927d783e2d3969734633e134f643b6f9a8cd) in hexadezimaler Notation nach einem Pattern von fünf Gruppen durch Bindestrich getrennt - z.B. `550e8400-e29b-41d4-a716-446655440000` + +Somit kann die GradidoID auch System übergreifend zwischen Communities ausgetauscht werden und bietet dennoch eine weitestgehende eindeutige theoretisch konfliktfreie Identifikation des Users. System intern ist die Eindeutigkeit bei der Erstellung eines neuen Users auf jedenfall sichergestellt. + +#### Alias + +Der Alias eines Users ist als rein fachlicher Key ausgelegt, der frei vom User definiert werden kann. Bei der Definition dieses frei definierbaren und menschenlesbaren Schlüsselwertes stellt die Gradido-Anwendung sicher, dass der vom User eingegebene Wert nicht schon von einem anderen User dieser Community verwendet wird. Für die Anlage eines Alias gelten folgende Konventionen: + +- mindestens 5 Zeichen + * alphanumerisch + * keine Umlaute + * nach folgender Regel erlaubt (RegEx: [a-z0-9]-|_[a-z0-9]) +- Blacklist für Schlüsselworte, die frei definiert werden können +- vordefinierte/reservierte System relevante Namen dürfen maximal aus 4 Zeichen bestehen + +#### Email + +Die Email eines Users als fachlicher Key bleibt zwar weiterhin bestehen, doch wird diese schrittweise durch die GradidoID und den Alias in den verschiedenen Anwendungsfällen des Gradido-Systems ersetzt. Das bedeutet zum Beispiel, dass die bisherige Verwendung der Email für die Registrierung bzw. den Login entfällt und durch die GradidoID bzw. den Alias erfolgen wird. + +Die Email wird weiterhin für einen Kommunikationskanal ausserhalb der Gradido-Anwendung mit dem User benötigt. Es soll aber zukünftig möglich sein, dass ein User ggf. mehrere Email-Adressen für unterschiedliche fachliche Kommunikationskanäle angeben kann. + + +## Erfassung des Alias + +Die Erfassung des Alias erfolgt als zusätzliche Eingabe direkt bei der Registrierung eines neuen Users oder als weiterer Schritt direkt nach dem Login per Email. + +### Registrierung + +In der Eingabemaske der Registrierung wird nun zusätzlich das Feld *Alias* angezeigt, das der User als Pflichtfeld ausfüllen muss. + +![img](./image/RegisterWithAlias.png) + +Mit dem Button "Eindeutigkeit prüfen" wird dem User die Möglichkeit gegeben vorab die Eindeutigkeit seiner *Alias*-Eingabe zu verifizieren, bevor der Dialog über den Registrierungs-Button geschlossen wird. Denn es muss sichergestellt sein, dass noch kein existierender User der Community genau diesen *Alias* evtl. schon verwendet. + +Wird diese Prüfung vom User nicht ausgeführt bevor er den Dialog mit dem Registrierungs-Button abschließt, so erfolgt diese Eindeutigkeitsprüfung als erster Schritt bevor die Eingaben als neuer User angelegt werden. + +Wird bei der Eindeutigkeitsprüfung des *Alias* festgestellt, dass es schon einen exitierenden User mit dem gleichen *Alias* gibt, dann wird wieder zurück in den Registrierungsdialog gesprungen, damit der User seine *Alias*-Eingabe korrigieren kann. Das *Alias*-Feld wird als fehlerhaft optisch markiert und mit einer aussagekräftigen Fehlermeldung dem User den *Alias*-Konflikt mitgeteilt. Dabei bleiben alle vorher eingegebenen Daten in den Eingabefeldern erhalten und es muss nur der *Alias* geändert werden. + +Wurde vom User nun eine konfliktfreie Alias-Eingabe und alle Angaben der Registrierung ordnungsgemäß ausgefüllt, so kann der Registrierungsprozess wie bisher ausgeführt werden. Einziger Unterschied ist der zusätzliche Alias-Parameter, der nun an das Backend zur Erzeugung der User übergeben und dann in der Users-Tabelle gespeichert wird. diff --git a/docu/Concepts/BusinessRequirements/graphics/GradidoÜbersichtMaske.bmpr b/docu/Concepts/BusinessRequirements/graphics/GradidoÜbersichtMaske.bmpr index 7921d16ceec07ec1a593c7edfcf9df46544e2a1d..8b6b54a4b89cbb9f3916aa226973464796293471 100644 GIT binary patch delta 42586 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 delta 23977 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 diff --git a/docu/Concepts/BusinessRequirements/image/RegisterWithAlias.png b/docu/Concepts/BusinessRequirements/image/RegisterWithAlias.png new file mode 100644 index 0000000000000000000000000000000000000000..bb25b7ff6a0d375c1f259a08b126968f0a235911 GIT binary patch literal 61286 zcmbTd1yEc~)HWD`dvJGmcXxNU;0}YkyIVpaxNC47+$Fd}UQ3LjE$5u>^PH#8jZsyWK}Ntwc=zrdvYf1>`nz}UdES0Qa4>HrBCh?N@7|p; z$w`W7daoYm_$X@HX5D0nbc=*-@&g>Ch9o2s3hqz} z)fhW1LTq6nuuzviwj8c7zcAQ_E_9R}4(>g9gG5ec%k5BL$4QrgWm~tKozPGr?L*7z z?H5B^{0a?gpDCZf>41%CH^Rcg!p+T1(ZKPiGLh$)iO0Ox`@DTi9UUF^AHSOIm#4;E zTwE@1VzC(ZcJGP9Hdj`3e;aJwe;kj)VVN3FXEDxgtu<_8XYumzm|P?AKZnQ_4nT+_ z3@6An300*2{N3Vr2cSYT77`YvGsyYUE9lnil3PmgW0Fp_K9|$9mnJ45p`cR_^5eOm zUpE?O-|Jn{D=*7@*yHuR)9a1X{_gAT>&r%`(1!Wlx1NV@K99z)*T(ynI5_D(S*zPe zw=Irqo10*;=`(bUBzcM~E#~pBjUcIe@HviEU)t|+q80Cq3=5SvHc_9p@k+$?6pFdQp-P>tv&Lsy|)oq zg%Fs2kJw)TDQ@k9$tCFtd&|k|P6qKXkK>|hK@jM93FR+$hffgJRRs7l@b3{laPyuZ z4Cj?VuXZrbnRkS%Sn8v50I**y@!t_jWC-FO_3Bb0%D z-q7}jc(OR@o8Y@|r^A%PBg5Xeo5_t(FZTmq9W^k_r&+mQsA`5ToImR)jeKr#R8-B4 z|0|?W0yL1Mq~rt)55`>sJ2AT_8bV}X4!T^%AgV-qid!kv zk5VL^IT+q%8^3gdAS*uI&kBISuR)=TxE~d8L6UKERrP-~7xcM#_k;P#8c!zNfj3kG z$7vf}L`;aB5~{{5CVh(LfaDQA$N<}=Ld|v`0NdbCm3&_tNi9MW^$C*9&15rWE$O2E zk$2NVSuG(TT!GY zBfw+lg3s-pP&z3;u58?YhS#O;9!{X7EB;n_u6M@f-T1=0YM)4(5QO5`i8P0$?=LKd z^YxEzi$&N$RfcWoD6f|yuN?OJ@?*@>^?~x>I=;#QW~Lz-mB-|5=8)wJ2=mE_om!%m zBgPPZr*|q7B=|>5y>jTm8WbvQ&LBkeR>CVi1c%|Mlrx$Tg&W9tp_6`LVt{xopJ1il zxWo*-rV#u5*pB%^^*#jk3%<17vIMol@T3!?A6H_5pz-6$r@yLvkmy$u7w7p9L0w#Qojg2}K!F$im!N*cp7L3q+)xQJ!dlXoG%)&DNm=K}EF>&w~e=7$d- zSjRQbUHs=$!l;yyaAmmAJ@>bEzzMoL6QbQs?;u4kDA|OgF@B;0_pUNc_t^AX{6q_N zgLlGwM%U5cQDam;Zzo`cZGZLFjJsw=!W1J&cB99^8wZhsdzRJa6Y4is>*HXH&Ob%r zzB+!O3Dc7m)HXT${&|M7f(+;94P9|=u77j`E;Mc%iJ3YNDfdjws}CDO8J6(pf23H{ zmvBC32`eJfv(LE26GLOXKJq1-lkrw9*yFd1xF=R5N!FzZhH)W41NYN6;fNBD_$b*qyb&=_#x}hzL{|=8F z$R-UC6cXCM1JDukeKfGKcyF#Ua=!JjAr~*=7wdxX{hxK62?@fr2fRFQyykq&mix1Z zqaSt!6Kp$F%*?1Bv5Yz;y`F5mBuuPLPC9<{^zfkiT>Y`b^Q1F7Gn3!R2?TWc`18$8 zbw2YahCTUar=+m4=xAw8jw2%@UwYcxA9YsEAMTyBv~WL7ZagK_zsASJgoHT{U??Vk zw_wju3|xLDdA%S}{kC{U0(yEI#B-+-+UMo%Ww!o_v9Zi_4R!UslU7rbKqo}hxO@Hb zv#g}UzUPN0me=1bm%l}x21F*-E`=g{p4WPET8oN`-W=AO>EyOn2z3V%fQJVL!t4P5 zh@-0!eQp>#?MJ;iEFm_NzNE9nKXc7lgeCDe5y5)uc{%EV`>!&N^XIQ$c^{8({&_j& zCl`>dMpf~@mjXhvii;^j3H~}4Sty==yv+Y_0|)r8X*AG3awq>EZh&O}xEXSw&p_tg zwY_tW2hh+JpQhoK%zVJEN*6sozfP92YAtjf*45>g17D>9?D>x*^RLDBihn27H@Wua zM0)%~UWQ$FN@e$H_Rq!;FM{{YM+* zB%@V!X#L@pqu`TmXbu0r8*7klCEh?DNvf$rve{2nj>RgS_rEhm`f5{a{}Eym#2-K2 z!vcyA2+Q5lI!{%E#mG=$Y-pIT6QzIZ!K}ALy*N40lN_6v#Va9sTHpJyYnolRV?rT( zp8yy2cZa;i1E6DI1Q`P}o=(g`6RKf3? zw?FkxGWE#$yo!osV;=RzaT$pza<^jQc6wgW(6pDQ=nJ|n{m5<^>p6v#^S`UeCnxg` z=0q>V6OCY)3WnzF8P6?qoAVw~xU&T<7Xh{W`O8f(XFA+e=C`{8ItY}11y(C%es}z! zUyh5m0xT1KJYVLkR^xcFWSSE!xe=vEkQy2|J3jymX%g$fqwYxsQw(i|l07N<|6`MV zlby4B+vCw%(Pa)J`QCT?e9YZEkp+Sqhbj2?`V0P!H6?hjxXZ0o(tEpEw25AsM9!3m z&P})0`d3N+Ac-s=n=OWgV&1jQa2KgxlPqk)`^fRzE;7u8?}fm$xkf`k6OYCHuln?Y zFSgLyvUwazf=@{9DsWE!O`1w+D?NAM9IGTAQ*QCjbqlNY`W&Vuik57C1x@nzb1XvU%hvR3Md0S!AWnsM7(sn6CKg zTnXB3V=c35Ml?b>XENz>;9n0(8Jd+ooUAfdpPge`&>fsWd-8ZgrLHj#VeJpfbr=qM zKngo)1{zjMNi3o%#yLT;LM}6Jl>OQ>iQl-Qt}^XBL=qGQZS7BJoO%jv0s6Bio%rx(kosF z#w$R;pUTbud+8ZG(u8eD4*b)VivaU+Vr1=SD0D5}7R&{c^Xci2Dm&I&hzpJ}!yz3> zKAsPli$`fD#%o^ltwQ&R4=O|C6-2E=3~i0XBqG zaEuG4{=Z?Jm3UlUzv1=TZn@d$$dV~^M4Zw2{;Po=K~Vfr92#RrfLK@fSnZyWxvlFl zov_pNK;^r8hE5?6TE|+Ru@}d^ISywxdR^a-gFCBt}ZtVVJ#U z!*eL%>gddEL{4kv1SuW=8^Yeq-t;dQ$@OuntehTHyK+yg?s$CG{O6M^W##hlL$OK* zb?mCp5hM7TLHr>XXOYg=oBH98zND<&h^yeU$qlX;V-Y)1uz{u;XT<=*DrS{7Zh5DxQBG~MHeT44%5^bKx@@Og%T1SrI5=f>sd|1Y4oABpjQ z8}!~^4)#*Cl5Csby7Yd}F2sL?OV>Wn(_oSsuGir0Hs>>pxDHqX^)9OjOWGDARh{V* z?%nRIj=dkn^|Ig$QsC(QcM7FfLyIdoGFrM$l<5hZW$C9WBNy`nFgDn7#%K-iuiHgjN`#-i}Wx1xSIZEFMIWYJHB$8Y4anHlS0QjU-OTae-e7j zb=LLFcT&#`E(232BiyyHgpY(^oR&yr{3g*#E~X0-(#6`vXEZQ1KmS9* zz~u6xoSOokT#<|I4u${S_2vFMrNCEccM{=#Cx0j53m3k$al$`4o{+i!6FsN33dVcbZ&Jd)y;X+GdkP(6fbzg- zEGQiBF9L7aKw@%ii*s|~jG;aOR-4o(4%IIBm6D-NO;Q99LS?;JW>xPXX4hi}1ajC$ z2!WpsJlClHVk6Y|JPK)yf283HAPT`=SupMbjg zwG8T1=26l4QUZf}Tu<^#klFjP|6h%j&C7eA)?d zGA%agy$P|amt?=hSFU02?ZHi6YT`w+E<{MF8JL~yF{xp89@)ERmj!q8<5th(Pg%?F z9{z7|JfY4;QAp_igC!dRtELyg5v8B=Oa9CT+~~RO+Ko@E&?=tN)ZuEC!C_p_4gprahjv|mj69ZMAG~td+7QX)rz9}YguYDoYKw63rpSqh1LbjE3m7F+P|t+ zRXpKhY{R6EM4GD{wGQj&(ByG~Z9?;0w7>LwQ7zFh4bNo*o_P6U>Sc&{bMO(q^y9tM z<7=V>AdboY3&WIZR0V}&`+L)2KggL7!!QletMJz^yL2~mHLlpg>KnIz%8*H1#>UU+ zU74@vtGechxv*AYQzpavi$Mdeff@dxr;s%)t#)-La_^Lpz83L(-YC+*co!1}MdlN5 zx7Vk3$6gByD1P(jnO4~U08HmgcC|#~_M3rcEECCc4nF4+g1l$;knh$T+l^5q+iNr` z7n{)?^}?1fZ_3}gmLYBV2bpf}?Vj(o!t!oScCv@dY9f9hK2D-~B)ItTneFLro#*Z% z4*NJ`ggZgIIJ#8rpKysBn9(?Vel8BRvYaCAiYn!=%<$r1n6upCO;U6on$&SjMb3}Z z$!T<#vGNaR6q=;NV5Hi_8$tXa`7)sh}u5N+#RH?KiKpz{FxUPDKgzuGtS#hLNA?- z!LeOAC`JQw0R8!2%s8R)Sw*CG$Y$s$XN<`psePnTb!>-2a1Y;^74)*MfqpIKK9Ao0 zZ{<#ugaB7$xv7bxFaj_ZjPV5fhV5@_=k%r3>4i^`WKNsb`hDsDI^^XNc>gt@4}EjX z5Ijhoa|9PQFfAE`k1(jQTVQ$^f?>#t#k@_rl>exVTCLC1=X%fFca4_`tCR)4s|fy| zy?^@tS*mCtRX;^q=WmGRVuvygKZmPpUv+Q?FSE=On4^|U5n3SL_)`Y)}9ln z{Wq7Mp5cqj^Z}q-^Scf+$j#9SWE;V>QnIoth%S;K6*}6#7W`7~+~|A#tMvn5FtgWb z!#}$3(QDRFCxHPcE;+p@g!+*eL4mp8w-v@}`$KQQ1;&9C!r%Ek*Mq4A1)q$9{|(0e zFHzZlaoK;NSIYnU&HoUL{XZZ57oPdjfUTx;h5qa2CnE5E`t?cWe={sRKmNh-^l((` z{dC8c@udHJFk7T^v!55FOg+7JX&ZKF`?wMG`pjV9P23ZkC+PEgjQS1iHsX_zj7*EX z#*4h(Pv2e5t6a>=kl?8xWc=ZL&l-kA8LnK!jcKlYpm@&s7T|Cm2T(# zc?h}_$-i9m#4c|Cw79XH^Cik;?8Du5QU%!?Ma`b^6iU8*Yl*$+hsq<)oKndBhZ>;n z!FBF_d9V-7@*=alJO@i;qDlR2gb-psAo^$LvNHuUId$FN2JVNjKQ@XvUt%A{v2^E0 z%KxpWpzDo{);DRuIQ|Wb)=uJY8AynY?X4a+2}l5u#}_3#1W+eZgS^QrgyhaVYVrGQ zb0hFEVRO$h)!FoCnsnh=d$h&tyJDkXXdc=y@thVEAPP*_Uy&#LYy+yuH!%DZvKmnZ zE##DU6)80*VSzwm8S;f_!Jkk$rnuKKA5-6n zcx<+G8eWG;Z;zQP!=+(+>dz~%$HIX21v3Ea z_cnySlg{%R@n8De66nNlv-n#h(VDQS`m(T2h2XP0!#)uIf}|O~dOc-pD?bZDd?&Mk zeDae^cG78Z#<)D^u!(@o%LMIf00F48rDT9fiBvbxpb}bc)E<|!|C8w*K6eLe@(A{} zu$01^0ipo>0|MSGYr>|L_|c!zB((x4Xu~Q4S(yT!!ky;WZo}XzYJqj0R90b)=a_4f zxIxP~B_D*#IUX~+I(OEkN{V484mtRazwT!x^n4j)FlErtAkgZ?z>(TBHFg*ev3jAy;D@AQ9u&<3I_AsMtjrpgj#E5W{ zm<+Z)Y#l;X6yYE05Kny7W{c+*EwTdlKA79@UM<9#0`cw{jQZ*dcvr_JPY6BJOdL%} zw^|&;{L6U^Q)}Sj$0hG`0G!xo;^IISO?fXU8awCfpQ-NgfpE8(m8xp`2#x_bk%L6t z-H13E*rc>w?}Z-3G|vztHe8YAnJp-&Km^L_e4qjD{5soSUqToonkHCnia{fkrCCTZ zhB+5SKb!%W$0josM+o+aQ6pofTfOrOQVP2eo8lrF7AIEU zf!|L^?$>e(LwudNp0o=-?b9=W3h@hWbn)LGmo7Zd&5g>}&}Hsb5{LI~6J8*W36Bj* z=BVV&K3OOzVqN{ZWuo;02agck5eg>RON0{vje4;Q;$ljNav6I`gCUyp#_nDj$1@=m zA#kiS*rc|4YKe<#ukbWRHVi(8@seaT=fJ-Mce@KPwm(_IZ|9Qw6?Rh`2E<4fsGE5R8)%f$|V9fq+0o9LxJfV&~Ma0)tdOz;8T#c56fK zjIL=bi6JhbzSnA?<3)lZr!QHUOF`yF{vR;Yg0tKE@W56(586O>BoMdJP`+tPdmeF9 zi+fhc=FoofHdxOx#JU3UY2l;u&Z}|1F+t4z*%#)-r)#tPcoA#m){B{SPqf3h?8zW= zelO);i@d&#%TP{+TrF*^$#+%-rcFdX;3`KFU7Wj0pI-2E`XC3<7irnenNJvYPsB3B zy!~N<1s`tWoE~R=S|>-$dreM+8B-B@(gzkt27t)0dZeD(*QQObh=fcVWLkYA3g6H2 zpmGntv|J7i_)T_ym~XM9_x9t(OA1k|mihr1#+IX1P_i%9g7QN_ z@g&XVO8l;U-iDYANcI{2jW^!Y#^kAlu6iz=Sd&eh``4 zZ9OE8dRmj1LEPA9_BTeCpD1!S(!pEuyUb}M#~xZIJjEFj9Sf4iZo>G2dWUu*i|mQ; z${hdIJh8CU8tUOiL00WIQP!>Sf?K4{9n!{OOP+Wt2C8-yY?}2>;ei7LCmq?avdmT& z1eTC5!PmNO*)bCcnk(*7zCTEUi4MP>3-=e#yN))%TYpnULobd7xoZ5L} zS#0dRVUpL(6wVD`nwhB#b=g31gzvUwOLhp(EwngmMP2u9eO{XiiCZ_L<#>R*%MZrU zOQr*E_7VKQDdLv}PphaJ2E1;NeRLan;p~Epz5RT9*C&ZWVj^so-Zqf86Hz>huy_MP z1cNBkO@UjES@rDzCWGX}IRVH`pcNtf9#|4P%1wM-I|z&YNtdFW$?%(4-w*N~KvHC@ z=D}V1=7A$|w)=8Q%}&pVaoF%|$Ed*sev$@WH!K#>Q_tn5P99coSOmtB);VigPgK7w zSO8sh&OS8frPQDD{AAXb$UT9#t{1ay)o>O$M=a`e98Z^4hrFR~9e3BAE!3A$nH#mQ zw;2pP?~3K3J>ro<^Q$fHi-RTC?!rswm$`q&72nl1eFu&t;>zYDA8D1sd*v}5nHi3u zi15*6To|PKVj64*7_|r`c;i&R-?oy{$a<5~6qH*u+7?eG2}WJNFCM*D=6jd<&_Qd+ zEVzS1aaQvaitJ0)z1laZUyw>O*G8g+6WPSz2WPSrlD0;)(X#~ul9?s7CPDoBlcG{J zeL_K*L*QqI`0`y@`V)!iHr{SGtNW>)T-$KKLEjHu0>Jsqf4_fe}oSOfbP=py&Frfgt;Q{0)SdYg|g z3Lh|y^sY<%@OA3e&>=0@A*OHTy$ITdon$(VQ0vOw`Z9b8tjeFyUS;1Dlfw76VBATR zFE=zQNag!l=x!9|#ves-?RRfKCHh6pF;U&6eEcdjT#c+~Ec^Yl3Fc~oV0b;E3(#i) zPEY;i@~1&fp^DQF<|seQqkBg_(G=Ct+*x@C&mFLIz&oXX6$AIYk#d`Tzd;~ zH-o;5M-PwB3_U&Qye!dDtKEi}#sE|;f<e<(ak2f4$O2eVb2K1KgKcq%x{2dum zk%EM8cvj|Q9+WW|Fx~iaI|Q-aFZ%}v4>uV7zEH7Gx(i)5@mCXuLWV*_P4=J44=#@ z6JLd2W<;aUUil@8+)l;Qt)j-iQ2lO)^qkb;o^6I3zbuh+We*JD%0Zj&LnP|?Rm0>0c@X(Yphb3=n{5ss%ZNk~dUk*8Hl`nn*( zBwUlDd!JRehQ!q6u#S68Bk`;vyKWym%W_!P@cDdq#D!7IEo233J2%3~OV@std6IF? zipsJ8>&t=A@Cl;6u&G5GG80OKAL5dKc0PCz(zJxT7WuiNGd;;vNmCqk*Rw&3nW$nw zQ}IE~3TQ{hCC~5yw}{A!^sDa_%9|}v>j5%7iSgrrU)Z9zT01}u z>(R25MD2;WXiVH+r=>1!(&^@Sp<$RbT5*W?));$wBIwvwoLi6wAaiW07^TFt$=~nn z9iW!U+#b@(`T%2u81!MsoJnv#X{t(ROS*;Oy>Q!|Bt?+WI#kbPPzY$$G=C7ISK)4% zPR`bzKWoE3cC{wG7?aH5Wm_@?7nW^hi{`3T9Imh0 zCmUwbFW#oNN;%alSHFGDWyl2cJ-SNizRw+S9PIhJDAUrWNpCB*LV%c%Mby1EWm=aD zIN}TWbY#`eMKOHdPeOW(qFb4K$057ar-^hA1Abc%Q!NO)Sc_{%Gr%0iUuQ$gXOy!_ zCw~mKADUH#Kv^meh1E@b~VCr zV}=;mPqF$ZR_HDg0S6>pi(eLwop-^*h#4LrQ17iizkfsv*|nG%pu|Uv4^q10TfSZ? zr}Pv0l-Fg>>j7x004Ve|B>ymf^(*(9W<_IeBSS?$AELB!9LoAo{cuy7j5?Zr)D`(1 zzPND@-4I=(S#zRi(F|}&opI_0w^T|I>R=aUtbXaegjN2gZw(oR=vOpgA1_sw{leEx z%R`6-!I_Mu+(RarSO&;pD#+z5*AJAKKWe|RZg8Ys9wl@=-E)ChhUF<3Ek*r|t>Yt6 znsX&8dsNK_$*;rf*d0es2Mlb;_}G?3a{i$ImZjk@z^`OFOc49jN!Tr(Vx&LCES7j@$vhstum%y;3TgQC;&d zl|;>xtmCRb$Q9c?vyDz{v-v319!MFjus$sho7cC#kN4+OhM(mn2B{+ZT+uqF_b2yIW!LM`D6f>on^yhhgsM3}gcG+Y*2)68 z`T+SNqYt%aldms|@%@5FDhW*r>xEZLf1Tf(`|C%kV&g#wEbwzN|JBYC#x=uuBLys7 z0z9MEJR@x_7OWWkKz(*5Y8dE3%bmCJe-=0LStt1M$qN&vGhOwF>Pj!^0T87B!a!VGnU+Gw&k#5JAylI{4&+a#Ch~pJ+u=S$$2% z4;n)WQ@JBsKsho7bL??~&W#Mm*J2hG-fxzg^wl8%VWmwKOp9DvV!JyC32ewuWvL;PEJfnfq+~0 znS9`@X@#JI*(1OTs+Pu?%tP6Ce80)xZ`O>~{y-=w8IT8!e zi0tzy7(W$G$(G}xt>VMYlbg*!g{W^bK3&QBlD(j67cAK?Nz7)q7Fn%B{yS*OqCs_v zq3gne9a8Q=sDU-Tv9Kh}DZ$?AC7an2j;=tkVkdq<2g7VFNndp~TzNXtP&Jytj#Zs> zn6pQ`3lZLYTcy~~VYoZ~dJ`;wDvQdH*vnU#t1XYDb~TMU$O|%J)jC(=@WSL=<2cyt z!=EeD5^9Qpaaarbi1(hu8!}vJkI@@v!;J!HCuQOBuZh9Y78bk5(#5yp4n1}iyR!us zvbdf7s70n@?oKsjFf{WN;BT5_>^&a23~wCapRhWJ5=b_^Qb6!?jvqD*fGg3?*Bb+# zBpd)4-#wI06@a;V+;2|0mbUEWZYlqm`Fb4n|+ z=hZ=5J1iRUlr!qI=#bFmS_yKI4U=-8_!sn_Y%;2ABDXlgC>z2Nl+6gt5HX`2To!&| zxAv_N0bDZ4bu$Ekh@l@gPf&1V=yYQ+6KjOwK6WEyaYX=E=MZziMEoC@)lMT#}qUeMLc@ey=@Qq zd9$5_lSiW+CM#>9W$tmbT1kEtQ$b^(TvW+0nbLE5CSb$8l7fq|R0PGvSQ+OkWg&w?M0hJv24eo>u zi@+5X=gVJvGv)BCE!O4+x@z&c=?>|joNZmkEC~a1&1fcvJn+k29!AMGGLBcG?RwZ| zPzOPM#W+F(@pyciH${=%IkGh1ul+kMw0B5F>%{a$MywTD91H1%GU&Xqd}Dn}Kv7-= zNuF*-sLY3gjo0Dj4Gbv&r7DSCLxPP*mrX^5c);@baaq8Qbed*l2oDU8$LQ53-D#iA z$j?AkPx$mP1($AGk|?hlF<_LYyAdw0RIa$dEpz`QeQ1^slCXPMHLbEsV~YYeBjOh# zNEWm%uxj3}eFOz;2EN>nq4JsEx3_JA$12EC1oj<0c)R$i*Q>@X&oe@r_WjiyWT$t7Q9I&JJ*#W2h4qH0H6$2Cqa1mq|V|4m{$bZUZw$W{#Zh*8cl8O_WyXS=mW??$SpjiIbV%L26sx{vtMC8Jy(V-CsGiw7lXS>OaK+pB zxDZ#*f63XzlVx4AF@K$Zqe#8Pd>z)Ph)`k-^@+VfEx8Bv!p;e*nrZN);!tUTmA?|9 z-pdFxv`b5MbmxhK2A9qD2XJOV0P@}M{aP3?h2^cqPJyT?PO6Wl?;tJUUPfF~HEL1Zsoj@YIZ)r6xpZ2`Ce+w-~zz z3!Fz94g#lJjFAW>JTHPr@M=x11H*l;CX*EJkIY(`Bv9qinQZyid^nKK&+)f~?S-(n zaYK#12ze60>oh{vU;|UA^Cb!4H+}P!P``Tksh>gZtmD_^pmwj@@bGq%mh|@vRKR%+ z=9CuT>~C96KW9r~g{z9RA)l8O+mO5cvX1_FIHT7Mjfgo>^|+Oy8=YqQ7{G@^6Y#<& z3#ucpm4o^YBgji&9kxbyvhL^f3@YS_g!SBDLR^nw$k7N+-RSuw*>>`Ab;D%6#proq z!5+&C1r=!?Rs!{|Z^(7=xB~FTs&gJmp7`gZM5VV)_!CumivPk=qtsrG`OSowZ(^lT z;73|t2mQwW2Xy2R**N+++`$`gYAz>+;;xw_B`^*O35h}f*>wb9c#6t@9NKoIgrRJ= zoJyg7M*}VHk-J%Q%NsD>+d#gNsT057VH2;=4`O+pqspV)%4=*=`G`#!*F&tLUD(th z->Z$`2wo|oT5K?0LT1-ofayGtMyV)qO&PH6<9bv?h+crD^K-8 zo+z(znGCpyYbJ5}DujtHX}i^Zvx0&l_8wCQNsUa3g3&@pzfzs+tOm!rBucr^(1d2? zI5+ky5l$I^rK8d?(3~xDgHG|5xoEqb5()7hTwK05pft-dzUQ!asDSDSz0_$MB=G~F z{E#A+$!tKQhjCwmeo=U18n(#jRV@p!&k#3G<g#pLoZ z$=M{T$13siaLc7y)Wfw!y{uvoUp|!(lY%@&K2#c6R1aTZHNKOw$nVr>a;!nrS3<}3 ziN4885o=~eld*p+lX{KBMaDRbQJk+l)>AQvyM{X1FvKFyAZl?zGx&)=e??9HUkps6_n+OYQ?E z*Tn$k$Zr}1K^~OXO7Chh)o5yN&Xu^PrhkzzSTp5mKc@T0h77RCRY>+dXRJKS zw1d1_-%r_`SczDqXx%R;Zi4eGT6a{#vqhS6CvaF}mJ9z>?@?8G&S{ayEGB2ltuB!x zg(^8Kn`SSjTz9h4pV+K7uT_MMUoLeG?fS}Vv6nM2)abK9bY$*D*k8T?#RGGdMjdk_ zf#Bha5*w>b?&n2M9)Q*IoLpXDyR)b5w#}3Q2|CYL?SLhYKY7Aj=h1~|79Q8Op-24@ z5{sfRQa)m04?p+bQd{?jOBhMD+axcc#W#)LKLX}Co4=B@rBl;Mc@UK*KiLFezh`8n zMD0tAMLE*6cs5~>pL;(^gcS7R1*%K@1Pye->6_%^0O9&7q)`4UFZpG$gNX&UxB(PP zKg3Fd(aV`^hw(NeuM-Cf=HxZgh@~3zubdi6M(tZYGRumJ$xUMWU*foc>vPeSh1GCa zWqy>o(E_gU9+ON!kLq_7AuW#d%R14dC9wM#gw>A+xyezH!sF;r{Gc8e+}X6~2tkAh zqqK#eaLl#oajQM3+CM`-&HPGie>Nm=~iGk4PV!aBF0=^WkXms6s!X7M3?bji}?SZYH^m zOySS_5OlS{3Zt(b_d-|rl$Se-n=9eD&ZiG3SV0a)KPhW))<*^9^6J;*2%!JQpRtzv zd~~`!47Rb?*Cf`8W`16{WD5^5okGav(u_?-tl;>F#Iyyo>nE|EAiVo=>XqtQ8s03A|Pnt5hb*`EI-3o!UFOmkRT%lLBxL`MQXMwJ(F!7 z@(z0(fq&9bEb8b`-hiNiFpH{LHy0^_N(61Q$ z4ZS(%CoXN6vcmjsr^smNsI+Vo0?^7yk4?UtFhpV@?ben=VN>oY{v2kD_2|Pm#qg!8 zTPsuOF>niszwJkFqLfXIv*Z04AAxR@vC^7Kv z7phD&4D(a{y<`6_aboaa$gm!s^>#|t0MT1$t|4CMIh%y1&dnwTbo%-chZKHhMdWLl zXTNx?#Wi$CMOEaZRCIk+57~v7wvaV3^hfDR&<$(608hz5S`h0O>hBH_pE>}mOKlge zlal&@mE(lI04e2YCOdFzZJ<1jsj;e!khBq2OZy7{^k~1|&AAzF!Z0`W+alA2>?J*64Kg}J?J)y(s_WiA=hYP$V8Cf61R%WPhIzWeb~CBjEC)F-HA|Jx z4qwk$w#mrant0A#W3FVCbN5Q0P69PnN49!-jiFI_VHo*+Iq zN(=UG7`4rOjCDwix(E7;e`A#e0w=4gV~^>JG76V~BS&s{i{))VwG5iwy|52G^V%ZH z#R-Fy`;)=9y>w>q!|cZZVm^cIx*5yJBL?H}Fk}sDJXafGbc?VoOX!1a1fHjRVFLRw zRZp^4MqI3A{q;eB*KnYy<-sr>L-6lp5s&1d){HSFgrhDT3q`i0V=J!J)spZY7>*_d z>4*~^ARY}CNEpr0O9-#kI~zbyLbv%h&}Rg}p-yPh5L7XWaP6876*O`pi^+Evr80mE zT_fT`bMOFDF`L6GVFntT(g)!b)oKtp#YW96R-8zwWO7!1A1pPqz@-LALUx39Tcy=H zYAwSzGhST)h8$GIj|)Fb6PorpP-n20DCf78mrJiL<07y|5^c*>^wy% zwP~6!4aG5+PX*`Jkc|Vajj8wR!>S9pe+?JI)4d9>wW9=Ra(x~=%-l8D>mf7Qq^z&g z1}$$NO9zc5ZfAl30$OOQ+!IC#v=y`@dbtpv{!&6~ZFFfFO&H15@0d=o6S82Qi{%?+b!Ap!b+RtDa2MSZbI9+huNNAC>Ni>6H_4Dt;sBbmQ+^l1|Xr zq)2v)TWa~k;`odp#v&gusI)|w-%qg|ir*enhzIa&sI6F`k7_Vy905ut0iEn>JkS7O zsRUe8saB!0zTl89t%ZX?BHR*o!H@FAj3bV>!=UEfgVv3@pmRJJhLqDjMG~q@XA0%E zp*Lqfkl+pO#3N?~8STi7mP+vp8zm8P#Bn#(xfw|+jfGhEirZ`xsuRmLgI-^4^fR4D=$zhA7rsdbrI zw2b{lD2eJl?Fa|8q6}t zOSv|8NO_1~?1gTj+3?Uh~aO92$;5{ z!T~^DKL%23=+{?Ye*8%f*ji0NsA}v*?jS6iXy$n6@X<9>DqxP-lgFwtVjdZ~9OBjR z9`m1ybFR6f$8V36Tuzl32oy2EXPoOsdCMuYgY-W{cuVrKs%`s`A0P*0>ucTRZ+B?t zC+fbpU-xAc=akBXRp_9**RTWh584WjKkG(vv9DcP?5Bzack9G)I;}n9P*>3cc$5NQ zM)zS&)72dsfeWw^%~i*1@Ew|A3|h<1ZBOJ=IC)~=iuah=^pd8te5oHDMVFHU^e2fT+CS2Y*WXH$g#112dt}7|vCh4ld_NnHV~OjTwvqF)IqxCSA)v_F@HtD`DDC{k zhXBM%+)-9-Xtzuz`;@F_pM_j_L@!m@%F9nWurMcXbnitU{tYvHWWz6v$%j53&w?-+7>_%dzvw>rh+m?^J+g7T0 z4Q=RFG?(QwOQ7s35di~#9{Ir$Fx;`vb@p0L{17tCC_&!#lmEjJP3eLjr;c{M)h~Tc z@yZz)cE=XAWFynII(o-XwCyhb`cc&Gm;sYt%F7Sy?0IgS%_}hGiiA{}K4iO*PsQ2i z-l_T5(5mkMODCG9l3g+z%2{>s5}vdTegz*fi+$oUBgIV1npf%HM=zeI@LQr)nc~K)7=;1 zCZ55%HsHsX#*-sU%5J~OabCp=q1lx}W0b_BvfhN}Dj{xGg4VK6-1U(|{l z*KtxYaFbp3#{|2wtw5RYraB|U}awT5(cEZ)S z)YI>435#Mk_7k#UH${L^R`Zkh+btMe8Zzz_TB9G7bgYET>u6pHrz~n^%Hu3n-KWDp zeYB^2_4G_GFV}-PD@P(^X$$`}5OZ#JGEXi)9vvtz6vxFxCHZaa(}|TaA1sZ8TRYNj zgof4hiihZv>_xGS=C}xO(LOPM$5-grH-$Qm32v!u7dbJX4MHou^PC-sW@G@iRkns^!l1p%uH1JgDOF{ zl;o20<-5PQc-38ruCEtqf8beVkxv0hOF)93TEZ|D2=o)LvdOc@H^OjP&({}0;UGB}QA+ZMFN%#0Q@TWYZ^mc`7>%#4;~F_Xp2 z%+NxMnVBu-7BhHcf9KqDBj(*VZzf{?bX0UzWo7P4SbMLPyB3*3;jT2?=r=vEqI{f~ zJm=?6zZaX^qs68K1w>%BIF>?)Qq{%cZBbZmB4oG^9j4Z0DgF*pY3ec{sQvUvUFEU@ zMcZ>CFUx=}SfYfY=oIe2VMk@?y<1Pe{!>`OB^dGhqbr7616mYf5@&V?mcQfkr24M` zb#&^qv!i5BBDac3a=s^9qMwRJaX^GzE<=6d?ptSvj%b41)d+b72iQH6!WR3j_xJj6 z&|L_pyFt(pgaVNWDTXhyjLw4l_>h7a z$Xwab`{;aG%g$Q5Wsp4pL~yA-3>h@`MuDigPVvZ_62zl1!fScoF?p%v3j`een%twg}FFiq}*xL4)oZRi5rszc(K{P<@Ze4;0u>!3&PPDptg>!tUMAkuJWS9t34ugrSZ< zLHRr}Q~H%8X~kDp!Fv-aE7&%>ht}>0p7=-Bj{pUd4gkc_y5# z2YdH=#8Sx*0kfdBdh^Bc%M2%*A)T9TLmjbPF-P4qgwe;YzDs6D`mq-7SCfcV?$bt* z7930tZQK;D%mJ63V-R!OQJvCchqnP#Rrs+;*1f8|!FW;xzL_3L+O2HQvTNo#T$`C* zLo1VC%2O?Gq`Vi@^(?v7$hzO~Y zSHkCu+h5|XM*B%e?}6t%GPa%u9#WUwCH>`o5wj*vp)=7IePsjhj5r-|-qN;orL^ZH{ze)|x425OSzVC$IrxLDD)zA#cl zUu-pID+ntL9ys7sA%BWuMmEeuFFP%23uw|g#t~t|F^OX-7BXQ`orxL9V7FFTq3j)e zbTMQ+Hgga1_x*)bMKJlZjKbGG?(2g>8ZlP&N?1an=ztpq5UMcT)Ze~EtrnAHBKjhd zH#7}bcf}m%OzcbpQPC*iSNC~@$R8OeBBwiuG`i|8aD)dA+Um*FeNzd#3L7LUX^g^~ zM6V8n^W6$tQc?~fS|81@3(COZ)W^6IqyHyu!HN}=yb)8^t#WID(G#m$Wa}O@eubAa`G&!v9?v_C2^bjE{ zwv`N-09V=TG`UbLjdN}_8Hj81&B08LG5O?BE1>KM>o8r!HmgXF5U8U{a|^gTzOu^qunCc##+GaduktQje+4F#PE z@Ca{sy@q*U4#_JmqLzONenYBBrj1D34m|vQF`7%aL*}h$h3Yr(s)7p3JKC9D44g5_ zxn+$uAvdh;f^&ogSIrGD(}#$6%@&erwtaf-ZSH82T2{y2f;Kz4R#P-x@2SntOFwq_ z!`yC|w4^Q=bT&R)x{uf6J)Ggb#b>8`Xn980YoXZsE`m%H6RPd`^_*7SZMD)}I`De6 zKDX^LwK3WCcRaShYR%p(*yl+#~0imQNLn^zzqn_25;kD!UM zyD>LYx1wUL&CP=h+A1*Jw$&_;g!Y*x#o`H%s_KJlZKT{ad0T40cN8I*yehVj9}zne?Am$6 ziLAw@JIx=`!BB|WFrk?~=eTW2-6STz@>L5>ETB{{Yt=CNV#_Kw8M&u6YtvE9Y^>pa zU`jx4Uvr85tSJGa)7QujINjzsB&hd8wlEO)bDA!_+3I%)jA zX?9CH60#P1)xay}Wa-(eX4101GwltTA7Pxu8(U*5cS&XWSpm9?ODx@k;q7BLFnLtmJAV7hW@s7WEQ>o;}S| z2lK}=zT1vFIIR&kUn;MC_^7ncPaNK*YO8ST0ZKxRooxzizfxue*~wPRwCvMLusYkU zn3;>alf6c2ZTfov=XfY8Q=NzDKUA!vI1Ad9#7;hDCt;Bgs8%3-?*8TJpM}wYpR}%& z-69-2ov{ZVwLrX#yf-OnOSvLdYj@x`HYuRpC+JA zy?ZxXW4`{YvumrP?>Nd4FdaSP!{g9i^}C+OWr0OAioAo`NI~?lj)`LPwPbQRY;L=$ z5b`j}tTO_90}rPuai{QPFH$&ZRfI30CbuA__#Ex;yM8%rAV!3=2t{;sBXq0sr^)|% zc4KW*j7l3e!1wUU(rb{Jg)6w~ijbLxaA!+Qx&*Nv(WY3KBrKTgL7%~Mkdm2eA?S*b z()_b2fvt0t2qAchsirjRXI?DfU9Pe@dL7s6%unl)oKRh-mY=Q>pS>9-eZ z=#QFllj0!1mNj0wZz_q1!j^nRZ({iJgCY!y7(iI2KBq?|BywB*@*#kQFznMQBM=yu zGa_Ss1pnT<-@Ewupy4?~H`E?OdpztGOD?lz(cVDtkDa%vRu9rzM|%!dL#zJbPYj=n zz|G~q_bdeLylJ+0Q06(>-+5S9QlS<&=Ro7lp;j8@5Ty6tn=^QrH;zk&vl_C8iuu?m z+;2y8Qn0QMq-W1MpMn5Tv-L z#JK!W*Y-42nsrVf1zegO>g{JGHncPV@ZN|t*}?XS&4YC%DlX;o-F2aLRnG=!M;Vpx zRu1G6AVjz4&}PXU4EUX`Ni73^#*%UVTuT1$@1~2nEP#aZLO8n+R9G)auRF40ul)Vk}+(K^_&>$kp6i$REH_4L9*pRVsMHPJ#?sFgYF4N+Eb z9OYia4eYOZwx=j9h^Oskg#DbTwAoLoo%XN=upEqgNl3vk*LjzW&f$YvJGt2hr-2jY!>ik zC_>TH8D?B!F3M>SIzm+46|VaO z*wN@~cV=U?{)%Q}aB>IYuq5GFXu8-OZGk2Xrcv^yvPo_RuwDTA{Bt-BNJE+X?45#$*JfgyORr)5Ne+^FS$5(J&ytBq15e0o zjwRZnfN=K2Qv{bAMauB|<^7mTySUBW+9!#?@S}=DZI|(aoJi)N%LoU6F6t}6V%ayj zP(uuIs2^W?n_o94n5d8?|7SQby5U{uqLR@Zi~`uWByH_tg(8$vtD7L8v;B z%({SQ?G;W%N>bg{?~qd8qa;uT+3kI87?}uFZE+`x693SXS8?IA$eEw(AnHyEG04Jb z%(#-IO7s@G;)5wiWpbkzp|)r0^!Q;f7-a-;Z(oTN9tew)r!U}u*^@x^bOb3w$O zZd53C|=v94J3* zo*ap4V1@0k?A`7RGS=QK6N_EI;8n_3y`PD)M<;yqkAPe<#@eiQ7)%@Uyy=>}`Tjx> zv^CP81x70Z%{?8<2r>D{apF=o7P%AAA;vD0xNg`hVFVSB7(LB~G3=oxub>)A=J1hp z{qsdAe+*R~`YBB`szvqST{>B82yLy+#?63`wYdOc-iW-rEIL%87dF_ui%U6orkO+= zc)Ah7JP)QqXitBY1`xM=qjW@OuCPk9xaxFWRK0wy+yi=~jZ#!2>x){yY)a5iPjcmw zIPyUWGS=^7Gyzy?86k9-Ce*xWAs;elYQ=Y6627wA8Dap}eVr75E|Drm2R&CT2U$#E zURiPYB!pl4E04ik27kI(V;YiH()?r-PF9G@+m_>zI7)YZ@mavb`7Cx?N~ohv zZH>5eUL|42>6jKG3QS^|%ZPxXNJCEy3{jHYy&{^4+WxJ!mn+k>BWh8RCa_AIc|{h} zknf(3i)Vodmos~sxOeTT6|l*}UEsbSN;GrBKFEEDoZaiYPi^IifO zlf+OE3*kLh9KM$xjbT!>P~=O9s3+2$`?k7wN2C!904)(_T}=C|c~aJIzNo|zUH8G;0hk)rqB1EvyWFPGpz58?h*jvr zq0;9}dIt9X9E$@_qL4`Jd9OLg{mys2;QN%|Dhk3%2PrKSQ%}CI zPNKF*Jxbn_BN-v}N?L4_S>a5S{cI8E8s$nN{lq8nF~6iQ89uw-?1-NKWQ|zHj|G)V z7iKBs$INc}+<$Z8TaGKDxphNwZvm1f3c;P94#JT{YgVIJf93J-x#DiPyU9QAACl%C z$qYJ9%<_Ftp#XRIbF@w-ViEZ-*1fKEOsEtym}|tj(@nIFowF#d^H|NbG3VYU!*dfb zZXT+ig-ajN<`FP0Mvs1g;kp`CT^w1$LoO#X`)!20Us+kxWj`_;A7NNbCQ;O1R7ik> z%4&qMh&W*tNY9=1)FJCIY@3?q6veSyiH5e-N$h6B@tH_5k3w+BCh4GpuQlM74fQ*X zcbuiYjJU)xMnJ`JE*)jAwr>SjeIe(o8J+hN854MNY9X^=|R@!XV@|g;a(Ou97@s9c$VgL zEpjfa!a>INQ6?RrZC*n4;W4^@Z-AYla8rYijj&{Bt=HPmoSiP#!w-jj_{k)DaNLRb zI7{1EmkMY);j%v>LxJW34jxlcAs zU4>ZG`kR3ma}v#0sTGEsB?76DC^TT4YIb)5SHyDh;-EGCS;#uO3q|FG+gr2`3dR7EfW&Z8zclY*h#F4oOBi-UETTIu=LI(sjl3^X#&4XWCk>s4r-d50S{Uxi8 ztv;8TJhSlOim zwCOXhC9;~oa3~VWY!0;e5U{u1SYnv?t+TCdSYZ+7AsKkYYI#WLaX8OB{KwA|9rY-2@ON-qud(n@O8#$ z%`sgFx9EGjH2hFW*aHFcKV;AK)?3_4V@WZ8aT^K=Fw|8xd!{)&r zPfkVB>=?M&lnZNMZ(E>+1umP&=j-lYFi0#B#6;EN*BHEd9$feJksgil-MEeEnoT!g zK4zbtYyJdjCO$h+tTd>g)=6leCXxV5O124Nug&jtlZFfmNC9mbalJfT5=*XdGQ#LM zhwk56!>=Xus7CzLq2tSfv0{Em%ZOuUDrwD{&E1qL$#Ead%}VcH5@f9uT{L`#y!4`* z;$jKkXo6DK;R@^1SHrbQJ`nF{+H{1C0Z+JR+oJL?QX5Ah`_HUOptLA0U7a1r6H%kO zytUf~pTsxP3Wx7Gg0@w8T7s7EYt~DjUvJKEGXmsjqn#$}>o+(N)W`#T&g)%M;@Mt- z;}7R~#{A0siMCoabGtU?Ga1huZhwky%!TQ}LgXJ;;-&uJ^hZ3)!tD3F-A~iQ=D*sS zCmM0)DY=h7Oe?%gg%4>4=GZyG&AID!*Xq-)!h0IWwRWn-valGXIf?*3oAkTOjB1d) zk_ZhHQIO`4+Yg3Tg2kxgs~LxFyMgNPm}-n!ZwRZZmQV>X9e8jIAn= z#~>StXl#;XwdH@3&fH&7qPsFWY;_u;1g)U86gfI`BRe0|4n23F;!)qHSt!`IT z08r+4c}LJzb$&HD#L2EVS0fs{2t8qQ%9n@${Yd+wRKzBSKH@pQu45E4`AKqps~IU- z^lfN7Rh?v{!0#@j|JbRB4d0qIYnRR{W-ZRqYfOb`@Uoqnh-e#^3=SKcbI?7il}LIA zGbF+$eBIkNo_eE+8!W`OYW|3*P%pY zwh$(|oA1M|BeIT%OMq$;Lx}y?1uIU%Z%mj9m)*`iLFs~R$kZwap-j71h$t(^UQg~D zE8mVfHC;Dtt!W~YFygsaL<;@=f49s7-aaY8!Hq8d6E_C&3AegW;#3FGRcjh)$= zS};auX#CM$#nyFEmXqR$;b3j)*^YErJiiD?GZg*{v;K&Mje+$3mu9=dZYo6e7x3efwpVVPu95{M?sB!3&Vz0N zszumn=^L7;H1|Zg0(mcJg<|yEniJyXh+y=#7Z}4Ev*he%dBs_6InN~q%{||H!}rhY z>KgY98m+LE+@%qEz<5=*=Bk#0!-+h?GEHS+Q?q(lwJNG~R5c+Ae6}zwNdTp6@X3TY ztw|91C1l(QkXA-{`WjmqX|o|&U#?S(OrIYb-4D_jquL-Xnx9!#R3qp5=;!WMmpxGb zh8kwr?4E2%DL8SwtPZ4wxdx^*yx_t}C|kVJP_r^(Rwgb1LI=^cvU6FIBB3bAa!#D_ z*H+V9Z~G_M*5C}(d^lv>@^0>sHX;M_AviS*_fJ8-%4bNv1JHxVk03eg&Dg=V!$qNu#r?)R0lJm?=fLQKd4r*LwgS+L zM

!q0Pq?>w1M)5Wbf_Y^eCx;!{nCGV4wDPo*)|SmCUMi?KoT zVt%I;8BEAm@^rLv=b|rZAKZ`nu8&1Rh=AZ8w?3A0h7BzEs6QB}eHeKrL&M;{C=0H# z7DMnbzg3{6;)8FI7>gKPh>vYJlWQ<6X|q0$fDaClVHAt$2X%vgWU-*8mcYKU5Y-*s zK3L<_UHCNqo`^`#L-!zZ!+&u(3d z+|vC4>C193%`xmv{{4?{_a5(r`R9W7Q0M;;{*KhKas}2j~SO!w|%=L{_QYe_P>kC{->DtdjFY5{~fIT&x!wPS|a{`tIXd<{;SRZ zbs~4|-=(~}yh4BN_@^>|M(O|U#DCT5dU;gF%ZrDVm6cx$3>;hlpMUqQx2K2ym?t42 z!HgFCAEWIP%5zVpLQrN?ELQ0l1&aNx?D+G@_&^lC!03>SkIyTDWa3eXDd@gy(q|Gg z0r}OI!ZKf5c$kdC{GTec7q3xg()jVOPZm=bOJ@CT;k#-7WwQ69N3S30*{`Q&|Cr&A zm*&Ugc-dP*&{?Hqi?%mQ5Rl4q800EEe+RxeS z-yb)9IA|W>e&28T_8GhVYOd~z8TAVaf!?t%d+xeS`*#s?8n(Jy0{G3s#X4bq?WEc? zouMyAZ785h|MZFQwW`g~&4;1vt~W5ZnfqMF7r%=w-75wtS^QibmB``q-j>cY@vIQ6 zaw(g02Ip);hS^0uKfVM3>#2V_%;V6|xLvxNV6~LctlzlhSh;{~j(0xK=Y4wTm$w}u zit69bBzK1{ODh*AF(`$0)7b||Huhn(fNBAan|=1q=R2+L4-@VdwPo(xfqP=hLT@w+ zpc+B4za4m=Y;XTQ=KdWcMm|;Rjz2%!4KNusE})BZzm%JaIInV0~-TC`)D%#@{ zMptK&UOf3RyOY2vhzdV!E>@Y#uNr)}c?Q$-eYP`~zVa9It`<9p35@wI^>SkMGCUm_ zkZ50VapCWxg;e(R8{IDx>xY`(Pvc%1Yj_QROp>oHQ%_PaM~!Tb`Ip*(OD?|lfGROZ z3u52v^$@A|O{>|e7}h$lZc$KB#BA*ico0}oT-itS*%u~i42&kkKRd}FTh_OJE=qYX z-r%y2qyn7$I`PiBuMZ}Z3$FK=E}qZ-cFjM8g(L8BXVw{~Kz;3P{-tH)M8M@!?z_Nh3bp5a=k6r3JBpRr56Rv#B+TnJ@CqB*qhfq zzsm?O3z#`e)Vgyh&(0^P>aJ(5Dsc(ss?okAD{KejK&FOxNHaaSFwa*tZ;fWmEIhZ0 zuRIa6!{xb)51;CHnsI3DCFA*>ktcR3NaZ#CBhB>urj!>?-Z{WsNrszp*H6_gIA*S4 z=MJ+!o9!VsJKoSKt8BitrDGLMMJ-_%1W(8a$&1l-KHZI5$q?^0%iB77e;&=2utpJj zJg@$*7Fz-zg`Yo?031qQ?;#zp+pta-PHH+X={RW@h2lx=9S-mFuKl7G{T|U|EZ(N@ zkaJ!EtRsu&TOP+089u+=9z;#Z$$MFxUmw|ZU$q!GB%uh*e+MdwbmI1L)no13U{5cx zKs-v}>fE{GHQ%)p z;Z7LI#rJRx*5>h=Tz!$ZMM*m%so+@oF<-As(>XIv7dvJ}4=6;n8J#nw2cI2a;C&q- zS&>98qD|0q-i1E-^u+W~M}zpLneQG9z$T!hLZ>?_YuB;_O%hX8k#&2)b}KBfxx7$y z?loZiGmU5K+IHHm({VpB*hx#h=I+3>H)3hy{)Us`ah4MK6ghN)E1s$XAA|1m5Fth6 zTRId=0$-vHi9k;gF5j{UGtxF;4B&Opf-5&FI={UP84 zQnUYjgGQcsV$0sU>HU@dz#svvPF?t!F>JMM-fn5PK)eoEzFbxN{Y(f1*|YVLRu>^P zmzUe0m{QQv(K*z2!goDg{}vW6LS30MjPxV>ynRbNooN$1z=zM*?^m&fVu#Exb3`)vf3I8*?|yYH7c;cVNY@SMO{OCZRp{aSb>j4pbdPC0o1a{W%(L zZ;mKFZ;qn-3N_AiJ4FRxs$4IO)4?SFYA z^#U3eY=PejA1@bNKeJR`Z!P7w+8g(Dem$PF6S3X5-O;tSndI%(5VHQSZrxM)s|(nL z?rDP(Kbe%*(1PL-(nK;>;y>U90KF+5jfq0@X@7_5AnG0tD(Tz|jxI)ac%GrrK6+s9 zMF0JEFf9c$eT>@L`~f?9pj(ZsbCeAERg&p#(IDe~v4@8eK1t_yuz=qyMo32k%$ft% z9-wOLG>iRW4(e0e$-VpQS#rtxE>e^lj^gBx_hfY+zaKTiFyIAiV}cLI`bP`UI9}7u zS;y*ge(sn!c=dg^DEuAFmVGlwRPZYa>%#LFx|sp8YU0f|2OLpUp^Sh81$7@{8$!9u zi#v*p)){|2rn(Y$4`3=*hSpM}Dfk4xp7!6CUp3PJe&5Lb76Cr8kOKUOm_!TOt~Wn( zGgWA}5sHU{-m?Qc6+3nIE-E3*JJRD$evG8B0`7#_v`(C@bStNb9jmd+aT1`3`261U~3m9rfa&~a_1g%w9)1EI{7&WUgSP78i=17Y_C zh5d(<76NV|^M|GUcQEkpUL$Y&wy+y~{)6^wZQ*?fdAC*{}Y(~?*RLM0XF|Y z%s)zl|C6@;|5V*IJas3i2QUtTuo6YLn zlF3*c1uUU`TUd8-+F~*e)iIh@`PW?tcg*>5!$MD=aR{vjhKFE`H;KKvt_;rwm$CG4 zI(Q9Y8>WsUVL~NDR4@5%WM43#QIH}5*&@aw9H5x!@q)>eo!%;T@89GLPlMZ6`KB2f z#Gy;0nXv+-=Y(X4LvRsd-Np3K#6M?TeytxLJ@YrOX@tuxD9<5q^K<)c?!6K0j1NVt zhd9MhZR!&9n`lYBBc_*|y#fEXI`_i{(~8aPz_s=S&aAlLf|M^UR-c&%lJcb9QlhPJ zV(3PvrmVcIg6jEbdhWh^^Wtcc$`B|W0=0tEZO8=d_ZsudsU<@adV> zZ*E2N$3=w)dT_0W-Yp*}6Qmzb0lqM4*cZL>am$4uq|0DU?!BBpuMK{AG<6_mp$66Z z@h1)0DrM&%Tyc{CwB#?N70^}*3#SpkM3Vxtxnp!JtgJX;6`&oem{tml1{J}3=9OXxgY*eoVDW|2vg1V4d2rl^`Yb43l4Jy_< zB9H1HGHoTlB|99vtB-D97yZv`$GWVPJ5J(hRbeqBM2vQ^jGrwGq`U4H>KGypY9d@E zJcyv*edp_YQUF_&=eafzw>QCQI<~+*<2-hLv;G#4Pk;U)9u2J)aF2)AHfTl{&if5o zZ3cD6?Aw40w9+>wUYRxruV1*~J3_I}!nk2P%qy;lAv+8gtnOsgl$elio(Aae+6j#S zb(SkvbTXS^DpbHz@N}$&sKlD9HQcR#+cT~4##wh}Bzx$XRrmLY$lisR{W@L(3CS

(^@#bg;@P=P%zLmgym6aYYiY~kFbN8 z{`}Lz$hbCKb@bE_ESFZ{fvH}@(-;j{rs|~7@%HHAd?d47v7Km@E!7HU_fO0qh~wuy z(c(f-YnFv~%ST*QI>l>Q1Ghv0-t}>qO`XW5BZ&Ybf=OB=vH`WV2r*>41gZu+wrCEf zY=P)$F#>q4sHm{ZnzRmmP0W~`B*c=D_2`Qa=+fQk4ta0=Xci=hfp;CFIpO2I1zya+QG6FkJLe zFk$nqqZx%3N8!jrC%9Tmw9Yb;$94c$C#bRzmRk-v2EM}Q?qOHso)YEPmwlN2&eG0# zPsV6@s#V{(K7Ztz*TFegSARPlEh>F^f!n6P1oM|YN9xj`tgkg+P+c;6&V_e4o##ZQcPiSH1+1FiSBVZ z*eYbl0M%rMhZ?FB(k&wn0*FpgyOH+>6eN56bUEOBGa8MmaL&r1VZf1w+H_3-qA^h@ zrNUKJSGu;hbi;VzTQ@-3jM~P%)Zjkfi)$NFM-OZN0c(bf?-!k>#DkKzfQ|eR=D26e z2T0hzzAl5OxD;GcT-l?iiiU024Kljz_C)YeCRArWW7Clv4B5QOIM>~`A?y!@|LSS= z=L!!&N=}NW&MN_&OAj5wOqZ=C60C!@nd#>c@+7a1V zfSMvE6t?Tw9Vpcd?@(1N)b`jXom4T_!x%r{7ENfPAwu@cuF|^hgQd$wjEu1BonRmI zu}H6JPu%lW-6Pq(o@j=wwptq)Dh=)ux`{H+7eHk*N~E$iGMkXqO30Ha9@A>QkO*$y z;Z)l9u?%|h5U;RF$tCqCu%?3`nB0o7>_aUG$9pNQ6&j_59>?};N)d395wN8F&9?$%jX8WQv0s(cfH7P|B#t2^*UlMJB$4&czMLx%7jO$pzEs2 zz^X$fAS{@&>#f>WKWi~|5x9^NdNtq#gFShIpB#-YnN>9>Xe8NF`Eh!AeTjCL5-yn= z+H|IP6y!}b+#9}os%?CRfW1ja@~Pt^*_{I~unyC-5{nLfBB#nrF{z+7!~+Iko`bv* z9vMll9)*XaWVt_w4v71WDlyC(VACxGAv}?z<14ihA?tQ_b5qbkoW!FV>W6;&)4Kau z#k7UaM6U~;JwgUrc7aSq+f79`UCLI>-l^?j<3h;U+1H&=9mgfLv>1GSl>gv4@o_l# z)!t1ekYSaQu?3s`s@%J4QnP?)ymxPapVu$Mb=SlWmV^2z_fl*ZwcAKBZa?KNGmP4owC z3s3+{rJbWcVCAqB{<@15&K#|jeP?1F;3endn#>=d@$Khm@j`!T^Wv5D6HV(|G7RdR zVD=3iJaM?2_lK61B0Y-;qb9Dxc^nfVrHTZF4GVpBAtQ2Y$ZI+zwQMUAG5VBW&kPpN zkDAoGjd!PuF(?sR;bESsi$W__giS_qh;Elt&W$S;r9k*96aMTl6ll)*E>VIL1NBxx zW+z>e3t+?>3##s*81LOvam%;PLu(>m`oI^bQR2sKk@cBxVpqw|MPnD%ZeQcSXT%jg z=$AO~L5kXr=-8M_Q1PTh--pw<`s^BsVdgtEqM~Y38IAagOSlo&#ieeWf zhHkwxX)rWgOUztdFCB$r0xfjAVxbEI@NyXu-Zm2!ERzj95uurcK6x*Ph3uU7%E3k@ za9_n3!0JF-AXGN;-w2;uM}pQ=zT=33!ns+fj|+9f`+}nV-xr?5V*B%09E=phSQW*n zfk8s^N`{_(&BbeHEK(sDGsC?aCk*~a7^?nnLS|gwpOWinRU6w7W9jn(GaMIK&dLHy zPMWzEAGM>L;8YeLt~@q9P~)o3Yh5r(GAqP|aG#9L$oIEkN%SoXuE+1jSsdY4MTx3i zL=O_F9c1d<`K>-?x%%i6n#XU3c8<->c4wJn&A#cH=$7(8*~FR~{it@TYWrNJSB>eIwJC4iDD!QqOyW__U2rGQ zshGqqO?7t%!y+lTT+CwJ)TK{`cKstiVHl15|h3IR91;Bl919($`ASaA%EQS*#5`8|c3`xwKk z>8}u$h)Zhc*3u#K(X_5_twkP_&hWw=g@%bm!fTDbYT)L*>z_#=1oLV$Ffxl#7|$b% zQm1F7@ir~gIs6!TD}HiZ^2T9j@)+;#)3dZ@6P}H{6WqBv{$oM8KGP*SN_dTk6m0Ms z2USNkd=tX4?gMj2HwoFK0?NFjRjYQ=gu{df^VD+Q8o#A?s^GF2KVpLSPQ~O zr_xZNzK}uuixj0zw{QAVB_yEvK)Zv6kdaL_|J7V>vtAliV|IzNaaZ3im#2sN zL6)hh_XMIzobB3P8|v-OL_>eb7&!@BG21hgD05D@?8(wt*Xd7v#~D_bl*D9mk>QQL zu$&ILD3Fi`_IK9&SJ&4H@(Ypv)1Cz$7CDIg;m`R~d)U zFq)ObXtLU0-nVa0Wb&17$oUH5ragP@`>96u*iqvBDnb@td5oyqbldp7oVR+Yjw0hA z9eRLDW_A6>Q$zwi5UQg2Jve1`$5@GoJbo}l#z?I;Z{vo$)p;hT6lPG)ERm-u3qwe{x z;kt-oc``;QWID-2@+w9d7xqrrb{Et^Sr%YDTNFN!IRC4Er-r=FLFZKD=)T18~#v)iTe5~_TN&_vE)GOFx-Xz6($yp`SO}lc zivme77cBsrlp|g&M}%rrEry<_c$!~^N0T41qry?rOlRa#+niM6V)E$eTXj}*BPV2z z8zgpV4=_|>)`Ou3Uvk+g!;mJncpbkuFO*Zbkst=*RIE`#7%+sln$8w$!L0OClT|$C z@yj6OwlyLFSwL)=DIL`!XDJ!*@`NcBoAAgMn6mtJ;}sNbN%RHNvEff)K`vwdm#Z{+ z3^1rJ&d$s2&3tq}@kjtX<%4t7vWaNGWyg8o-5^WYf;N1Eo%5AIHue^qHKW@|up;z# zXGsG{_myjZmz*sb;5)D(^N|ubNVuoD*1@S>XV^7mpWyYC%1k&Aw|$Zlea!~6#BG)m z(wwvekt?`W9%Qv1S1E$LGZZU9D08Hro^zkHkbwY=$6E6O+Jx?)a z$6b>i>}EniMj;tdZc;-uKQS_`mgZoEAc`uWIn-=qQp~VMHqt&i?`WE<@lvjgNTpbx zdxA&YLIu8gV#1?n8oSD7ilQo0C_0%seVM{Y+-}(vhaC!n!uZpH1X@quHJugz3`mwf zUEoT7Z;TtO(ce1-(XWyUsg)bz@eMTvD`Kt0tdd}m_G=_N0NVHOy{Qsm&SIJf7H%8bgT_|9xaAV~N}R4HM7?hhpKuaADP!`WCdVn8s)6O;| zvl*%Kp499N7)9dZS@AVfkv-gbsB68HQBm%GR_H3CyE9*7seYoO>eZg@RP=TC2J0n0 z)$^)utWmgJO_$@`MsBj3cErsws;)%^Mk(HDJgQ9(Wbo-Ubj)H4(t>u}-I117< zP|PRVCAn=1_>S(o{)O&ygN*MPL@{H3RXZ>B^s*` z2}3UTAYL$b%4r|zmd7E0c>>1!3AY_ppF=3W@t3j{-Gq3EzT2(TWrfmV6<73wKGWfi z7=#D~NpqQzE1WRV7b8K|9-np;g$tA@uB{qVjSP9w!JAj&aLnQba)Bf;wD31!vg26zp0jo&~PFR9%F4%?54O!k3`}; zgh2@!UG%Sv*TOWK{+f6nKep$>5_1{{?X8E_L_Y|G+WWQES?Yb=h|03%U~)_P-=?TD zJU;Ic0M{k`DV|=^$+CfypEn{i?8{s0t+-orPp@DEmQSV0JW$3Vs|dB@QGc|^gw|P$ zI1FAr8fCkGTf0ChSmeRid5*weGFbkWXEqVNyx~W<8n}>mF>Kfdq`YWn?FGWiI@5Mq z0mwM!!XtUA*a>&!6q=X_C<9>^&O%~a7l=<7UFhSBMnIA8ndn4*E*`>W&*R7a=*0Xn zMgKWEa@)5FGgl)Dhp;2Y+KRdkFOw(u$9qf(%k)0aa23vcJp-QPc0(|9rH=T()=l48 zHjS>W8V_CxWy|V&@ua1-wA7$##FY=}_`#2^>%2g9N}0VZM{6y@nE0ci_bm(k4p`(r z?&&*%bezQi@v0=`?@3DbmdUU^Ph<@v`e6c#1@dOYFZF){#SCA3IVvQdA}5Ms>Oh8N zZBT^e4DP<>US+|?I&$$B&t%NgMVi{P$@>VepsqOr+k zo#ohOSUNsllp21-qtyTu=NzJ5BVq+;ED%^`X|bKh#69(O)7^C_(sI;sa&&W3*mV#M z^wxs(=SXfWU{~QPYRC%&wxO!g;<#_4whZ5h`0lY!38ACd(?It6&$yOP?vLl9XQNHa zO$$i_422pJFzkZW*WZ`*UetKy6qB6LhvLurS64{>;QC@xz-U%_F8!`{LB8V{!*29f zmH^~$2J^1Fm^$5sFZmL6c)874LMI^^_U(smov-|xRGPO{UFWejDe(gJymhP07WG|w zkDVb-qD8yS2cyut>r|sgAv?2k#cnj$0{-aH0?V(R4CiM|_6!>zW?O}++Z}Na?XTfN-YA{4l+llj9f z#3oraAQnCwq5L8d8|Sx*wSTxuKOu!7@eAbCKdBVgHKdm2h8@VkDcDuXHHthRe^yvE z)?zxoMnkon5oCoTp`<`oAvEIcJ9kP-_j_IRD_rxQ;Pg$){~$Cp*;QPE{g@uMt?)-6IR`UwS8}Wc;>kW7SFl4wI}N+&ze;7dB2GT4WD1yBr_q)aQiE z^I4X0E+ik&DAhb!8@Swd+{-Kc%EgXkB0J|M^IPs>$}upaF5L#FHYShuYjsx2%H_tr zZEr%}nZ%G^&BNEme@L_Rb3KIj*lLcF9>Yb}ftYmmh^P5mX~oDgGlyWWpq%+@{WPgx zR+4asT-#NV`KmXKqjZicmo4vSV!6%x4MOmVS!1K{X(Kamk$>r;NCElt_0@Xvph3pb zn&sWpQp)E;wmB?Q135!5S5u6(=LU#aVjMy zPs3F#R4jWwkJ$$XLc-~-1VoE-=Itb#I)fZyE-6>4F0q>@HhHd}Y_e7jE>xaoRsJU(P0+iiP}k zEVGpqyzsZgg@m2#i@qS6$w~77G9jT(J%tF~8!+~1HNPp!iBl9ne8gZ8K|FnQ6`-^e zIbUmGKolmLHHL^gg$hax;IG>x0ev*+!uAiMA|?RPk#&%1oMZ@%Z#nKiSk>~GN4v2i zC*nO|xvox8so8bw+Dvs}qx(>WihGFoYX5R{Sh6sgKRHf&m)Zz)$i2Wp5I7V2(u_Pw zah9C^ZNJ6&@F{-23Xsc}xloN;GIG5C5Ovw|W75l%o@^N$dP@;{((=0}#9U2cH8_eC z{I1nCbP0VGK5qA5szQdW5(`!s)O}c6zgOVr!WB8h_O^pkA5}9^ruZ$T*>DdKXBYY_ zIQ}?cXRkgG-skUVN*SG+3T)*uJQ^kc%1Z!n_o5;j^eycp9vF)F5sVaPb>%ZliW>hk zq@EA}IxOioc*Xe`jUC!t)l}W>UV?6UPr6M~JbWMJ;9|(%hYODFP6&xo*Wa70MY|A0 zPIFkPgF%m~&9^$|u^#>sXmsE?CWc_YMV?Edp-c3@r)P+7`hm<1is?t04XK7A9zH$xpkPrSmu*#`K{8;9|BO(E`#HLz*eFD zO(5tG0l_v=sWh@kcpj8q_A$^6^RPn)gP#!G0OvkB>QMeQ;E_|BxaXTByrbyEYjVd7YPNg9-4z~H z8iR%W@GjR(IlZg?IOR&q@s60n4VgK)4x|nWbP^ATk|%-9$*_K@glncdwpEpHpmxT7 z+(diV!!~3h{=T*%CM_Ay@~p;5rrkdN9dmY>_DxLklUbj|ZYy@ah*iCY<8i5-R6WUD zP5}D1Ah6xjb8;kfwVTwOrGn>x7HKi&o@6#Ck~Ira?5OWTQLbCNo$G1#PH?%bXgJ*G zp_U1bm~P>tK%(3k>e4STvE&scCUPE=o6^##3ETcc918h^E1TG985eTYzVn1Je86BD4ODJhZDN(y*dnAxog=XT}@ z*xVS*vv+TvTkFGVGX1<=A`*ogP{gUV0*Gne?j!IbHrHXsn`Yzq)l4$I(?VwAASRZs z6~|2QICs)Jc?c176`RFYnC&IhC-)7Fr_QLSU}sIrii^F%4(p{JrU95Xr6Y~QxBf7z zqx@{?5D~eqDot(WEOnaB{dZ56nu7g36HM6e^AJJXa zj1_gXOeF~`;!%8o^2N0h2Wm;Vq$P?h7s@s@M`uChkcU=;uqU?~Kd%QIl{3knNkzeT zMsQ@bz_uO}Xk`0{BFV$*2 z?iqPHi`_*lCsIO>-Q27N4g`JvfCOxSc!gi#tDyrS_=}#WVgVRcRAW*nokh-pKufw& z$v02dGaeLQ1(bX4xf9Xs|H@$&(N8)r3Dd^>Mqa$BXdgQ>8p|~c6>4zp^ep7(U43CA z8j){$yk{uBgV^7s+R0p=6T1$lB{GX)OP^;*Yb0ln-%G$F#&Y5novvoVfJVDJ9vQ;< zH{OH(dFqUbtt-H7)K$E{$jXR!&$jau>Y2bExepF8r~=H?110;vO}qZ8TyTPjd#0nm zh)n;1obyUs`R{4e|8LgLYpVrc@m~;e{zdNo2W9B*+yCppKTV*2(rR8$`Jb@9@7&{3 zF=&;F7%muJ&KduC`G0t+|4_vL4GPcpl#V%fsL6rAG~!qXR=*rCl6tO9vm-o`5(Qu- zXpc=^~f|V@#^I{Fx_X^Lr53hBJQD$&~g3dBJ0f zN8VOHe@3h(Xd}nViUrsdXc`%kY!YCXOZjWnN-utAokkv&2m-~ujhziE-9|2xbaKEF z7W`!?(EAUC_tC%+r(twfXiJFK!{sV3I3fpWs)^csG!~spw}jJ4Y=8q@LCIfOFN=Fi z_HAsM^6oi0G7b+%Gcm^>M3$xZN-lq;L&zW+KkUuqtc3}iW-haRi|6<-8ZAn=rl*Gj zV#D2S1tZP-NcR?BfcklFlV?$SELZ*Ih@2ZMhI-OPdxL6vHcY%I*wv+&u>DXHHGx>? zX=0PVAgYZH|d}=PT zhTTRIzwwngnQ&PTyge0~-H%B&-sR0Cp_?NOGPO~r`%(cr0n&TR@`3PKtl1!b7i=k& zn!+AcqRpK~G-H9sNe=_7`kw|&BvcG|j*QzuaXdjV!Z0XU>+cnHSg$ebbi{%ZLEl2? z6R0efF~j327;gg$vvxz>H26^7gEhTg(Zy7jMD~bghuEGp$f+fRvmFIv^+b><=0G zRxPvJB&|04^Dqo9^Ew-3@5awHNJ#N9)Jo!y(1XQzs9EtSw%H%5QL_Z1|s_h%8n)^qZ>~zaYEP|1S(iqvsW#13UvBT$^- zvJ01VYnBC@Cl@Ga94Vi6`GitynT|`lq6DM!bwR_hfq7@&+4f+O$W?Su9ItIQ$Shv7 zPh5$CXR}A2ZZX)H=>rplw?X1Ey?t-!^Mc;*#t~p!4hlDRBC0X#1P7s^k?$97Ci)*N zvv2dhTEl#@O?ORgFulxNVrx5-%(FoVH759qW=zw{A>mvEdXjDdU#SqcsE+ZO1P|(n zuErTiMPQ@ZDlk4E&8=^OjkFxpWtTO$zPOGWHd0BAVU{DL0(^ZF&Q0VpVtmRJV89_K zlS=eQk>*LNeQ*j8i!v-`0I^piQM%j7(LoKHL7<@w%};PfjNMEJr0^rc zi2w=54^dQiMiO?+G9Vly^HD5Ji4v}daRfWJxb%ur|k#4nqJ!77;*;Hd(Rlz+S>GV`;pImwGQA!6AAC zzb$4tYG0cXR)&Z>acspljVs4$`GN4LhtZwMy%CEcO8A@zw}SORmFLFWqb+#0E}0}I zlKnjWBD5+Ra`vDP$;Am$XBpgjv~**!ff*MESzn<^+e~|srQ0%zp!3b}5Rkc}S{A<% z;Q`5a0#IU?$%E8?e5Y7>6YBQ>meEjggvwj_oA8v*!`Io7BjL*i%47@vu*I+6mZDQ^ z=TrXqR5oG>0Tz}Foe-`ozMd%gshSlJxV_em^scV>tq}^^AICna zo(=BkRx{unhv>|ac>pm8n#=>DAaz#PAWhQx@6ema;dE^x1;Amj1bMp|)NdB#gdwrP zRJL6xs-P46F*~g~PPQSLm`-kC9!Mdh^3hABqWc2nnry>geCU1$bOzTaGpJs$kN4>9a@>&ZiIK z&@CT&Xo3{zX3dYe8iZoubL0Q6HU+Cq$&QlfBHQ?~rRwgSNr#`zDiPSuHco# z;v&lV8ewd68*K3-Z&3_OLC6kRkH?*<7h(7eG#zj~6MUdB80fCFvQo)W@%d1ulo)5C zXya-0oTOh1w4C8{lheNCG-mLT+#wCg=hq3g6}E8xsl)h02h9%;4VoekR36c9fod(TZmVY z^rI0`1c3}7NhO0PQF`oBMO`yFbsDdHBs|})Bq}w$aegNz6^2|M{2I9qHjvVye%T6l zr1v(25(sQX#d*@5?Ueh=UiB`?7t8)MQz6u9vv1A0XMjGRif{*w7 zCh=BsZVaL>cBqT})Et}kvzZD#0Vg6?Sx@1yfeBN1zc)IjuAJ{AI{G}wfDZx(P3Xj_ ziqV)@VKaN-*r}iE5A2+DmhBLy+s#qkPf4T%(elPFf?yYdX~zs@v)P;p0M|kHAFs0Y z)M52P+_i>ApK?qf`;{AI5b*VPKj90HND#29d6zDEy=mcqBq`_#D}EjpgAEbVZP<*% zGnYi_QX=?n+rxapg=g-oAWykkBZ>!9x7?Ie{f)Xw%#i&sH(a^nVpwsAcHwo?~RbisGZR} zQ=+_+*WBy|PV4n8lfbW&iL$P)&R&ld*LZSvmYp&^J-sF=Ev@Iv%iTCsNn)ww>((Jn zB>D=-l4wi#2@O;TTY-qac#Sj*4UiN|YNvxN7Hfm;Y6i9n8XH|OGxrhBHK%80M!O6? zjfx8jcGGQNEZiw5Dzbz+ryD*cg#T(8liJ~;^_cr4At`BmR$kre^>k0iXPiqXj&|_6 z{d&EtALwxn+1sXB%D{jOoJr}_jVrnHHl@pgy@Ti4dZl%+xkraCrulMaaMb(d##_+} zGih$z3_GlXI)m5!`g}fdN1~E}89OwW;T7N|3g@v6L;U22XvcPd<|hDt6)>!6e{-zK zJ`h&XE|5^eP%4Sgw_YUq8dDXWnwsi{PClFA7&zZ*|Mvqde0*bnABY$D_XDJ>--8i9 zZJ1j}g@%NvBw~jNDZAJ5}%IV)_0KRV)W zS|04M0P85#MC{Vn=YypWowtXG=LZep#+rIen4+3FuXYvg-2$0K6plp{V>S4_Udx$C z!g20*sx@L`%ryV8=I@;+T2?ePG-)uokBoku(8=IuW`VEvy0KH#&=`SE?u2%Ii)%1T z4t;lIY6s@2wc;Dia^DI&}VENRr2G< z>o1a$KZV6JfZia*HOQS5Ytm)HRQ;>0DOklqcVNT5y&k%$puni}-<~*7o)F`D`nwZ` zg^P=eGSiGVlgIT_XvfRbi8kw($J1_6-G(JB`i+f^OoGtfbMf*7JdFlw#nJiadfaHP?-;-t*x!bWv=<^@^U06H@Ew40Mhk=h}W&B`E{!m z+kdUCSHZW(xBtGM{_hH2?$ox7p6;*4u+EA8KyR>Mo$c-$Ml`midduAZQbN7W5uN&S zU-6RjU!L*r={WyCql+seQW%Ky`^Oi{qQh9NhZX`)j5F9}r3fukbi_ULD&h(Vb|oh8 zRj-XKCjk!#6<=j0-wt0oV&*QbMV9o-Gkbyn5NiqV$uVr3?}?7|&y)2M@E-gWgjyJV zQd99jk4QPTzs?k_QX=mJvU$IY;L&3I9qDi;=0F<>aHERP9^hR3K%_)atx?%`Kzc~(tQLAXR%U2P zSEb81m~jULYmcY=NzP8+_CS|ptGJ(pLn>7=6_pFxMs_fOjB zG~K#m%Or{Xz8&+)9#SbXYUgk~c;f(1K=Lb8e#!-F+0v1UuE@_dAYG@vi)&zd&3x~Qa?I(-=Ena zZ0tKBqCbo3RxeH@V7v)1BEl`biE0oT7>&RUL&QNjDHpnJvLfa`cedDNTzH4vkT1p| zo!!EZY-z&4RY1WES_(W^Ks}WUB<&E@+X81u_>-oCtF$5Vr)+j-L`w7=#RC_UQUjhA zJb^+uX=7~Fh+|z`-Fsuf01(-Xo<=p;`a*(t{5R{%xakhQsYHlX)g|F$^2hwfJ}W6_Ae^Z)W*JtJ>eU zf9>&Lz=$OBbuuhJ4Du6X{U1VNf2SDupCWjv;{u+ZybM~cjV4sIv=3x)ad9JqdW+YQ zYv)_THH~gp`)Oa5mB({_{MfJ2XTsjjtFL#G2@~0%TU=b+&a0`h#{_3ixZMF4Q^fCr z837TIn4TUnI5-$A1HO%n)Y}@0KM~U6BMuFCkHzqjn|tZby9w!!8wapzj~h#m(hjAQ zh$Q;*yxU9`Iv)xh8dZU+YV+Do7!|BSLPL$uimRDVa>~oCFeze9WpHtEjhHjX#}ZRg zQdC=M_0QCuPEUr;N8)u||Cc$v@V8h@?Z;%iCeL4Hbpzw${ou*DT|%i$?MfzrQCr4~ z@^QH1ahTgR5#$d9D!%%af>v5YDY{JU1x%@>U!Kn*$NCbZDxg#Y zweTORLBlVFpbj;QN!okbS8;94Y%*b(`f1#ZRlKLW|t&5)E?%t`m@fNv``zsB396S^cpnBrW1UHgP z7C`jv-SE^Mz59Lt!$4?=aMRYHZ~4V#u1wmrXm-!}B}DxRcd7=5pw%crO8ju);BXT6Ai83;&eyeYi&l@(|*Nd17i# zP7YK&-rZ26@Z=d!O%~HvxNo~Mn`vC(Q%%NT<|E<7^_F9DWaMP*+8B7bpOz8qV(ZpFFj$=WqKa;^{dcTPrd+JW|~Gyjeh5g zs8o)6*L(NcZL;5Tei-9erH6%QiU$HN4Duw06R1KZ3H<2>J(-1?Cr=)X@1L!#PF2!< zW={&ia<{+C85Pc^XzOpM>$fkTwv67m3c$PIoAysZsUO?(c%GxnmO)!!+QphYKId*4 z-9NZlI4ct`p1!wZKDuAt+cS1K-&_a-sptk_+SRlXuFAd)Il3$YS!mHuhj!I|eoE=9 z$t;|Z*L;6*^F=Rj?~|1Z;dtB>3j$`TuYx-Y{TFHQU}5J+{_=eCA_KPjn6TedaGZNa zw_7yf^xUBka{w1lH#G%W2^J;aF=8-h>hK;Ja}4B(VQ{qe}%4P7uq;z zb{(^=$T7(CZ{+#`Q@Pg<@W*5x?vP1M7`_BU42sXkehVxBdOHnvUFth*mG&+wYP#?o z#gHzIT32xuppnY<%MlzvaL5~3(R?{*adx8n}J;%Ci?ZhJ~_5(eSA{jmz} zF7nYYR?yu+t)vzE`zCQ#_@?B(jcl{La?S7$1Yh9c+}^b`Awl(Df26)cIj?Z++>Z;M ztG_E0-5o&+YynL+y6RYZ5qWt@#$+tvMb{I`z zvu%k+*@g)>!m#7={;4=jUV0HKTIOgpu(!a(V67V3)Y-Kn3h= z`tdsPNKyB5yU@1a51G}@gd8Re@#5r8tkQ7q?F<>v31KF$H<<&=DRi3vK3REyTB&Em zaY{zg{a%~7OIhs3ETCFxtOAyQo%y>g#bC#;fos1iQGh!i8u6(&jYR1QYcoXr6Y)UG z1VXV#l!g5C_UiAhs+ok~sV5toI_>rOMk2MAwmV>TV|P}IKw06Ofs4-_V?zL5JWk-p zfXCGK`Nk9UbEHzB(pu;;qF#&frdec7gauk|v4jV(^s6Gj(y-tfIlQTbRhz7y(%18kvA8Yos#ZlgfY zj7~e-@Y~TRlV?-h@&2JI`C<_}KS{cbNac^~y$3|CMaXcirGuScj@5c6VYc)PR#2m+BMfQy=-VAGMtuS%sp-h+4Y&)VjUWCYA8D7bV z_S2SrE$;Z`pEbNwpNnxGrs4fD)r9UI!xC7LsQ~YFU9Z2!^|}wqxUKU2HIm2SLF*$m zxjvyHXkVtKUPd^NP`XA`RU_u)$_i{`wnT5`{;ZDOP9Ep$7cwOKS`GQw8)0sHEN599 zcyy<3Z^&?yL(yH<0$GH%hraSnmV?ib4-0eeLEy= zXhNI5ur12a6kS6@yaTgJ4PLu~kn`8`rD3x4S1Yuw7~g`9c{$ShW!__4{Hcn-`)4FM^vae=#F)gjfQ zciJEb_AE%L808yVP@pEEO3upn%U|$u@o`zV3aBAM$y&`GF#2D3yNX#Iee8 z=xY=VgS6_o-i&Ke_wHC+L@MQ?QYl|ZOau=fVh1%xPDfaQkY-3yUcmz{F(jnNi$OSD zwQC~OG9mG9n%wcN@xx9+>N5`{4G2}++_~+`lX5NoWkA;p+3|~osAXwXdl_3)M#pn{ z4XhkP_Zfrh%7h|u6kfJkj(@vB4>bobEE{4(;%0%hc%No$llnuz9Z zT|ouf&+Z~%aC9UdyhKxrX1BuKj%|C^8?drK-emXt(O`{o`W7jR41*%S^ZJUE=skK{ z;ZyeMn9$sm>7&6|FHQbCNm67IjvH7#h#5WgZ$Yg*5gp(aF^XEa->uupskwiUmcF9m zc11U~R`0FuaX!g(Kstgv;q*!KL@h53=|`QL7>czrc%c5BzZx3q+;_TR!`uaiFH;Eh z-R_Nfs2oO{Y;WK?n@{7*KXXWelY)Ef$27cw;)#TFO?`$-_+?_U+*(d7J!gva4+VX?l#pp~T4!v=~_KwyjH1%538mxo_3+mn$#jI*DqM`nntIXI)JkVU_ zc=BQBc<6T$K6C>KsUo~5A4b+_yCf{TY4;;Lj2mEU&F}k`mW^VmNcL7TO02ksB!a-<4BXra z&kLa?C26IZ_J{Tt(|7a$x|m$wwK6+Dg_d`CH#khUw{@0YpX_B*qVWb$f90s#!qR)Y zvXGwFGGfu9(?I$ktetFyW84!AloR~a&TOea@LF*z9p3wiJY}sFaGjfv3C_ea;c}}t zwT6E<1thMKW}qczJ;G7JNPwxi*e?Um5f|F?lz(g~BP%V|L*)uBL+k!5kcTOlb#AvQ zUT1w)l1RR4yuIh%exmlwxC~?Db`SB){={*ahVZ@r$1POdgp4v zPQw$C-FW)va(*{6zF{KL@q;@z^wzdyeCjIm)E9)D zZ4=gaJQ#8hd(jSE-yc?=oNioQ`Rs6*1=Mx1-N&9@VKp$S71qnhq5YWuTN`a^%HBxn zFQoI;@TwS;{`L)HD=;c@Q~P;K`xPG>LiDRr+3Yi6eLmhaa&fs$ALx+ua>w-3d7SMR z77>BIK3wnv=S&%M%_MxKuhyKC(1VR|guXcn4mLKnOd+dH*0zz%=gUH8@B|&j_-bu} zPr6r(CgO29?F@^E7#l298>f`b7+F8@etEzeMFwL`^7BX6!o#<>x5oW?RUXxFy??OR zxKv>#I^lu2u(VFqp!>L_q+Rs1cv@u=9-g#x{J-4;KgmRfDtl6G@(QAdbCy}mW-A;7 zXeYbZ3@2bj5s8ls?4)>)tb>;tBO37tY}sbXmd;>g#X4+U9oH~q&$K()-%p8kM*QYQ zNFt*-aIQuFAv59K)%=4*bd*ZO+Xonr6=pcaK8d1u z395K_Dppjg!)UGclgj$v)A!(Ih-kBI?2o?IwZB>Zr7>KSTfzD^cnhMk<0@k#`|V&V zSo5nEWa*&Oc&)z6B3;SVQ%!l2ZSa7br-j$4bHz|PZt7zhaU!)c#@}Q6p}?q(GMm<$ z1#RfTxa@{e*L+k!NCGhs|KugD`yQpuFV<${s(m`(aTJc~q+z@Tzm&eP(knS}-W$I0 zGi^HVy|0y+{qX^iiOjky*=cX=E!u2DsKeIh)0;A^Jr(-k+DG!w=8!4x58>V-| zb!xZe%Ym0a7^Jx7-~REt<*c?3dn}TYDo2;2+r!(yaWFHX?YgYOegyj$rUHEHp>cju z+QpXU$thL8+ISjBe6yZ;ZZ2Y=<+~5{3tOa)TY7aA7#tSwtHPZS&_w|syrD=H+lnOA zkRt1n8+rBon)s1N$IO$G%%Aea!(_+EQP8ABJy4ToxEjz~MHwi}oB^Z;<8*B=_N2<| zYdDG#K>PAUI8hIX=oy;P7CQV`h+Pv)QDtXjF7scN3K-u7!}U+%ia;~Cc`KD|pyQi_ zIhce_9YeZWT1EL48wjlRCzO<>ySH0ZYg#L6F2Wf-;Soq*PmsUU9D=y>lK(ZEsh`3gn4l4+L#@(USTa1Yc_Bxd=)IuF3x_8l1q2@2!!$wYr ze4vdxop9?mSLIZY;MzXk#m{9jEDfZ%giPtzTw+9IU)PX;^o5usVW`2qp$yQ_So9r* zy3zSyycPd&b$X!|C@osi35o{Fj`pNMP?&lrU6wI&TA8i1xIG8WVUgFi6eY7J!$vAn#XI)sRTDxcg;Z~YCd8{ zjK-q#cb!4e4A(9XFKU#Wue%aA1-E2WYadKXzIn7uJu0R-w+vKCWsh_yq@OUIHGaC` z0}5&-`ta3*?yglA^B0U-E^Ctn;dK?wjwlFX8BJ*Xa819TzhOPpb$qvY2|Dzr{Sk;6 zvME!T`D$M9H`1w=uzbGf4`;7he_wDzcFmSJpZVs0VO3y<863KorC-mlW>VyH-A5#};(VfxdrNW1miGod>{j!_@r6 zNYpJ2^jP!GdYikkOcgfC-*i6$;}QASC$F-zXPJRmEYe^F4fTq|W8!@>pHOK;1ZQop zP5rcX;tUyYJj=g@70RQJXNC+7XgDdb$KH`{+7lg}1TXo!;Gd8}3VSuZ0f=Nhplex; zq7tHk7QQit99)U~WkL^7pq+4ez?JEz3(z(rurj*sKH0T&*bETB%Ls1XHXm51!b-#& zBi6w9j(*0C(ehZeZGne71@ZesY$%r^#E_!0K+7>5eC*7rN^IZ|H+|zruGXu7HhTn& z&rBBc(D9rFaWojM?bJRC>@0Lj=x;}_C8j&tEIj$F60HNk(NAgPRfa@2Rzo_V@g@%I za+#<|5>gdL8CArukIx}dcn@zRHeZyJZRv$!2e0*5+2VCpuQga_^7xOM;0nVLIhzE4 zo6WkDrU$>VG9#N0$T`t#K5TiiU#86ow%wuKTR4TSfRMdUsM1VL1jT)^-qlEe)tO40 z$rPZnasDI*OpI-cJeb>$6b(oPfp&T2zX0CP1l`hlM7U_4YXpk^4~*4D01@ls8=&(v z4r^`v$4*+5&t*4JMCAZ}3Gx&gr%vxt91s=yR=f)o0r})aU|vqn8GCtpM5jUrZ&5MY z`gRqxX}t4<9WivuRlsgMi~a0egm(*0fLr*y)m&8Sv@Lw+ifN;vJ8vpS2uzz%68#73 zfx5D}@5=(XMPCV3>On9+*jyV$!C}N##Mo_XTPX$0SJsKYT1zy90{;#mmN&bhvX;tV zuz{WMKqMHCf*?KQsABwyAjO(S$95#c-oBz7GyR+gu3s?jeRdE>SnDj@XC_+?EVps~ z!?K1}bj1G3w@Y8GSMsE)9Fs zijN$5)0@h{rP%*_!U?f!Y%smie_P6%?#nEXDDe2_?hIs+-_+!^`+J}tZxurWK`avY zyyr>(V9J8uK_(5=M>8{1sU`pnNE;IeO(tf+nNe@^|mtij6z zag(!hZZiBT#rbY)d#frwTjN_>Su+-1)p!8q_qB_xJ(CUq-c zCE~JGb7BMmLwppF)cb7drOt=1U$ndj^#oO8|3ww=*Kg9HTtPSTK4*I+K$Xy2SilKaEMH-BUW?RrgTB62d^WT~jDW`JmC*#T*L=mf^`pGO4_x8(yp z@%C#IWOGeio=x`gJ4Hb(CubaEtq*eO*#a&~5XZRomGUiUs%7=c>En%X{k|a7#tvM~ zwzk~^qMuoY=(EL6X$WWj&tl|OAojI_Z2Y;C$Tg>CMkV}?;1Y2yScx)#x@>9`B(hM( z=TItXx*vh$4(Y0hmiynZ(c0EBZIJ51DOhK|{hZ+W-fYbVJKC}nm)hsYRXSn{rbqOd zJB>I50x}lIVejC(vegAyy6Fsy=AW;tiE=vVa8u^tS$8@#8NL;9=lNZy+A}%U<&aHc z(bgPikyB!?FhemdQwxX&V-u>15pKecrFVkxE@iI(P~vhK~W zy;=o)*dHno3x~;8PxiYmZrGv!%%qS=649{Ce%I^H60um zGSM4i9{AfH)h+>vnT%^jS{kk&YBz@}-n)E7nAbg_?Nst)SmYWbr71w65d7373qmCb zC-D0gJh4-&Q|ZQ$Gv?Svfq*3CfKJS;;!rI)M|yPLmS_)N*%X&F!rx7x*Z~MsdS5mR zaV%kdSVY)okhz<-(fxZT8+}z1sE>&0kRAyb=_Qo9o+D6?os;h~8lQtg_ z9>PdnTv$G!4ztP~08moxA^c)ABEkoPwS2ay9V?T}quWhC^VB`75LH2E_eZN$12Zq83`oVMpHjRl)>fLk=W&t@N3b$%4mMj*&d>m{4yu=xJjODgOrP zE3*2edTNC9FmLvic4QD+_CTwp4>LUij8&Mxep66Vkq7IyrlDb@BSB3ko~}optgno{ z&H9LywduZm*}q(8(#y#44q|>xXl4e6e=f5g9A>i03>MBR!~&qbpJeA-yKPUue5LW-C)BQtvqK91>U zf`e5#@u`+e_3~B&qE7qUW}8Y59#=Q~ceq0W?fWIWAVdVa<3C}I|B%122JDIPSpc-w zap|s3zn`RV8fYAQ>}dL}dUI@`P8SM)ELphMb!L6eYS~^95$Ul_D%ftm(}7el3&cEZ z@ERp>1ez&keep7m=w|{)=U!bVzNHz3QJmo_3**mRZYQ}{ZiISI9?`Q*_OYy0UP%2w z$IF;9x?MMe#>8M18n(4VEe7Ra?~x&7h_aaSB0P+moGzLz-&*j7ZVX=M3}XQ zDi2v>`A#!1H%RkC(C;8?d7bK??33TS*B*57>-4Kz&>pV5PSxt+M9o{|VoL+n3jGR= z-=IkxckV|q&AT8`qjth--~mVWAChX>$F+>rDbGoqbKT~vnCxm|U&FkwUiNy5y*^Rr zvK=u-ry5mVNhR-G5Z?jpzJf>Pz8C=)_koQ=IOb%cM0Dx(&y-pTkZIF*>`^!Lln1%z zaHRVWA`TAI>vEO2>a=R|=hqwP*V9=N13^v~s;o}PdZ6R)mX~iwmMJ#-UG(>kxe!?M zNq6%eqe>mWsNA7}eH8<3Rxl@)%dvU5h+7p3h(K6-iMV^Q8mb%!5 zR%lu)=MGDbmZ!GQ)}AZ)O+U4aO2rw;ahzZfz4UQVKPeaTfTWsdnjs_NaI@>vmSwEiOt$& zQF(t%JX!XflB-YGkUvm0^@PSs`>DgSp0~j1ovLs|)mJE7T>Xh_%0Jw+jP8~%B3Zvc zrj=Ow7Z)R81RC)iG78pGV8(CblDR?=*Zq(#)#qb(wdjhrPSooSRucPAH(#t8c`;{) zvR>RDJ%rb2*$gLm=LjMy_P!GfPCNivbx+^kf|n%&62!2sdJ<`yQwV9{}ns0 z0k24mzj4$U*NQ1QBVm#dK+L?ulYRqHRJ3=zSvEJq6GPwTmA`!2*+5^^;zI%_bt^+GoO1zuj@6Z?YKyXI!lM^< zM{WA`o+cmD$Ci8-_eXzwrJxCRCcs;hLhoJOsYZe5P%mb!Mv#cqny1(XA}2~ca$mIg z<%}UI-v~0H1Y1HmcOdjI{sE5-GM1iG*XilT4v42n>N{WI5sQo&#h*OAVEsg>GUHS8 zi9`p<#oBjGv{m&yK`sSnVs^7{ax|dIo>4@2Fo_~Qs=%LSIllT4^jKG!o+Liyqc>4cKpR;|T zbHbrx9K}(afm<|lEJqzLM}r|pj{(p^%it=-GQ7%ac&w+FHSkcY(##UfKZ5VcBQX>lWMv?*^v_-57}(qjL>sLREglL zOgAFqUY50I5oQ+Vh+wop(ERe_`T7BTh(u_Qy+2^ z*DR0T1|R$lqO#7QOFO&s8TwBxf>B{&j`IjrRy%zZyP6(EiF`CGD=QmCs_d^#f_NUV z93uEO2ni%=)K*3G6%~S1U;jEaDhGERe5|GQ%Irc;Xe}!Vy3j=+ zDK*~j5;@(ee6M*+#QB5lpCP46D(W?rfNYU{>DQ-5-JN}Tx%l!r2s0u|TKa(zPt@Y% zfuSM5Z1Bdw$N>NB9o}w3uw(64y%GtZtPvwAu6DnfMi^WUSqtjD0O`^f15bF?kT(W( z5>alUDA`Is8LQB?sXwbv`AT_1)jr_q)ZkQ!wqhkMLz}C!zXQu#nH65)x>uS($5|TQ zAJ0mnly=t^iC3H@)(3gj$y4hSflp)?jHs02E*}rwv~%I52-buv8=u zwh3;?6j;X#L;Hs<_J_$s!jY(-Zl`FH@lb8iKY-EGLW`Q5a^cq5Yk!fNjqn~ zaIjV>4 zU6k-rtsxQW35`S6f2*#W-4$j*wP&8$&XatWjwyA3Rz18@Y`+ESz-*X z*Dw4|4C%&i)}9)`UPwaEfL$_$$82=)vk9@JvSgb$Z^f<$x;M+8;|y##oMQ}2|Dlpj zt=W_hr&hlEhkW~A+W-HcTzl>0uRt}p8~lax{x{wI6^#A2aiE={skow|zc&AEF9FK^Rtt^L{4=I(sU)%I$C##LTZlb7+wj~@g0*a(5H^6Ki`j9^wztBJY!gANxr z_fGHTCfW1dxOe-c&nr776VVABTp&z%)n>vkUQ&PX_U#-n=~nA8gN61YA575EN|Gu- zF38T-)fzEg=rFp=i~*B$T$xvEPAiH9Q)QJ*+7}}4$|X%r_ga(2&)mV>L)Wu9_y{ub z*PgHwpE?I5!A5}g>%3*tWlz<} zW8n+~5it1^d>J_Ac+opBy4>OnCf9&(qQcY^EeiSCO2;K+Ws$+eR`3m8`4>kpe|Cm= zc)tUO0Kj`OC9Fb1LSAe7um4^zcBHEb8^YeN_TDR17TWKuB@yqAPviBBzi#x`FJ(#Q z*Q0+R_`gpK-rBwrW%@(t!MJm!2FHTIk9hs79R?aeR`RgjBYb`49}?|9__8^#eA$2P z(*h-ax9fg=-Pe#pXjCc|j2<{1Vov#b(!Yv{-HM(De)8+f_hC_TfEm^QDxP)(2s>P4 zXmk#oGU5izQC`U3hGP5`bT06BEykyUzs#zT)${AY;h0n`MkIVrez3t*l5ao=4qu4l z5D+}+U`pOS;%0z3vW(BqHyyEzQAA$1x|2E$OM~y2`1oX2e0ufnMk&y}#qBOKU+yx& z%)ZZb!r+!j2WbZle1(NdHJTlQZoZt<3$F91++z=#znTA0kaPev|o-3O3D;KWr-ca>r3*jjO{k~Ry`n7NO%sD<* zbl1ZU&x7-b^;Z$o5E0ZvsbqMfCq^cAax|l)T!bVDJRsq8Z&%00nykx^EN$hGe;8MFdUb*;YGlwx!3F=@PMqYzw=k-UD>kOE&uL3~N36QiUzwe>4*(*1#P94!u?xV&WpKxStOvI+Fw6fI0s*?4 z`wM9YrMJlQVM`);_Gfz>^hH+CeZYwSkqFH+yf=R0R^QnHw;M43o%&Y^A@r-x_9WVT z@M7-LfYsh`fK`3Yuj)5;ETCX|fEBvBRgRYnnqY!1sNG0tS7dUboK|p*ch3(>9B0lS zbMInsw7c1?5Cn;d2te!i+fWu;p24UOSo-W%dUZu!M{u*JQC(v`pl!TTj zjqU!nf&}y((Go`OecTtw2X= z@?C5!#3vQfh%&^^?OSaBdpCiGPtZ7l&|i%yKaOa_Xii|JG4Z)1%U4D&3u=0CIraDJ z^=Erb*CMxZFMS-l#~Ua6C{)se764R1W&?d?rt;pkF|zABo+19?$+52Q{9DcoaS^Ct z`0)yzltLxa^6a1rP!ecmKRB!#scbj37KgVrJICb+^q&nilxvTMvi-?rLqr*={L@;I zIN_u{@UjG=QVQWC?cO`|F^h3my3yUP-%>lqHJ7=+Gi2qaItO<`prtp07`fH#`gu0oKw_dxWN{tFsyIADNGDFxf9^|WpVX?9*9Vsm$Q^mb1DGM;ml(ZH|>i}E^=WYYneu6}OQsD~UOVo+D3 zNhNe*7vR$WjkvfHqD+6C6OVaA%#K=*k(HD*_ua65i9CoSxX%~9RLop3ag=RZ#jzDX zd*OyjCviem5x6T@Hy@*caFV1TWU$&f3ar=0s)zTZkBa%{Wm5U<}tp!t#5tY!2d#s4uwWt*b& zg)?{_B{O5cTzJ8u+1Z1L;78kWnotSSZ5bbh{eGxt`U;Bcp4utu&Fmqmq#|`LNgpbH z`&fS{+e@KM-ilU|o<6rUe8`D`kWYawp1dHoiVB?$fP1Nh4qK$0aHU3S*SmXLRcPBb z2VdNPau83`^NqLX=rTWt*x8SZ3Hkx4k3^1|NN~N*8!|?LJ@iU}n-GE%-FK4o4Z7Pr zc&FF@pT@pAF3P5Bc#)eBMY>Dmrn?0Mq)U+Q5Gko8mQEF=L#0_lq`PrxC6-)58WxsZ znw64R;#>57zUOv+0!hJzh+1id9w1>(9dW#`bH>3d8#4+=_jR+%v>h z_y&Ghh7=DX*JsCcjd|9#V7UTH$KDfh(TC{*HY4`uZaAaBln(amjB%arlYP@^W)QR1={?weh}163iXO%?oJkZw6w?E z;$6_Ul``sELEG$It7`Blpo2Ip?&X#E^yih_F3wm)>n~|LeF`n#CyH_d{toF`Lg^ll zOTL|FpXxB{$^+v=RzHCUYvD8DIzc~IVqMzipm9dZf|FzT9o|*fm5YXWU9UNIDptG| zrMD|q(0cayed%B0l&Oo@wEZD3rmFL}nrJLOJ^2ewT$H%s7wUU&e;zSB_pH<0=yhf} zkFA{p3-16GfwGT1pFI^7?C;=yyWahA zUQFlK>SO6yauINMDYj8i+a2$P)#~*4&S}lKiuJISa?7{pZ!Phk5mY{J&Em`HtiYCJ zrXo@0uasL|0M<`ZeEB>a%h|NL->(As!Ek^(P0v(P1lY-};(e7;r@CKLT&+4RJbkp2 zq>WpY=h%Jiw9rT+a9mAlW~=xHAQQ^PWftfsQu z+q2OgGonF4vvHpw1@fCK)_#G-{d18D8WhIOMIrX`B@9IBU%F3ObX5IxULvcZri~4v(WBraGboYgsPAac& z;|59ELezsn0fKRY%oWeilYGOY^VM>c5m_*ZgKse6kz&{R)dViNd0UJ|I9oT6Bnw^W zT+B#TYqBzMzoKuatJsxv`neV9V8?3YHt|y%0uxcVZUa9s)W@ z40w`N`g*TO|3V>W!i~BF^yGJa`gZuH_*?ymZ5rh=BNLSh$fH9jml-ux-3fBm3xOS(!dh#2jR}s7J88r%nDoL%~UhJ z$CSK7?S2|V=`h;Gm)?|l^Ar*N|~GWTNx zkG@PEwJ_P*t)AA$|4x<@svX#KE?FD!%%$i9H;Dbge%snWAtsH%uG@EuG6tKk_W3(W zG=>q*_!ZL=;hlxn#~_2o2tRM%-j$5u3gX0 zjd>rZnr`yk>sYm*b{|kA`XoLqcsDRu&<9Sue)5Qpa{66ks-0x`r>iQv_ID813OW#B zgId_*_LEj;V<$h-NgAq5RH*Z(h^@8dY@>P6+1beTms0TY7E3LG5a!}xo}??+rjOn2 ztxIsD+Q*Xb=)s3Q?G%HuGi=Lpab@uJD;Hm&8<9`{7xGZ_Wb;U=hW88;Pki7F`9wQC zZi>4&yY@sfIdz3_&dxxOlTLz zVI~<^MeyT14*9#2DFnvhRSy>}qN*>^!k!@gzBus*qD{1+8^j-9(g;1HG>LBWDS!NfXacODynWne0o99QL)qz3(+QS4pM1PWG7d7S^|H4&lR`3?0xb3 zf)#T)nZv{3m1mW$<-#1TQ*j^JOp3kur&SUUXB zl}__P3e;0*s()YWOHmD$HA$s)o-0&Ml?c^5{44R<|BqdEK++8w{e(KLD7jm5?m#iYIw^P>W1?##SPsquh6wpvcgPff?16qg$& zr3GnZenOsC+^z6L_AL)E(#8{58(X~xNhea%q<{N78yiEhu-Pby91fR&>To%<*y_w% zB8O5q9ufBKPN#$%%`;F(j5hn*7##PLGH22b(Od0G z>KabVW3fS6XXwaR(-dD%>H^8a|l)^VzF+We7+Ei?K@r)Co_-VR!Tl`t&=YF2#7#RVABY!pk5B7?x5$4T#*8KACsf6Y!m2w4FpD{DgQ*)Z+O;d?F7RhNh^U!g8|5u-I zG->5(^wbHKzLwF}l(7E%AhjOGFx=l9Y;<4iz}R5r6S%#sk~x2K&chf5&Qwr6yrjyR zAw6?(hk5sJlg?W+DNNRUF*(vPq?92R@?GHMVPuDCVO&rjt8w6Phq`P1SbpPF|KfN6;xh9Nt&%7~!A&CA)y|nw zNdAKI%?eRSavJ_MK5HzGe9REjXVTnnQM3bZ%0*$fzlEUok)xj)&nw*9UZkEnAVsMd zd8=!8TY|GKO3iTJdhCZ7Tsy$Kku+8+d0b+Yrp)%>mgi{N_?@_SnTthl#dprKNpYZy zm%c0LIqOLp52~?1>1@ok23W0JUpJoo4L)c%$r-fmhRFy67q|VBcpYy{xPiaGZgdCr z7i6m-SINry_Yzayo5I0M9}CQSG@V!F3N$^bWfk@UUM@P>+2?b+?m1Nq&s2^Kf%<8= z8!ptq^s7kjlS$hi+(0_iPMIBgm{c= zjRS4X+a@bePk*B6#^ChB2-WuaZk?xhe$$4#rh#%jTh+|`(FH$peoIfp+9X|zM)qtx zkKOrvQFtm8)<}=2d{5@U`SmpY5ik4V_`TIaZgidf&gx{Sd2#)kL^SOxHyEb!oea6z zu+Zyv9?N<3F>xh%Gt7CFP0-+0|QoT8xHcLJ=H~67xA%K@Y#9zjSj{@Q)qF9 z${%%6^C!^U#hU?H{oEOx`IBEC?RRic4^W&&K`WH!G&+Jlj_H;NGeoG6m-Dz|GLY9` zx7A$29_gs%6L%7+HW)?A%F8wJauxNt;8ZAYgNnQ8bjM91_!%mnf>VUgXw`6c?1w>* zI$UQOFnD)K#q`26`;NVf{{>)TmVwEc+y3a|Ty>aLtLF7Mh~i_~G^l;#6CKfr3DfFM znCZY%W^*2`F2S^XN|hyEUD8vU|uWbgGjm+sLcxQ{%UCI{^(7& zEw;GYuymj6U)_WrM}wgrm#HLx)KK>6EwZ_c^Gf*@F~{AQmSnvv*ivXP&XV%=6)KcW zyqgdJz|>cO0{~Cq#Q$9c0B%7Z*Z=^g2C?{m6o0}9euMv4#DBR0sxp^f*A+^ zJOuua;ve+?p!{DA0e+)n0bXNBMAH4H7!LW5BBp`=V*TIY)3 zbNR=|UOPE3ROmj>tx^uEA)I`ChKLh_SP}arcLywt9C3Iuo;H?6SXfvC!^4K^>I0D? z{)cPx1Vls;bkw3w6Rrz{5mp+<&YOXm1UB+ zyhDDmMh-KrS2p9?_Ntk081%Kgc$PkH&s|kHxIS_Mw4{uryKP3<7M_%vn($hxk#Dk+ zC>7>gY8fP~Au($*VBTULRg+sAC?Ud`r;L!a!2dMNW{|o!-LEm60ir0OWnhc!6) zHV2qsnD}jjNbm=7ul${6SyX%R^Jy7QuvIiyJA>l0$1M}Hle|TBdRbXv=cmKYBl1iV zNb<50@XWv1UzLZ`FAy`EX=gZ9CV(pq4GLwL&7PK)@_|48sBn88n%_A@p{}JqMu$To zIV^ty?|Em7kd?T5K{C2^l>B462Xcq^vZ_Ai<=i(!Rp~mS(Uc6!pZZ7XKnjDDCDt$*~rR_EIDlR)ScO>@dj!TKbEOa{QQ&M^I zY(c4G^AC^&A&Q&X^Uai7|7d41@i~sBZs)uKbmLz(gA!Uy8kwxx9!2R4%$p1ZaO*ji z#E1rFcC@x#iLjhPBr~-dm|#<0vivM>*|>m)N%HiTwJQ0q-1Leny}y^>+;pF!L;}INtO^(+h*xF@>R>OPP$~! za%raWu2&|fj&7Rfb^p4PbXJw4kJ~vv*N%UEmwyj_A;)ZRw$avxQUG+nZ0#`S!dWvz z-i0}O1YSbqthG6GkWh~~e-ejWF5AbYfX=Qvn=dLIWr8bd3vm3ofA)B0p`@QpUU?(z zvWymxuV(jj2A%}T8O4qC&Uz@bs#({bv+so2NRgwex!HQ}3m+Xd6%(c6^hEfDNUAJ9#FX>!)xn&0oU08@5RabT7JmhQsp zA^vg&O+&Z{`LVg7f1CO(eeS<58=OvkR*z0}p21$;Dkm(N^4g|=SYe=!+|Uu!;Tx~5kZuD24D*D9B!LfP3A2X+!dsk z<%peuNJ&ss4vC6zy<~?fj=%q0qjyZB%VK#2ieX}_N<#$Eo9oXCldkbTdFRPCYa64g zYp9cZ2pj1*y*e6nnhbiZVB^B9F8hN@yr`ZRieF)u-2Cj{W-8>Hjs;VcZbJ@AX02?M z`zTx0Bj)(G`Yt%m&z_XLiw)Yl_$*HmNRZTobPb-d{p(Gg0iJHaa1#xKpuzZ;&UJ@u z5M~1rieavlnng9mps}oCg%xL}Q`BuidELHhyt6;gj;=)>Z$5LXSLzcZo7s{`TkH8} z+BxS61%>ZbOpK9Wz4;6NogW`hq7M(o67SLsAWq(Jas4WO2#Q<0u2##curqzp4a-5u zPNP+IQ`=`7w3!{-8|QrG%*qEE|>ZeFXMFgYcC(Pg5Q^XUqwX>}b+ds|H+r(R#3BbQ%?@j0rs zu!-cs`*yFV6~isZf}xK_aZgc~y&FU;xPJni8=8Ar8xI_9JnQ9yb_p`6tBk}9H;3#j z)zTnXzoV?U7Gb8z<$&L#R#+ss3A90qiL=~&<7h>rAy}AU9W$wdmFN`#2QMLKc7ze% z&I&r%rz$PVl9I@KdU_TPMPEb4e-HoItI(k0#p8Lz^)E4gYCJ!_eUaaB#kX5Bx1HrG ziAQ2u+AEylvx8L%GO{iPhJWCT9-y|Bm6!XQ|BNRiQQ(V{XvTx!! z{zOGuf;OQ8Sj@GVS6Fg60~6NVY@Uo{;oi!@Nc*25p*h6;jhikeZd$%PKkA0LTLuP7 zA&LQj`)|*`0X&3bPrHa@k8kWeA_)MmbEalz)!_Fxu6C?$nwg#O=>dR{On(FhbY#&M za1!1jat9Ca+6=*O*&Z~@vX7RQ0S?`9b#`WP0syG766RtfAx+nCx(7N~0C#6Z@M%^r z9F-6W5p>9Y*dxvl0Eq8wZvHGrUy_iCf0ew!1-$+k6dzagM9N9A7dGM_06BM{ue}3s z=ZJ=QlwIw)h1O{aF%F%J2akc+Ay`;|aIzzVNEllF`9fqY9q8tAL$<;uHYgEs6(OY} z4`?QBQFw#W{04H{2)k;oG;eyjfERG6>;gAulE8#vb=mVbpoHgl083gQeGXQXB(k&; z5@=VTaVtAomzc1di4+lfbHyNt4dO^+|FLjaI6UI*Irg^JPi#i&R;jkO^zfC9u=BbS zlmpnmZ;R>XtT(a^^*4~(CRR`xE&#_$qmM)emL|?l&lM&SWphPXXB>|;5^gtZ&W_W%HR$^vj2o9M|4 z!4@dDkWlT-jhFYWSqDqY$}pd*9zUTXArV~LZ$ZhVx`$!!%NV((7B2rh>UnZLPT|&e zLb?AIlcBD8XtG1&DAUSFGee~0Moh@M^DlqtUo$qoyuXzP4cSWHczV+CEGVe8HRQAf z@kfnE7`GWoK0Z7+VE$bVN#b#|nU^rYEh3WiTcv3#-7x7>xWaGU4_#qiIjH_k|LGs? z!=-_Du(9!0!pWj(FjhcvdK^vYJ^w=)bOYJCa$UN>Y|;L^3UPD&FBC~&xmB8D{ZP3{ z-5Lcsxoz9Q*=ho4@7A+8Ih2EVGaZA*{WhWb2v%BtE46x7tB22IV(-dNjU z{F{*(vv|$;NLreqt9u}s8!zNUo`@f-E7@eJGBQ5iXBIRfEuN3bL>U3sw!&jO%C$F= z#-tqNTNaZDf@2*2o8}OTaEBGx+11rFb_W3XikZ}KNdNqXol;#burP^ea$oMmNyYe` zbsu3w7wB}s7x4i-SrxKQ3UvRru(6HF+Cv}GeuhT3bO$x_n^V!!ZVMUR@P&niS^OGR nAlkzCUQK()bh%014Ib0-bg Date: Mon, 22 Aug 2022 14:05:26 +0200 Subject: [PATCH 041/304] add first Cucumber feature test for login --- e2e-tests/cypress/tests/cypress.config.js | 15 -- .../cypress/e2e/User.Authentication.feature | 17 ++ ...s_displayed_with_the_username _{string}.ts | 10 + ...bmits_the_credentials_{string}_{string}.ts | 9 + .../tests/cypress/e2e/models/LoginPage.js | 21 -- .../tests/cypress/e2e/models/LoginPage.ts | 30 +++ .../tests/cypress/e2e/models/OverviewPage.ts | 10 + .../the_browser_navigates_to_page_{string}.ts | 5 + e2e-tests/cypress/tests/yarn.lock | 255 +++++++++++++----- frontend/src/components/Menu/Navbar.vue | 7 +- 10 files changed, 278 insertions(+), 101 deletions(-) delete mode 100644 e2e-tests/cypress/tests/cypress.config.js create mode 100644 e2e-tests/cypress/tests/cypress/e2e/User.Authentication.feature create mode 100644 e2e-tests/cypress/tests/cypress/e2e/User.Authentication/the_user_is_logged_in_with_username_overview_page_is_displayed_with_the_username _{string}.ts create mode 100644 e2e-tests/cypress/tests/cypress/e2e/User.Authentication/the_user_submits_the_credentials_{string}_{string}.ts delete mode 100644 e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.js create mode 100644 e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.ts create mode 100644 e2e-tests/cypress/tests/cypress/e2e/models/OverviewPage.ts create mode 100644 e2e-tests/cypress/tests/cypress/support/step_definitions/the_browser_navigates_to_page_{string}.ts diff --git a/e2e-tests/cypress/tests/cypress.config.js b/e2e-tests/cypress/tests/cypress.config.js deleted file mode 100644 index 00f1ece46..000000000 --- a/e2e-tests/cypress/tests/cypress.config.js +++ /dev/null @@ -1,15 +0,0 @@ -const { defineConfig } = require('cypress') - -module.exports = defineConfig({ - e2e: { - baseUrl: 'http://localhost:3000', - chromeWebSecurity: false, - supportFile: false, - viewportHeight: 720, - viewportWidth: 1280, - retries: { - runMode: 2, - openMode: 0 - } - } -}) diff --git a/e2e-tests/cypress/tests/cypress/e2e/User.Authentication.feature b/e2e-tests/cypress/tests/cypress/e2e/User.Authentication.feature new file mode 100644 index 000000000..3f5129f1f --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/e2e/User.Authentication.feature @@ -0,0 +1,17 @@ +Feature: User authentication + As a user + I want to be able to sign in - only with valid credentials + In order to be able to posts and do other contributions as myself + Furthermore I want to be able to stay logged in and logout again + +# Background: +# Given the following "users" are in the database: +# | email | password | name | +# | bibi@bloxberg.de | Aa12345_ | Bibi Bloxberg | + + Scenario: Log in successfully + Given the browser navigates to page "/login" + When the user submits the credentials "bibi@bloxberg.de" "Aa12345_" + Then the user is logged in with username "Bibi Bloxberg" + + \ No newline at end of file diff --git a/e2e-tests/cypress/tests/cypress/e2e/User.Authentication/the_user_is_logged_in_with_username_overview_page_is_displayed_with_the_username _{string}.ts b/e2e-tests/cypress/tests/cypress/e2e/User.Authentication/the_user_is_logged_in_with_username_overview_page_is_displayed_with_the_username _{string}.ts new file mode 100644 index 000000000..d37236335 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/e2e/User.Authentication/the_user_is_logged_in_with_username_overview_page_is_displayed_with_the_username _{string}.ts @@ -0,0 +1,10 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; +import { OverviewPage } from "../models/OverviewPage"; + +Then("the user is logged in with username {string}", (username: string) => { + const overviewPage = new OverviewPage(); + cy.url().should('include', '/overview') + cy.get(overviewPage.navbarNameSelector).should('contain', username); +}); + + diff --git a/e2e-tests/cypress/tests/cypress/e2e/User.Authentication/the_user_submits_the_credentials_{string}_{string}.ts b/e2e-tests/cypress/tests/cypress/e2e/User.Authentication/the_user_submits_the_credentials_{string}_{string}.ts new file mode 100644 index 000000000..94a8f7593 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/e2e/User.Authentication/the_user_submits_the_credentials_{string}_{string}.ts @@ -0,0 +1,9 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; +import { LoginPage } from "../models/LoginPage"; + +When("the user submits the credentials {string} {string}", (email: string, password: string) => { + const loginPage = new LoginPage; + loginPage.enterEmail(email); + loginPage.enterPassword(password); + loginPage.submitLogin(); +}); \ No newline at end of file diff --git a/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.js b/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.js deleted file mode 100644 index 38933942f..000000000 --- a/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.js +++ /dev/null @@ -1,21 +0,0 @@ -class LoginPage { - goto() { - cy.visit('/') - } - - enterEmail(email) { - cy.get('[id=Email-input-field]').clear().type(email) - return this - } - - enterPassword(password) { - cy.get('[id=Password-input-field]').clear().type(password) - return this - } - - submitLogin() { - cy.get('[type=submit]').click() - } -} - -export default LoginPage diff --git a/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.ts b/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.ts new file mode 100644 index 000000000..065646543 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.ts @@ -0,0 +1,30 @@ +/// + +export class LoginPage { + // selectors + emailInputSelector = '[id=Email-input-field]'; + passwordInputSelector = '[id=Passwort-input-field]'; + submitBtnSelector = '[type=submit]'; + emailHintSelector = '[id=vee_Email]'; + passwordHintSelector = '[id=vee_Passwort]'; + + goto() { + cy.visit('/'); + return this; + } + + enterEmail(email: string) { + cy.get(this.emailInputSelector).clear().type(email); + return this; + } + + enterPassword(password: string) { + cy.get(this.passwordInputSelector).clear().type(password); + return this; + } + + submitLogin() { + cy.get(this.submitBtnSelector).click(); + return this; + } +} diff --git a/e2e-tests/cypress/tests/cypress/e2e/models/OverviewPage.ts b/e2e-tests/cypress/tests/cypress/e2e/models/OverviewPage.ts new file mode 100644 index 000000000..85dc97083 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/e2e/models/OverviewPage.ts @@ -0,0 +1,10 @@ +/// + +export class OverviewPage { + navbarNameSelector = '[data-test="navbar-item-username"]'; + + goto() { + cy.visit('/overview'); + return this; + } +} \ No newline at end of file diff --git a/e2e-tests/cypress/tests/cypress/support/step_definitions/the_browser_navigates_to_page_{string}.ts b/e2e-tests/cypress/tests/cypress/support/step_definitions/the_browser_navigates_to_page_{string}.ts new file mode 100644 index 000000000..19973a9c2 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/support/step_definitions/the_browser_navigates_to_page_{string}.ts @@ -0,0 +1,5 @@ +import { Given } from "@badeball/cypress-cucumber-preprocessor"; + +Given("the browser navigates to page {string}", (page: string) => { + cy.visit(page); +}); \ No newline at end of file diff --git a/e2e-tests/cypress/tests/yarn.lock b/e2e-tests/cypress/tests/yarn.lock index a21ad455f..b84e43c24 100644 --- a/e2e-tests/cypress/tests/yarn.lock +++ b/e2e-tests/cypress/tests/yarn.lock @@ -44,9 +44,9 @@ semver "^6.3.0" "@babel/generator@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.10.tgz#794f328bfabdcbaf0ebf9bf91b5b57b61fa77a2a" - integrity sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA== + version "7.18.12" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.12.tgz#fa58daa303757bd6f5e4bbca91b342040463d9f4" + integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg== dependencies: "@babel/types" "^7.18.10" "@jridgewell/gen-mapping" "^0.3.2" @@ -235,13 +235,13 @@ integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== "@babel/helper-wrap-function@^7.18.9": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.10.tgz#a7fcd3ab9b1be4c9b52cf7d7fdc1e88c2ce93396" - integrity sha512-95NLBP59VWdfK2lyLKe6eTMq9xg+yWKzxzxbJ1wcYNi1Auz200+83fMDADjRxBvc2QQor5zja2yTQzXGhk2GtQ== + version "7.18.11" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz#bff23ace436e3f6aefb61f85ffae2291c80ed1fb" + integrity sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w== dependencies: "@babel/helper-function-name" "^7.18.9" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.18.10" + "@babel/traverse" "^7.18.11" "@babel/types" "^7.18.10" "@babel/helpers@^7.18.9": @@ -262,10 +262,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.18.10", "@babel/parser@^7.18.8": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.10.tgz#94b5f8522356e69e8277276adf67ed280c90ecc1" - integrity sha512-TYk3OA0HKL6qNryUayb5UUEhM/rkOQozIBEA5ITXh5DWrSp0TlUQXMyZmnWxG/DizSWBeeQ0Zbc5z8UGaaqoeg== +"@babel/parser@^7.18.10", "@babel/parser@^7.18.11", "@babel/parser@^7.18.8": + version "7.18.11" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9" + integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -941,10 +941,10 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.10.tgz#37ad97d1cb00efa869b91dd5d1950f8a6cf0cb08" - integrity sha512-J7ycxg0/K9XCtLyHf0cz2DqDihonJeIo+z+HEdRe9YuT8TY4A66i+Ab2/xZCEW7Ro60bPCBBfqqboHSamoV3+g== +"@babel/traverse@^7.18.10", "@babel/traverse@^7.18.11", "@babel/traverse@^7.18.9": + version "7.18.11" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.11.tgz#3d51f2afbd83ecf9912bcbb5c4d94e3d2ddaa16f" + integrity sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ== dependencies: "@babel/code-frame" "^7.18.6" "@babel/generator" "^7.18.10" @@ -952,7 +952,7 @@ "@babel/helper-function-name" "^7.18.9" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.10" + "@babel/parser" "^7.18.11" "@babel/types" "^7.18.10" debug "^4.1.0" globals "^11.1.0" @@ -967,21 +967,21 @@ to-fast-properties "^2.0.0" "@badeball/cypress-configuration@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@badeball/cypress-configuration/-/cypress-configuration-4.0.0.tgz#c13eaf2ff344be15a64b75b97b02a6c8e916060a" - integrity sha512-NFQRmXJ4EG/34dI+3QfdcscFz+nvgXEGeXwK6UhX/1HahIrMDbzov1xJradCCyTu4ZwILbXpZfUocS64nVHTQQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/@badeball/cypress-configuration/-/cypress-configuration-4.2.0.tgz#4c19bada0e40600b572b4d91933e0bd226cb2e3f" + integrity sha512-8Dc6diBW8zUycpCFbr7vqQ8ioNZMvpHV79KGdHVpwpRtkFX6enwG82CKU9DeWys6Ou5dFpXw6NYNYNb46y7UYA== dependencies: "@babel/parser" "^7.18.8" debug "^4.3.2" - esbuild "^0.11.12" + esbuild "^0.14.23" glob "^7.1.6" minimatch "^3.0.4" node-hook "^1.0.0" "@badeball/cypress-cucumber-preprocessor@^12.0.0": - version "12.0.0" - resolved "https://registry.yarnpkg.com/@badeball/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-12.0.0.tgz#e21d798d33ce0d247473fa3fc5ca6a3570f331a3" - integrity sha512-JQxs8oaorgIhUdVo6iQQO7FGe+wmrzrPOyW7Y07lAiGaLLKB7icHHOvEWtjO2PAz3jGZeQMmnk+vHxPmFRyBAQ== + version "12.1.0" + resolved "https://registry.yarnpkg.com/@badeball/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-12.1.0.tgz#19be05b0fd7e70521436f164aff04e40e45cf20c" + integrity sha512-8yAlQpqpzODOW/G0k0/GUzGmNyixF+0GzhCmki3mK5zGlVIx1uYYMqOsUcMvAdYCiEbE0svBcGQ+VVSrgDksrQ== dependencies: "@badeball/cypress-configuration" "^4.0.0" "@cucumber/cucumber-expressions" "^16.0.0" @@ -1100,6 +1100,11 @@ debug "^3.1.0" lodash.once "^4.1.1" +"@esbuild/linux-loong64@0.14.54": + version "0.14.54" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" + integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== + "@eslint/eslintrc@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" @@ -1167,9 +1172,9 @@ integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@^0.3.9": - version "0.3.14" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== + version "0.3.15" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" + integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -1196,14 +1201,14 @@ fastq "^1.6.0" "@types/node@*": - version "18.6.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.6.3.tgz#4e4a95b6fe44014563ceb514b2598b3e623d1c98" - integrity sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg== + version "18.7.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.9.tgz#180bfc495c91dc62573967edf047e15dbdce1491" + integrity sha512-0N5Y1XAdcl865nDdjbO0m3T6FdmQ4ijE89/urOHLREyTXbpMWbSafx9y7XIsgWGtwUP2iYTinLyyW3FatAxBLQ== "@types/node@^14.14.31": - version "14.18.23" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.23.tgz#70f5f20b0b1b38f696848c1d3647bb95694e615e" - integrity sha512-MhbCWN18R4GhO8ewQWAFK4TGQdBpXWByukz7cWyJmXhvRuCIaM/oWytGPqVmDzgEnnaIc9ss6HbU5mUi+vyZPA== + version "14.18.25" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.25.tgz#57c72455af0a658da5b59aa062b2f89e73df0a61" + integrity sha512-9pLfceRSrKIsv/MISN6RoFWTIzka36Uk2Uuf5a8cHyDYhEgl5Hm5dXoe621KULeBjt+cFsY18mILsWWtJeG80w== "@types/parse-json@^4.0.0": version "4.0.0" @@ -1767,9 +1772,9 @@ callsites@^3.0.0: integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== caniuse-lite@^1.0.30001370: - version "1.0.30001373" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz#2dc3bc3bfcb5d5a929bec11300883040d7b4b4be" - integrity sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ== + version "1.0.30001381" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001381.tgz#e62955310e6e69cdf4b40bc5bc0895aa24bc4b8b" + integrity sha512-fEnkDOKpvp6qc+olg7+NzE1SqyfiyKf4uci7fAU38M3zxs0YOyKOxW/nMZ2l9sJbt7KZHcDIxUnbI0Iime7V4w== caseless@~0.12.0: version "0.12.0" @@ -2058,9 +2063,9 @@ crypto-browserify@^3.0.0: randomfill "^1.0.3" cypress@^10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.4.0.tgz#bb5b3b6588ad49eff172fecf5778cc0da2980e4e" - integrity sha512-OM7F8MRE01SHQRVVzunid1ZK1m90XTxYnl+7uZfIrB4CYqUDCrZEeSyCXzIbsS6qcaijVCAhqDL60SxG8N6hew== + version "10.6.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.6.0.tgz#13f46867febf2c3715874ed5dce9c2e946b175fe" + integrity sha512-6sOpHjostp8gcLO34p6r/Ci342lBs8S5z9/eb3ZCQ22w2cIhMWGUoGKkosabPBfKcvRS9BE4UxybBtlIs8gTQA== dependencies: "@cypress/request" "^2.88.10" "@cypress/xvfb" "^1.2.4" @@ -2118,9 +2123,9 @@ dashdash@^1.12.0: assert-plus "^1.0.0" dayjs@^1.10.4: - version "1.11.4" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.4.tgz#3b3c10ca378140d8917e06ebc13a4922af4f433e" - integrity sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g== + version "1.11.5" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.5.tgz#00e8cc627f231f9499c19b38af49f56dc0ac5e93" + integrity sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA== debug@^3.1.0: version "3.2.7" @@ -2230,9 +2235,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.4.202: - version "1.4.210" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.210.tgz#12611fe874b833a3bf3671438b5893aba7858980" - integrity sha512-kSiX4tuyZijV7Cz0MWVmGT8K2siqaOA4Z66K5dCttPPRh0HicOcOAEj1KlC8O8J1aOS/1M8rGofOzksLKaHWcQ== + version "1.4.225" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.225.tgz#3e27bdd157cbaf19768141f2e0f0f45071e52338" + integrity sha512-ICHvGaCIQR3P88uK8aRtx8gmejbVJyC6bB4LEC3anzBrIzdzC7aiZHY4iFfXhN4st6I7lMO0x4sgBHf/7kBvRw== elliptic@^6.5.3: version "6.5.4" @@ -2311,10 +2316,132 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -esbuild@^0.11.12: - version "0.11.23" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.11.23.tgz#c42534f632e165120671d64db67883634333b4b8" - integrity sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q== +esbuild-android-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" + integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== + +esbuild-android-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" + integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== + +esbuild-darwin-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" + integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== + +esbuild-darwin-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" + integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== + +esbuild-freebsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" + integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== + +esbuild-freebsd-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" + integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== + +esbuild-linux-32@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" + integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== + +esbuild-linux-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" + integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== + +esbuild-linux-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" + integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== + +esbuild-linux-arm@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" + integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== + +esbuild-linux-mips64le@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" + integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== + +esbuild-linux-ppc64le@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" + integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== + +esbuild-linux-riscv64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" + integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== + +esbuild-linux-s390x@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" + integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== + +esbuild-netbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" + integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== + +esbuild-openbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" + integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== + +esbuild-sunos-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" + integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== + +esbuild-windows-32@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" + integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== + +esbuild-windows-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" + integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== + +esbuild-windows-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" + integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== + +esbuild@^0.14.23: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" + integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== + optionalDependencies: + "@esbuild/linux-loong64" "0.14.54" + esbuild-android-64 "0.14.54" + esbuild-android-arm64 "0.14.54" + esbuild-darwin-64 "0.14.54" + esbuild-darwin-arm64 "0.14.54" + esbuild-freebsd-64 "0.14.54" + esbuild-freebsd-arm64 "0.14.54" + esbuild-linux-32 "0.14.54" + esbuild-linux-64 "0.14.54" + esbuild-linux-arm "0.14.54" + esbuild-linux-arm64 "0.14.54" + esbuild-linux-mips64le "0.14.54" + esbuild-linux-ppc64le "0.14.54" + esbuild-linux-riscv64 "0.14.54" + esbuild-linux-s390x "0.14.54" + esbuild-netbsd-64 "0.14.54" + esbuild-openbsd-64 "0.14.54" + esbuild-sunos-64 "0.14.54" + esbuild-windows-32 "0.14.54" + esbuild-windows-64 "0.14.54" + esbuild-windows-arm64 "0.14.54" escalade@^3.1.1: version "3.1.1" @@ -2357,9 +2484,9 @@ eslint-visitor-keys@^3.3.0: integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== eslint@^8.19.0: - version "8.21.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.21.0.tgz#1940a68d7e0573cef6f50037addee295ff9be9ef" - integrity sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA== + version "8.22.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.22.0.tgz#78fcb044196dfa7eef30a9d65944f6f980402c48" + integrity sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA== dependencies: "@eslint/eslintrc" "^1.3.0" "@humanwhocodes/config-array" "^0.10.4" @@ -2588,9 +2715,9 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.1.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" - integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== for-each@^0.3.3: version "0.3.3" @@ -2795,7 +2922,7 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== @@ -3005,9 +3132,9 @@ is-ci@^3.0.0: ci-info "^3.2.0" is-core-module@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + version "2.10.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== dependencies: has "^1.0.3" @@ -3497,13 +3624,13 @@ object-keys@^1.1.1: integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" object-keys "^1.1.1" once@^1.3.0, once@^1.3.1, once@^1.4.0: diff --git a/frontend/src/components/Menu/Navbar.vue b/frontend/src/components/Menu/Navbar.vue index ef222fdb4..9ea6e8d3e 100644 --- a/frontend/src/components/Menu/Navbar.vue +++ b/frontend/src/components/Menu/Navbar.vue @@ -14,7 +14,12 @@

- + {{ $store.state.firstName }} {{ $store.state.lastName }} {{ $store.state.email }} From 791091503db9390d44273146da0e30e7bd0e4385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 23 Aug 2022 01:32:40 +0200 Subject: [PATCH 042/304] describe capturing alias during register and login --- .../BusinessRequirements/UC_Set_UserAlias.md | 76 ++++++++++++++++-- .../graphics/GradidoÜbersichtMaske.bmpr | Bin 705536 -> 868352 bytes .../image/LoginProfileEditAlias.png | Bin 0 -> 102990 bytes .../image/LoginProfileEditEmail.png | Bin 0 -> 102170 bytes .../image/LoginProfileWithAlias.png | Bin 0 -> 98207 bytes .../image/LoginWithAlias.png | Bin 0 -> 47524 bytes 6 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 docu/Concepts/BusinessRequirements/image/LoginProfileEditAlias.png create mode 100644 docu/Concepts/BusinessRequirements/image/LoginProfileEditEmail.png create mode 100644 docu/Concepts/BusinessRequirements/image/LoginProfileWithAlias.png create mode 100644 docu/Concepts/BusinessRequirements/image/LoginWithAlias.png diff --git a/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md b/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md index d705928c8..e6a95a19c 100644 --- a/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md +++ b/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md @@ -35,7 +35,7 @@ Der Alias eines Users ist als rein fachlicher Key ausgelegt, der frei vom User d - mindestens 5 Zeichen * alphanumerisch * keine Umlaute - * nach folgender Regel erlaubt (RegEx: [a-z0-9]-|_[a-z0-9]) + * nach folgender Regel erlaubt (RegEx: [a-zA-Z0-9]-|_[a-zA-Z0-9]) - Blacklist für Schlüsselworte, die frei definiert werden können - vordefinierte/reservierte System relevante Namen dürfen maximal aus 4 Zeichen bestehen @@ -45,21 +45,83 @@ Die Email eines Users als fachlicher Key bleibt zwar weiterhin bestehen, doch wi Die Email wird weiterhin für einen Kommunikationskanal ausserhalb der Gradido-Anwendung mit dem User benötigt. Es soll aber zukünftig möglich sein, dass ein User ggf. mehrere Email-Adressen für unterschiedliche fachliche Kommunikationskanäle angeben kann. - ## Erfassung des Alias -Die Erfassung des Alias erfolgt als zusätzliche Eingabe direkt bei der Registrierung eines neuen Users oder als weiterer Schritt direkt nach dem Login per Email. +Die Erfassung des Alias erfolgt als zusätzliche Eingabe direkt bei der Registrierung eines neuen Users oder als weiterer Schritt direkt nach dem Login. ### Registrierung -In der Eingabemaske der Registrierung wird nun zusätzlich das Feld *Alias* angezeigt, das der User als Pflichtfeld ausfüllen muss. +In der Eingabemaske der Registrierung wird nun zusätzlich das Feld *Alias* angezeigt, das der User als Pflichtfeld ausfüllen muss. ![img](./image/RegisterWithAlias.png) Mit dem Button "Eindeutigkeit prüfen" wird dem User die Möglichkeit gegeben vorab die Eindeutigkeit seiner *Alias*-Eingabe zu verifizieren, bevor der Dialog über den Registrierungs-Button geschlossen wird. Denn es muss sichergestellt sein, dass noch kein existierender User der Community genau diesen *Alias* evtl. schon verwendet. -Wird diese Prüfung vom User nicht ausgeführt bevor er den Dialog mit dem Registrierungs-Button abschließt, so erfolgt diese Eindeutigkeitsprüfung als erster Schritt bevor die Eingaben als neuer User angelegt werden. +Wird diese Prüfung vom User nicht ausgeführt bevor er den Dialog mit dem Registrierungs-Button abschließt, so erfolgt diese Eindeutigkeitsprüfung als erster Schritt bevor die Eingaben als neuer User geprüft und angelegt werden. -Wird bei der Eindeutigkeitsprüfung des *Alias* festgestellt, dass es schon einen exitierenden User mit dem gleichen *Alias* gibt, dann wird wieder zurück in den Registrierungsdialog gesprungen, damit der User seine *Alias*-Eingabe korrigieren kann. Das *Alias*-Feld wird als fehlerhaft optisch markiert und mit einer aussagekräftigen Fehlermeldung dem User den *Alias*-Konflikt mitgeteilt. Dabei bleiben alle vorher eingegebenen Daten in den Eingabefeldern erhalten und es muss nur der *Alias* geändert werden. +Wird bei der Eindeutigkeitsprüfung des *Alias* festgestellt, dass es schon einen exitierenden User mit dem gleichen *Alias* gibt, dann wird wieder zurück in den Registrierungsdialog gesprungen, damit der User seine *Alias*-Eingabe korrigieren kann. Das *Alias*-Feld wird als fehlerhaft optisch markiert und mit einer aussagekräftigen Fehlermeldung dem User der *Alias*-Konflikt mitgeteilt. Dabei bleiben alle vorher eingegebenen Daten in den Eingabefeldern erhalten und es muss nur der *Alias* geändert werden. -Wurde vom User nun eine konfliktfreie Alias-Eingabe und alle Angaben der Registrierung ordnungsgemäß ausgefüllt, so kann der Registrierungsprozess wie bisher ausgeführt werden. Einziger Unterschied ist der zusätzliche Alias-Parameter, der nun an das Backend zur Erzeugung der User übergeben und dann in der Users-Tabelle gespeichert wird. +Wurde vom User nun eine konfliktfreie *Alias*-Eingabe und alle Angaben der Registrierung ordnungsgemäß ausgefüllt, so kann der Registrierungsprozess wie bisher ausgeführt werden. Einziger Unterschied ist der zusätzliche *Alias*-Parameter, der nun an das Backend zur Erzeugung des Users übergeben und dann in der Users-Tabelle gespeichert wird. + +### Login + +Meldet sich ein schon registrierter User erfolgreich an - das passiert wie bisher noch mit seiner Email-Adresse - dann wird geprüft, ob für diesen User schon ein Alias gespeichert ist. Wenn nicht dann erfolgt direkt nach der Anzeige des Login-Dialoges die Anzeige der User-Profilseite. + +![img](./image/LoginProfileWithAlias.png) + +Auf der erweiterten User-Profil-Seite sind folgende Elemente neu hinzugekommen bzw. erweitert: + +* **[AS-1]** Alias: neu hinzugekommen ist die Gruppe Alias mit dem Label, dem Eingabefeld und dem Link "Alias ändern" mit Stift-Icon +* **[AS-2]** E-Mail: ergänzt wurde die Gruppe E-Mail, in dem das Label "E-Mail", das Eingabefeld, das Label "bestätigt" mit zugehörigem Icon darunter und dem Link "E-Mail ändern" mit Stift-Icon. in der Ausbaustufe-1 ist der Link "E-Mail ändern" und das Stift-Icon disabled, so dass das Eingabefeld der E-Mail lediglich zur Anzeige der aktuell gesetzten E-Mail dient. Da mit der Änderungsmöglichkeit der E-Mail gleichzeitig auch der Login-Prozess und die Passwort-Verschlüsselung angepasst werden muss, wird dieses Feature auf eine spätere Ausbaustufe verschoben. + +Der Sprung nach der Login-Seite nach erfolgreichem Login auf die Profil-Seite öffnet diese schon direkt im Bearbeitungs-Modus des Alias, so dass der User direkt seine Eingabe des Alias vornehmen kann. + +![img](./image/LoginProfileEditAlias.png) + +Im Eingabe-Modus des Alias hat das Eingabefeld den Fokus und darin wird: + +* wenn noch kein Alias für den User in der Datenbank vorhanden ist, vom System ein Vorschlag unterbreitet. Der Vorschlag basiert auf dem Vornamen des Users und wird durch folgende Logik ermittelt: + * es wird mit dem Vorname des Users eine Datenbankabfrage durchgeführt, die zählt, wieviele User-Aliase es schon mit diesem Vornamen gibt und direkt mit einer nachfolgenden Nummer als Postfix versehen sind. + * Aufgrund der Konvention, dass ein Alias mindestens 5 Zeichen lang sein muss, sind ggf. führende Nullen mitzuberücksichten. + * Beispiel: Max als Vorname + * in der Datenbank gibt es schon mehrer User mit den Aliasen: Maximilian, Max01, Max_M, Max-M, MaxMu und Max02. + * Dann schlägt das System den Alias Max03 vor, da Max nur 3 Zeichen lang ist und es schon zwei Aliase Max gefolgt mit einer Nummer gibt + * Die Aliase Maximilian, Max_M und MaxMu werden nicht mitgezählt, das diese nach Max keine direkt folgende Ziffern haben +* wenn schon ein Alias für den User in der Datenbank vorhanden ist, dann wird dieser ohne Systemvorschlag angezeigt. + +Der User kann nun den im Eingabefeld angezeigten Alias verändern, wobei die Alias-Konventionen, wie oben beschrieben einzuhalten und zu validieren sind. + +Mit dem Button "Eindeutigkeit prüfen" kann der im Eingabefeld stehende Alias auf Eindeutigkeit verifziert werden. Dabei wird dieser als Parameter einem Datenbank-Statement übergeben, das auf das Feld *Alias* in der *Users*-Tabelle ein Count mit dem übergebenen Parameter durchführt. Kommt als Ergebnis =0 zurück, ist der eingegebene Alias noch nicht vorhanden und kann genutzt werden. Liefert das Count-Statement einen Wert >0, dann ist dieser Alias schon von einem anderen User in Gebrauch und darf nicht gespeichert werden. Der User muss also seinen Alias erneut ändern. + +Mit dem "Speichern"-Button wird die Eindeutigkeitsprüfung erneut implizit durchgeführt, um sicherzustellen, dass keine Alias-Konflikte in der Datenbank gespeichert werden. Sollte widererwarten doch ein Konflikt bei der Eindeutigkeitsprüfung auftauchen, so bleibt der Dialog im Eingabe-Modus des Alias geöffnet und zeigt dem User eine aussagekräftige Fehlermeldung an. + +Über das rote Icon (x) hinter dem Label "Alias ändern" kann die Eingabe bzw. das Ändern des Alias abgebrochen werden. + +**[AS-1]** Die erweiterte Gruppe E-Mail bleibt immer im Anzeige-Modus und kann selbst über den Link "E-Mail ändern" und das Stift-Icon, die beide disabled sind, nicht in den Bearbeitungsmodus versetzt werden. Die aktuell gesetzte E-Mail des Users wird im disabled Eingabefeld nur angezeigt. Das Icon unter dem Label "bestätigt" zeigt den Status der E-Mail, ob diese schon vom User bestätigt wurde oder nicht. Der Schalter für das Label "Informationen per E-Mail" bleibt von dem Switch zwischen Anzeige-Modus und Bearbeitungs-Modus unberührt, dh. es kann zu jeder Zeit vom User defniert werden, ob er über die gesetzte E-Mail Informationen erhält oder nicht. + +**[AS-2]** In der weiteren Ausbaustufe, die erst möglich ist, sobald der Login-Prozess und die Passwort-Verschlüsselung darauf umgestellt ist, wird der Link "E-Mail ändern" und das Sift-Icon enabled. Damit kann der User dann das E-Mail Eingabefeld in den Bearbeitungs-Modus versetzen. + +![img](./image/LoginProfileEditEmail.png) + +**[AS-2]** Im Eingabe-Modus des E-Mail-Feldes kann der User seine E-Mail-Adresse ändern. Über den Button "Speichern & Bestätigen" wird die veränderte E-Mail gegenüber den bisher gespeicherten E-Mails aller User verifiziert, dass es keine Dupletten gibt. + +Ist diese Prüfung erfolgreich, dann wird die geänderte E-Mail-Adresse in der Datenbank gespeichert, das Flag E-Mail-Checked auf FALSE gesetzt, damit das Bestätigt-Icon von "bestätigt" auf "unbestätigt" dem User angezeigt wird und zurück in den Anzeige-Modus der Gruppe E-Mail gewechselt. Mit der Speicherung der geänderten E-Mail wird eine Comfirmation-Email an diese E-Mail-Adresse zur Bestätigung durch den User gesendet. + +Ist diese Prüfung fehlgeschlagen, sprich es gibt die zuspeichernde E-Mail schon in der Datenbank, dann wird das Speichern der geänderten E-Mail abgebrochen und es bleibt die zuvor gespeicherte E-Mail gültig. Ob und welche Meldung dem User in dieser Situation angezeigt wird, ist noch zu definieren, um kein Ausspionieren von anderen E-Mail-Adressen zu unterstützen. Ebenfalls noch offen ist, ob an die gefundene E-Mail-Duplette eine Info-Email geschickt wird, um den User, der diese bestätigte E-Mail-Adresse besitzt, zu informieren, dass es einen Versuch gab seine E-Mail zu verwenden. + + +## Login mit Alias [AS-3] + +In der Ausbaustufe 3 wird der Login-Prozess so umgebaut, dass der User statt nur seiner E-Mail-Adresse zukünftig seinen Alias oder seine GradidoID oder seine E-Mail-Adresse verwenden kann. + +![img](./image/LoginWithAlias.png) + +Hat der User seine Eingaben im Login-Dialog getätigt und klick auf den "Anmeldung"-Button erfolgt eine Verifzierung welchen Wert er verwendet hat: + +* enthält der erste Parameter ein @-Zeichen wird von einer E-Mail-Adresse ausgegangen +* ist der erste Parameter eine valide UUID der Version 4, dann wird von der GradidoID ausgegangen +* ansonsten wird unterstellt, dass der erste Parameter als Alias zu interpretieren ist + +Je nach Typ des ersten Parameters wird in der Users-Tabelle nach dem User mit der E-Mail, der GradidoID oder dem Alias gesucht. Wird dieser User gefunden, dann erfolgt die Prüfung gegenüber dem zweiten Parameter als Passwort. + +Die interne Passwort-Verschlüsselung muss vorher neu überarbeitet werden. diff --git a/docu/Concepts/BusinessRequirements/graphics/GradidoÜbersichtMaske.bmpr b/docu/Concepts/BusinessRequirements/graphics/GradidoÜbersichtMaske.bmpr index 8b6b54a4b89cbb9f3916aa226973464796293471..9531248bf3714f8737a17476ec481886b78f2cae 100644 GIT binary patch delta 132172 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

;N!;1%xTGVpp#55*BzV;I-rP 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 tngM~~J##3{`a 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 P+s3i;Zd<+@uUr2DyR-kt diff --git a/docu/Concepts/BusinessRequirements/image/LoginProfileEditAlias.png b/docu/Concepts/BusinessRequirements/image/LoginProfileEditAlias.png new file mode 100644 index 0000000000000000000000000000000000000000..b516c825ed0f5b6bf75b5ec06b99c35536f8e012 GIT binary patch literal 102990 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

>F&J2O1$UF!W#EgMqjf$tndhPEF#EAiJ0|bZ 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

rA1wRK(+zc@R8o<Z3G7|cQhM`k)Q(! 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 literal 0 HcmV?d00001 diff --git a/docu/Concepts/BusinessRequirements/image/LoginWithAlias.png b/docu/Concepts/BusinessRequirements/image/LoginWithAlias.png new file mode 100644 index 0000000000000000000000000000000000000000..1f5852795d66d02ca56b850c4f989b7462a7d0df GIT binary patch literal 47524 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

AgCy9h0RD; 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 z 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 GjQ$VTWh>YK literal 0 HcmV?d00001 From 5db002dd8849b988a23c071ca681a71d294ccdde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Wed, 24 Aug 2022 14:05:35 +0200 Subject: [PATCH 046/304] remove uasecase specific alias-mocks from general balsamic file --- .../graphics/GradidoÜbersichtMaske.bmpr | Bin 868352 -> 868352 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docu/Concepts/BusinessRequirements/graphics/GradidoÜbersichtMaske.bmpr b/docu/Concepts/BusinessRequirements/graphics/GradidoÜbersichtMaske.bmpr index 9531248bf3714f8737a17476ec481886b78f2cae..94c259f9c776dd631bc1d1ccbcd3e1b7b2bc2599 100644 GIT binary patch delta 2657 zcmaJ@4Qx}_6@K^L=bv})b7H`l5KQ_oB+BSu2EtD%txTXDWh^zcV{8RviL8W(QuAAW z3cLhJDztSD4|1TOU^-TQOC18flriLj3Mrd12Ba`V!7i|NQx#dTAE31Cyacg!s%Gi4 zpMB1~=iGC?^IeU04QBx$CiiVdVx}8si^!sWagl}*Y&Q_}ho8lUmUvCx; zwu^1kR5BZ`)bh0u{frlanR1mw=0n#6@b(s$;p!D$D2=`1I+1LrMs%tA^aqT*(pW1h z8ZUBHPW9^h8Kv{Udq?#{^oUjj`Zel@i0LYkkv0(`U}k6mB%gBYV2;xYWTu_>r{qd1F7Y2R$7WN?aW(NtmS)Y z>J3hHN@u|GPx#9a{)2GJ*dfhgLJecOb4avUP#tI*sCg*&mZ>EkQnhrq2 zQ1Tcg_c;fE;Uz^7->6-HL<%>tJ>kk$KEO&YcQ*b;Goa%ocXvp>E>!5)q*Y-5SRq6S zHQ>NLXUU`Gu}3amc!_!5aV*3*?^!k3$04>wQ{`~g^GD{w;P|StYTEl*nI^X#Z6cWe zc9%fj9DV}K{Wb+D<-~2?DcyflHgONnY9Za$%+v0)#5H`hR{?p#R|zhx&E$LLcxfO z5#U`RZj*zMb$Wtej3VP@{3{WoR^sp2u8*)?_J%ExRXyLAq3Pm0BZuI44}#<4(UUaw zGg3lQ7dX>ta+ozXTMW5nWPnT;3yvuTL?I;JVg@9BrvNaICuosknQxtj-w-0Kz6m7*HcXTwuf0-Np~glP{vrhUx1Mo(!_ zlm=YyV=L@6=(w<^sZaN=^#E(dLyZH}xO&*IP8^q0>cqQ*oJ_qT?6G(sV%vBXgnva< z8Edt9p9OCnuSTgGDicvY3lrTYhz>h$>oXx%B<9MtN?yh!-7l#7|ITe00V8Nrx{o;6 zDJ_7~GRf{m2dvu8u@@#kkJ}#;#Qp7|Jq0nyx=^>3`k)hBwl6L<#jatZUFn2pA zK+&7DL?+IOD6w)!{g9g|lJLbj>XwNnK8uilKr{3Bq|t!eG!CUhAyLam15WrhJCT1v z=8{?s-jjS3ga?xf2(K2U(9te%&<0`Z=5=8{V&A|1D+qvsa4>aAsBXwU(2Hc`o=D

yV@k6Ye*UP!NED71|@ zvbm@TFzh4@8AhI$W}a>m26H1L^!}%B$10 zl>Qa6n&%tU0IbG9$o!UZ__fo6eLF2a?_%UJKP`l_J@BxR^KMk$U8t^jtsEqhZq{j; zjNec!)9;ZoIPjWQ0Es%`mOKBZ&!oHP1>HBL zQ$~7VsoN1BBQ7E?A^w86hR7gpBF-buAU;C0B2FWYB90&=B871s2&a|vjglC3sS7^1 zr^g|=0Yz)`G!C~Ti4~@3m*1__HD*DD<1rXjKy35in+GR>vIW#@)HXt*S z^2Qlj0HPPwJUK0)?Zw%s;$PeU4%m2z4kTF5o$66)t3s(QMeG@fJmxNiP)eMVX)eO# zQ9mt0CPFNyj)rtGx!2iMTcld3WIhk^c9AXjXYQrnq|y4$T_-_uI?80x0b12bC}Td} zYsvfK1x9`h9nEwt%$z0OhR{Lvk$x`4V^sVPZEeY|#owR*F5cT0p=~UIRST$J<~9f~ Qc{Ek_y;)7)8RJp^1Jsyrn*aa+ delta 2322 zcmZ`)Yiv}<6~6QEdhg6#dx7o7a*T6v!9{6t);0!8QnWUY66!b$MJYlF+9(zei#Tf< z(m)DX^A-wp;ewATlq^0}^bd`iQp*(taAxQnv zAD?FC&Np+p(P&LHS`&NNtTGG{G7SFQmXVLMssmx4ON}?i8Lf7noVm)GsekC~ zaeejkT4S0q)tF%X)TlJZ8`Z`bqspiy+7#+l8Z|V^ew$zfh%t?NlZjPFqiR|;m6)}} zoNP?%|2Th}%c(02I98$CIa}a&Itt63Z3R_MbHQlmYQa2bNnyq6Q-$kK6*2-R2!bT! z;i*E`#Krmip_hz^u?*N`z6h6mW5vXJ9(8r{X#OS6=fjXLRSbcDijubPEFVNqNeP~A zRR@W!ro{G))kO4X-N>IcxsQ%*45Op(C3F*d2>S@Vg#CmBVSsRrQdCZuLYPXJLHGrs zp70c*f$%h863%Y7dW7=OzKr!7tba?b4@+M*w=>ncbD7s{9X@LPaQO35^F;`*b-e-c zrKTI-eZ{P0tS0%Y={&6F7P_+}cJT)gjG5tlL;Q>aSO8o0t64C&Taa-8Q7hbJg~oSpwmUvf$7h&t8H2Et6X)Bjzp9cF>ft{CPDWf}mX(*`^%9nzPBS zf*pss%*i0wQW)0KLs+4gSPezoq zz`IV(fYix+37;O(3Zi?=b&y(U7GY_JIhKK4#*3igb=3!UyLl8+jjCQ!M&mH)kogk~ z9MA_`Y2hP51=f{b>4yWCD{bt zi+TbCD_8>rkEzjcy~a}tu`zV`XtgH_p-N8x)G_rhNLPF8dqevj;eu$5r!O1B0jS)o zN-^cR)j5O{{oaspTY8^?IMvb*#{ z?6?YUeT@hoWC@uI@?FP!(+jDULPDlZ6hr2eD#=n0Lg;{8d?;c$qEnn#7Q2SBgbsxK zs^T^j3}urrQs9X(%rr8($h2P;L1>8Q^X%gHFm_dL;}F+6jFE-R&61XuL1^hxKCpk4 zSA>B%?vH4%kd{8#YKYb?tt)VSqrS;iYy3w;?mO{!3-pUl^sJ;U#pB6^n*I=J&=rn- z!Vh-0F2e9OGk)LC#wNqqM7wy!YuVMUyB`^Pf0vzW^nE{XU8_@UJkDIFdl|cs+@QI| zML9}4cTt~#eaIxO4#)xsHmWELHp!yxF;n54b~BGew@Wh%E+5frAiRL8STvbm2k8^} z)4{t!eGH$5RWaHf<`)b_k7jNNM9hgf(L!cvUJ0aDNI%q{)Ca+CWNr*BQiD93tLsqP zN!G~>=wjHsU6ef#ZUQou%!crQS$=OD(tb(XYU#)5aoxlq*dqOH@9WFSqguLIwNv}q zD99{hBQdo@DVmN_jPc(K8zQf(GUw=j%ISj5S1|Os>SydLh@8<2A-IW4Di@l{#n;ff zHyg+Iwg9rlqmX`EDA<%#Zt#Ag{&ug99QE^J7#v304V`n7r8`A2hT5z?#`!m}atZfi zrbBsI&O}HiYRaAS#{U&LlE_z4y}P8TPX4d9k+hwix~jPkt{>oQVBTrf@j%!}!hV%= zeissFQ~*kQ`NEu>?G`C9G1~J>fgdvKF%Gd;_4l&h$db~MZW!@LMS;3B1v)sE732hr zB;bCI!fV}K&BYXyPk3&LWVZZ0GkJ`_pssbR?_8c@c~5s;rYxM4NI zicYl(*)EGq7K9IOSbMco}}urOJdbL@nITST`UsoEKr?K9%A0tqxjF>JgCW zc8$zELD^U4Jj9cqoI^zvh0nvhC}(F2YCXzOwtWg^eYR~tIX&AxjdDu1orE$-Es7^Rx5a+} DmBs*g From 80eeb0ac94296aeab014840203cc92195b62b4d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Wed, 24 Aug 2022 14:51:54 +0200 Subject: [PATCH 047/304] add hints to add feature dependent logging and EventProtokoll --- docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md b/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md index 7fdea43ea..40d93becc 100644 --- a/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md +++ b/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md @@ -142,7 +142,7 @@ Liefert diese Prüfung den Wert FALSE, dann wird das Anlegen und Speichern des n Ist die Eindeutigkeitsprüfung hingegen erfolgreich, dann wird die existierende Logik zur Anlage eines neuen Users weiter ausgeführt. Dabei ist der neue Parameter alias in den neu angelegten User zu übertragen und in der Datenbank zu speichern. -Alle weiteren Ausgabe-Kanäle wie Logging, EventProtokoll und Emails sind ggf. um das neue Attribut alias zu ergänzen. +Alle weiteren Ausgabe-Kanäle wie Logging, EventProtokoll und Emails sind entsprechend einzubauen, aber mindestens um das neue Attribut *alias* zu ergänzen. ### UserResolver.verifyUniqueAlias - neu @@ -165,6 +165,8 @@ Die Parameter *firstName, lastName, language, password, passwordNew, alias* werd Sobald der *alias*-Parameter gesetzt ist, wird für diesen der Service *verifyUniqueAlias()* zur Eindeutigekeitsprüfung aufgerufen, um sicherzustellen, dass der übergebene *alias* wirklich nicht schon in der Datenbank existiert. Liefert das Ergebnis von *verifyUniqueAlias()* den Wert TRUE, dann kann der übergebene *alias* in der Datenbank gespeichert werden. Anderfalls muss mit einer aussagekräftigen Fehlermeldung abgebrochen werden und es wird keiner der übergebenen Parameter in die Datenbank geschrieben. +Alle weiteren Ausgabe-Kanäle wie Logging, EventProtokoll sind entsprechend einzubauen, aber mindestens um das neue Attribut *alias* zu ergänzen. + #### Ausbaustufe-x Sobald in einer weiteren Ausbaustufe die Email auf der Profil-Seite vom User verändert werden kann, dann wird dieser Service um den optionalen Parameter *email: String* erweitert. @@ -173,7 +175,9 @@ Sobald der *email*-Parameter gesetzt ist, wird für diesen der Service *verifyUn Mit dem Speichern der geänderten Email muss auch das Flag *emailChecked* auf FALSE gesetzt und gespeichert werden. Damit wird sichergestellt, dass die veränderte Email-Adresse erst noch vom User bestätigt werden muss. Dies wird direkt nach dem Speichern der Email-Adresse mit dem Versenden einer *confirmChangedEmail* an die neue Email-Adresse initiiert. Der darin enthaltene Bestätigungs-Link wird analog dem Aktivierungs-Link bei der Registrierung der Email gehandhabt. Die *confirmChangedEmail* muss nur inhaltlich vom Text anders formuliert werden als die *AccountActivation*-Email, aber bzgl. der Parameter und des enthaltenen Bestätigungslinks unterscheiden sich beide nicht. -Sobald der User in seiner erhaltenen *confirmChangedEmail* den Link aktiviert, erfolgt der Aufruf des Service *UserResolver.queryOptIn*, um zu prüfen, ob der in dem Link enthaltene OptInCode valide und gültig ist. Falls ja, dann wird das Flag emailChecked auf TRUE gesetzt, anderfalls bleibt es auf FALSE und es wird mit einer aussagekräftigen Fehlermeldung abgebrochen. +Sobald der User in seiner erhaltenen *confirmChangedEmail* den Link aktiviert, erfolgt der Aufruf des Service *UserResolver.queryOptIn*, um zu prüfen, ob der in dem Link enthaltene OptInCode valide und gültig ist. Falls ja, dann wird das Flag *emailChecked* auf TRUE gesetzt, anderfalls bleibt es auf FALSE und es wird mit einer aussagekräftigen Fehlermeldung abgebrochen. + +Alle weiteren Ausgabe-Kanäle wie Logging, EventProtokoll sind entsprechend einzubauen, aber mindestens um das neue Attribut *email* zu ergänzen. ### UserResolver.verifyUniqueEmail - neu From fde236aa43104616635db94b2e22d2aca26e1b6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Thu, 25 Aug 2022 01:06:25 +0200 Subject: [PATCH 048/304] add migration of users, user_contacts and email_opt_in --- backend/src/config/index.ts | 2 +- .../User.ts | 0 .../UserContact.ts | 0 database/entity/User.ts | 2 +- database/entity/UserContact.ts | 2 +- ...user_contacts_table.ts => 0048-add_user_contacts_table.ts} | 4 +++- 6 files changed, 6 insertions(+), 4 deletions(-) rename database/entity/{0047-add_user_contacts_table => 0048-add_user_contacts_table}/User.ts (100%) rename database/entity/{0047-add_user_contacts_table => 0048-add_user_contacts_table}/UserContact.ts (100%) rename database/migrations/{0047-add_user_contacts_table.ts => 0048-add_user_contacts_table.ts} (98%) diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index ae73fa8ac..62b09c93d 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -10,7 +10,7 @@ Decimal.set({ }) const constants = { - DB_VERSION: '0047-messages_tables', + DB_VERSION: '0048-add_user_contacts_table', DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0 LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info diff --git a/database/entity/0047-add_user_contacts_table/User.ts b/database/entity/0048-add_user_contacts_table/User.ts similarity index 100% rename from database/entity/0047-add_user_contacts_table/User.ts rename to database/entity/0048-add_user_contacts_table/User.ts diff --git a/database/entity/0047-add_user_contacts_table/UserContact.ts b/database/entity/0048-add_user_contacts_table/UserContact.ts similarity index 100% rename from database/entity/0047-add_user_contacts_table/UserContact.ts rename to database/entity/0048-add_user_contacts_table/UserContact.ts diff --git a/database/entity/User.ts b/database/entity/User.ts index 1e0017b72..3191148ee 100644 --- a/database/entity/User.ts +++ b/database/entity/User.ts @@ -1 +1 @@ -export { User } from './0047-add_user_contacts_table/User' +export { User } from './0048-add_user_contacts_table/User' diff --git a/database/entity/UserContact.ts b/database/entity/UserContact.ts index e596489da..dfa1ab4a1 100644 --- a/database/entity/UserContact.ts +++ b/database/entity/UserContact.ts @@ -1 +1 @@ -export { UserContact } from './0047-add_user_contacts_table/UserContact' +export { UserContact } from './0048-add_user_contacts_table/UserContact' diff --git a/database/migrations/0047-add_user_contacts_table.ts b/database/migrations/0048-add_user_contacts_table.ts similarity index 98% rename from database/migrations/0047-add_user_contacts_table.ts rename to database/migrations/0048-add_user_contacts_table.ts index b3c6be03e..49f647e39 100644 --- a/database/migrations/0047-add_user_contacts_table.ts +++ b/database/migrations/0048-add_user_contacts_table.ts @@ -63,8 +63,10 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis } export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { - // reconstruct the previous email back from contacts to users table + // this step comes after verification and test await queryFn('ALTER TABLE users ADD COLUMN email varchar(255) NULL AFTER privkey;') + + // reconstruct the previous email back from contacts to users table const contacts = await queryFn(`SELECT c.id, c.email, c.user_id FROM user_contacts as c`) for (const id in contacts) { const contact = contacts[id] From 228451574daa6d1d67c854a4f8b7a6039e2e3b08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Fri, 26 Aug 2022 02:28:04 +0200 Subject: [PATCH 049/304] adapt backend on database migration of UserContacts --- backend/src/event/Event.ts | 10 ++ backend/src/event/EventProtocolType.ts | 1 + .../graphql/model/UnconfirmedContribution.ts | 2 +- backend/src/graphql/model/User.ts | 12 +- backend/src/graphql/model/UserAdmin.ts | 4 +- backend/src/graphql/model/UserContact.ts | 56 +++++++++ backend/src/graphql/resolver/AdminResolver.ts | 83 +++++++++---- backend/src/graphql/resolver/GdtResolver.ts | 4 +- .../graphql/resolver/TransactionResolver.ts | 21 ++-- backend/src/graphql/resolver/UserResolver.ts | 115 ++++++++++-------- backend/src/typeorm/repository/User.ts | 8 +- backend/src/util/communityUser.ts | 1 + backend/src/webhook/elopage.ts | 4 +- .../0048-add_user_contacts_table/User.ts | 4 +- .../UserContact.ts | 15 ++- .../0048-add_user_contacts_table.ts | 2 +- 16 files changed, 245 insertions(+), 97 deletions(-) create mode 100644 backend/src/graphql/model/UserContact.ts diff --git a/backend/src/event/Event.ts b/backend/src/event/Event.ts index 6f07661f1..85fba896d 100644 --- a/backend/src/event/Event.ts +++ b/backend/src/event/Event.ts @@ -32,6 +32,7 @@ export class EventRegister extends EventBasicUserId {} export class EventRedeemRegister extends EventBasicRedeem {} export class EventInactiveAccount extends EventBasicUserId {} export class EventSendConfirmationEmail extends EventBasicUserId {} +export class EventSendAccountMultiRegistrationEmail extends EventBasicUserId {} export class EventConfirmationEmail extends EventBasicUserId {} export class EventRegisterEmailKlicktipp extends EventBasicUserId {} export class EventLogin extends EventBasicUserId {} @@ -113,6 +114,15 @@ export class Event { return this } + public setEventSendAccountMultiRegistrationEmail( + ev: EventSendAccountMultiRegistrationEmail, + ): Event { + this.setByBasicUser(ev.userId) + this.type = EventProtocolType.SEND_ACCOUNT_MULTI_REGISTRATION_EMAIL + + return this + } + public setEventConfirmationEmail(ev: EventConfirmationEmail): Event { this.setByBasicUser(ev.userId) this.type = EventProtocolType.CONFIRM_EMAIL diff --git a/backend/src/event/EventProtocolType.ts b/backend/src/event/EventProtocolType.ts index 0f61f787a..52bcf8349 100644 --- a/backend/src/event/EventProtocolType.ts +++ b/backend/src/event/EventProtocolType.ts @@ -5,6 +5,7 @@ export enum EventProtocolType { REDEEM_REGISTER = 'REDEEM_REGISTER', INACTIVE_ACCOUNT = 'INACTIVE_ACCOUNT', SEND_CONFIRMATION_EMAIL = 'SEND_CONFIRMATION_EMAIL', + SEND_ACCOUNT_MULTI_REGISTRATION_EMAIL = 'SEND_ACCOUNT_MULTI_REGISTRATION_EMAIL', CONFIRM_EMAIL = 'CONFIRM_EMAIL', REGISTER_EMAIL_KLICKTIPP = 'REGISTER_EMAIL_KLICKTIPP', LOGIN = 'LOGIN', diff --git a/backend/src/graphql/model/UnconfirmedContribution.ts b/backend/src/graphql/model/UnconfirmedContribution.ts index 1d697a971..a81bb4a49 100644 --- a/backend/src/graphql/model/UnconfirmedContribution.ts +++ b/backend/src/graphql/model/UnconfirmedContribution.ts @@ -13,7 +13,7 @@ export class UnconfirmedContribution { this.date = contribution.contributionDate this.firstName = user ? user.firstName : '' this.lastName = user ? user.lastName : '' - this.email = user ? user.email : '' + this.email = user ? user.emailContact.email : '' this.creation = creations } diff --git a/backend/src/graphql/model/User.ts b/backend/src/graphql/model/User.ts index 728851ec2..a28fe4b69 100644 --- a/backend/src/graphql/model/User.ts +++ b/backend/src/graphql/model/User.ts @@ -3,6 +3,7 @@ import { KlickTipp } from './KlickTipp' import { User as dbUser } from '@entity/User' import Decimal from 'decimal.js-light' import { FULL_CREATION_AVAILABLE } from '../resolver/const/const' +import { UserContact } from './UserContact' @ObjectType() export class User { @@ -10,8 +11,9 @@ export class User { this.id = user.id this.gradidoID = user.gradidoID this.alias = user.alias - // this.email = user.email + this.emailId = user.emailId this.email = user.emailContact.email + this.emailContact = user.emailContact this.firstName = user.firstName this.lastName = user.lastName this.deletedAt = user.deletedAt @@ -35,12 +37,18 @@ export class User { gradidoID: string @Field(() => String, { nullable: true }) - alias: string + alias?: string + + @Field(() => Number, { nullable: true }) + emailId: number | null // TODO privacy issue here @Field(() => String) email: string + @Field(() => UserContact) + emailContact: UserContact + @Field(() => String, { nullable: true }) firstName: string | null diff --git a/backend/src/graphql/model/UserAdmin.ts b/backend/src/graphql/model/UserAdmin.ts index cf3663e70..08dc405ac 100644 --- a/backend/src/graphql/model/UserAdmin.ts +++ b/backend/src/graphql/model/UserAdmin.ts @@ -6,11 +6,11 @@ import { User } from '@entity/User' export class UserAdmin { constructor(user: User, creation: Decimal[], hasElopage: boolean, emailConfirmationSend: string) { this.userId = user.id - this.email = user.email + this.email = user.emailContact.email this.firstName = user.firstName this.lastName = user.lastName this.creation = creation - this.emailChecked = user.emailChecked + this.emailChecked = user.emailContact.emailChecked this.hasElopage = hasElopage this.deletedAt = user.deletedAt this.emailConfirmationSend = emailConfirmationSend diff --git a/backend/src/graphql/model/UserContact.ts b/backend/src/graphql/model/UserContact.ts new file mode 100644 index 000000000..902e2f9f2 --- /dev/null +++ b/backend/src/graphql/model/UserContact.ts @@ -0,0 +1,56 @@ +import { ObjectType, Field } from 'type-graphql' +import { UserContact as dbUserCOntact} from '@entity/UserContact' + +@ObjectType() +export class UserContact { + constructor(userContact: dbUserCOntact) { + this.id = userContact.id + this.type = userContact.type + this.userId = userContact.userId + this.email = userContact.email + // this.emailVerificationCode = userContact.emailVerificationCode + this.emailOptInTypeId = userContact.emailOptInTypeId + this.emailResendCount = userContact.emailResendCount + this.emailChecked = userContact.emailChecked + this.phone = userContact.phone + this.createdAt = userContact.createdAt + this.updatedAt = userContact.updatedAt + this.deletedAt = userContact.deletedAt + } + + @Field(() => Number) + id: number + + @Field(() => String) + type: string + + @Field(() => Number) + userId: number + + @Field(() => String) + email: string + + // @Field(() => BigInt, { nullable: true }) + // emailVerificationCode: BigInt | null + + @Field(() => Number, { nullable: true }) + emailOptInTypeId: number | null + + @Field(() => Number, { nullable: true }) + emailResendCount: number | null + + @Field(() => Boolean) + emailChecked: boolean + + @Field(() => String, { nullable: true }) + phone: string | null + + @Field(() => Date) + createdAt: Date + + @Field(() => Date, { nullable: true }) + updatedAt: Date | null + + @Field(() => Date, { nullable: true }) + deletedAt: Date | null +} diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index e70fe71ee..5d283026d 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -44,7 +44,7 @@ import Paginated from '@arg/Paginated' import TransactionLinkFilters from '@arg/TransactionLinkFilters' import { Order } from '@enum/Order' import { communityUser } from '@/util/communityUser' -import { checkOptInCode, activationLink, printTimeDuration } from './UserResolver' +import { checkEmailVerificationCode, activationLink, printTimeDuration } from './UserResolver' import { sendAccountActivationEmail } from '@/mailer/sendAccountActivationEmail' import { transactionLinkCode as contributionLinkCode } from './TransactionLinkResolver' import CONFIG from '@/config' @@ -62,6 +62,7 @@ import { MEMO_MAX_CHARS, MEMO_MIN_CHARS, } from './const/const' +import { UserContact } from '@entity/UserContact' // const EMAIL_OPT_IN_REGISTER = 1 // const EMAIL_OPT_UNKNOWN = 3 // elopage? @@ -118,7 +119,8 @@ export class AdminResolver { const adminUsers = await Promise.all( users.map(async (user) => { let emailConfirmationSend = '' - if (!user.emailChecked) { + if (!user.emailContact.emailChecked) { + /* const emailOptIn = await LoginEmailOptIn.findOne( { userId: user.id, @@ -138,12 +140,18 @@ export class AdminResolver { emailConfirmationSend = emailOptIn.createdAt.toISOString() } } + */ + if (user.emailContact.updatedAt) { + emailConfirmationSend = user.emailContact.updatedAt.toISOString() + } else { + emailConfirmationSend = user.emailContact.createdAt.toISOString() + } } const userCreations = creations.find((c) => c.id === user.id) const adminUser = new UserAdmin( user, userCreations ? userCreations.creations : FULL_CREATION_AVAILABLE, - await hasElopageBuys(user.email), + await hasElopageBuys(user.emailContact.email), emailConfirmationSend, ) return adminUser @@ -239,24 +247,27 @@ export class AdminResolver { @Args() { email, amount, memo, creationDate }: AdminCreateContributionArgs, @Ctx() context: Context, ): Promise { - const user = await dbUser.findOne({ email }, { withDeleted: true }) - if (!user) { + const emailContact = await UserContact.findOne({ email }, { withDeleted: true }) + if (!emailContact) { + logger.error(`Could not find user with email: ${email}`) throw new Error(`Could not find user with email: ${email}`) } - if (user.deletedAt) { - throw new Error('This user was deleted. Cannot create a contribution.') + if (emailContact.deletedAt) { + logger.error('This emailContact was deleted. Cannot create a contribution.') + throw new Error('This emailContact was deleted. Cannot create a contribution.') } - if (!user.emailChecked) { + if (!emailContact.emailChecked) { + logger.error('Contribution could not be saved, Email is not activated') throw new Error('Contribution could not be saved, Email is not activated') } const moderator = getUser(context) logger.trace('moderator: ', moderator.id) - const creations = await getUserCreation(user.id) + const creations = await getUserCreation(emailContact.userId) logger.trace('creations', creations) const creationDateObj = new Date(creationDate) validateContribution(creations, amount, creationDateObj) const contribution = Contribution.create() - contribution.userId = user.id + contribution.userId = emailContact.userId contribution.amount = amount contribution.createdAt = new Date() contribution.contributionDate = creationDateObj @@ -267,7 +278,7 @@ export class AdminResolver { logger.trace('contribution to save', contribution) await Contribution.save(contribution) - return getUserCreation(user.id) + return getUserCreation(emailContact.userId) } @Authorized([RIGHTS.ADMIN_CREATE_CONTRIBUTIONS]) @@ -303,11 +314,18 @@ export class AdminResolver { @Args() { id, email, amount, memo, creationDate }: AdminUpdateContributionArgs, @Ctx() context: Context, ): Promise { - const user = await dbUser.findOne({ email }, { withDeleted: true }) + const emailContact = await UserContact.findOne({ email }, { withDeleted: true }) + if (!emailContact) { + logger.error(`Could not find UserContact with email: ${email}`) + throw new Error(`Could not find UserContact with email: ${email}`) + } + const user = await dbUser.findOne({ id: emailContact.userId }, { withDeleted: true }) if (!user) { - throw new Error(`Could not find user with email: ${email}`) + logger.error(`Could not find User to emailContact: ${email}`) + throw new Error(`Could not find User to emailContact: ${email}`) } if (user.deletedAt) { + logger.error(`User was deleted (${email})`) throw new Error(`User was deleted (${email})`) } @@ -318,14 +336,17 @@ export class AdminResolver { }) if (!contributionToUpdate) { + logger.error('No contribution found to given id.') throw new Error('No contribution found to given id.') } if (contributionToUpdate.userId !== user.id) { + logger.error('user of the pending contribution and send user does not correspond') throw new Error('user of the pending contribution and send user does not correspond') } if (contributionToUpdate.moderatorId === null) { + logger.error('An admin is not allowed to update a user contribution.') throw new Error('An admin is not allowed to update a user contribution.') } @@ -379,7 +400,7 @@ export class AdminResolver { moderator: contribution.moderatorId, firstName: user ? user.firstName : '', lastName: user ? user.lastName : '', - email: user ? user.email : '', + email: user ? user.emailContact.email : '', creation: creation ? creation.creations : FULL_CREATION_AVAILABLE, } }) @@ -390,10 +411,10 @@ export class AdminResolver { async adminDeleteContribution(@Arg('id', () => Int) id: number): Promise { const contribution = await Contribution.findOne(id) if (!contribution) { + logger.error(`Contribution not found for given id: ${id}`) throw new Error('Contribution not found for given id.') } contribution.contributionStatus = ContributionStatus.DELETED - await contribution.save() const res = await contribution.softRemove() return !!res } @@ -406,15 +427,19 @@ export class AdminResolver { ): Promise { const contribution = await Contribution.findOne(id) if (!contribution) { + logger.error(`Contribution not found for given id: ${id}`) throw new Error('Contribution not found to given id.') } const moderatorUser = getUser(context) - if (moderatorUser.id === contribution.userId) + if (moderatorUser.id === contribution.userId) { + logger.error('Moderator can not confirm own contribution') throw new Error('Moderator can not confirm own contribution') - + } const user = await dbUser.findOneOrFail({ id: contribution.userId }, { withDeleted: true }) - if (user.deletedAt) throw new Error('This user was deleted. Cannot confirm a contribution.') - + if (user.deletedAt) { + logger.error('This user was deleted. Cannot confirm a contribution.') + throw new Error('This user was deleted. Cannot confirm a contribution.') + } const creations = await getUserCreation(contribution.userId, false) validateContribution(creations, contribution.amount, contribution.contributionDate) @@ -501,6 +526,18 @@ export class AdminResolver { @Mutation(() => Boolean) async sendActivationEmail(@Arg('email') email: string): Promise { email = email.trim().toLowerCase() + const emailContact = await UserContact.findOne({ email: email }) + if (!emailContact) { + logger.error(`Could not find UserContact with email: ${email}`) + throw new Error(`Could not find UserContact with email: ${email}`) + } + const user = await dbUser.findOne({ id: emailContact.userId }) + if (!user) { + logger.error(`Could not find User to emailContact: ${email}`) + throw new Error(`Could not find User to emailContact: ${email}`) + } + + /* const user = await dbUser.findOneOrFail({ email: email }) // can be both types: REGISTER and RESET_PASSWORD @@ -510,23 +547,21 @@ export class AdminResolver { }) optInCode = await checkOptInCode(optInCode, user) + */ // eslint-disable-next-line @typescript-eslint/no-unused-vars const emailSent = await sendAccountActivationEmail({ - link: activationLink(optInCode), + link: activationLink(emailContact.emailVerificationCode), firstName: user.firstName, lastName: user.lastName, email, duration: printTimeDuration(CONFIG.EMAIL_CODE_VALID_TIME), }) - /* uncomment this, when you need the activation link on the console // In case EMails are disabled log the activation link for the user if (!emailSent) { - // eslint-disable-next-line no-console - console.log(`Account confirmation link: ${activationLink}`) + logger.info(`Account confirmation link: ${activationLink}`) } - */ return true } diff --git a/backend/src/graphql/resolver/GdtResolver.ts b/backend/src/graphql/resolver/GdtResolver.ts index 56a95c9f0..a1d75e946 100644 --- a/backend/src/graphql/resolver/GdtResolver.ts +++ b/backend/src/graphql/resolver/GdtResolver.ts @@ -20,7 +20,7 @@ export class GdtResolver { try { const resultGDT = await apiGet( - `${CONFIG.GDT_API_URL}/GdtEntries/listPerEmailApi/${userEntity.email}/${currentPage}/${pageSize}/${order}`, + `${CONFIG.GDT_API_URL}/GdtEntries/listPerEmailApi/${userEntity.emailContact.email}/${currentPage}/${pageSize}/${order}`, ) if (!resultGDT.success) { throw new Error(resultGDT.data) @@ -37,7 +37,7 @@ export class GdtResolver { const user = getUser(context) try { const resultGDTSum = await apiPost(`${CONFIG.GDT_API_URL}/GdtEntries/sumPerEmailApi`, { - email: user.email, + email: user.emailContact.email, }) if (!resultGDTSum.success) { throw new Error('Call not successful') diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index bc062a1f4..ae6445343 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -35,6 +35,7 @@ import Decimal from 'decimal.js-light' import { BalanceResolver } from './BalanceResolver' import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const' +import { UserContact } from '@entity/UserContact' export const executeTransaction = async ( amount: Decimal, @@ -148,8 +149,8 @@ export const executeTransaction = async ( senderLastName: sender.lastName, recipientFirstName: recipient.firstName, recipientLastName: recipient.lastName, - email: recipient.email, - senderEmail: sender.email, + email: recipient.emailContact.email, + senderEmail: sender.emailContact.email, amount, memo, overviewURL: CONFIG.EMAIL_LINK_OVERVIEW, @@ -171,7 +172,7 @@ export class TransactionResolver { const user = getUser(context) logger.addContext('user', user.id) - logger.info(`transactionList(user=${user.firstName}.${user.lastName}, ${user.email})`) + logger.info(`transactionList(user=${user.firstName}.${user.lastName}, ${user.emailId})`) // find current balance const lastTransaction = await dbTransaction.findOne( @@ -293,16 +294,22 @@ export class TransactionResolver { } // validate recipient user - const recipientUser = await dbUser.findOne({ email: email }, { withDeleted: true }) + const emailContact = await UserContact.findOne({ email }, { withDeleted: true }) + if (!emailContact) { + logger.error(`Could not find UserContact with email: ${email}`) + throw new Error(`Could not find UserContact with email: ${email}`) + } + + const recipientUser = await dbUser.findOne({ id: emailContact.userId }) if (!recipientUser) { - logger.error(`recipient not known: email=${email}`) - throw new Error('recipient not known') + logger.error(`unknown recipient to UserContact: email=${email}`) + throw new Error('unknown recipient') } if (recipientUser.deletedAt) { logger.error(`The recipient account was deleted: recipientUser=${recipientUser}`) throw new Error('The recipient account was deleted') } - if (!recipientUser.emailChecked) { + if (!emailContact.emailChecked) { logger.error(`The recipient account is not activated: recipientUser=${recipientUser}`) throw new Error('The recipient account is not activated') } diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 9aba4d6b1..37a9946a7 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -29,6 +29,7 @@ import { EventLogin, EventRedeemRegister, EventRegister, + EventSendAccountMultiRegistrationEmail, EventSendConfirmationEmail, } from '@/event/Event' import { getUserCreation } from './util/creations' @@ -417,50 +418,55 @@ export class UserResolver { ) // TODO: wrong default value (should be null), how does graphql work here? Is it an required field? // default int publisher_id = 0; + const event = new Event() // Validate Language (no throw) if (!language || !isLanguage(language)) { language = DEFAULT_LANGUAGE } - // Validate email unique + // check if user with email still exists? email = email.trim().toLowerCase() - const foundUser = await findUserByEmail(email) + if (await checkEmailExists(email)) { + const foundUser = await findUserByEmail(email) + logger.info(`DbUser.findOne(email=${email}) = ${foundUser}`) - // TODO we cannot use repository.count(), since it does not allow to specify if you want to include the soft deletes - // const userFound = await DbUser.findOne({ email }, { withDeleted: true }) - logger.info(`DbUser.findOne(email=${email}) = ${foundUser}`) + if (foundUser) { + // ATTENTION: this logger-message will be exactly expected during tests + logger.info(`User already exists with this email=${email}`) + // TODO: this is unsecure, but the current implementation of the login server. This way it can be queried if the user with given EMail is existent. - if (foundUser) { - // ATTENTION: this logger-message will be exactly expected during tests - logger.info(`User already exists with this email=${email}`) - // TODO: this is unsecure, but the current implementation of the login server. This way it can be queried if the user with given EMail is existent. + const user = new User(communityDbUser) + user.id = sodium.randombytes_random() % (2048 * 16) // TODO: for a better faking derive id from email so that it will be always the same id when the same email comes in? + user.gradidoID = uuidv4() + user.email = email + user.firstName = firstName + user.lastName = lastName + user.language = language + user.publisherId = publisherId + logger.debug('partly faked user=' + user) - const user = new User(communityDbUser) - user.id = sodium.randombytes_random() % (2048 * 16) // TODO: for a better faking derive id from email so that it will be always the same id when the same email comes in? - user.gradidoID = uuidv4() - user.email = email - user.firstName = firstName - user.lastName = lastName - user.language = language - user.publisherId = publisherId - logger.debug('partly faked user=' + user) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const emailSent = await sendAccountMultiRegistrationEmail({ + firstName, + lastName, + email, + }) + const eventSendAccountMultiRegistrationEmail = new EventSendAccountMultiRegistrationEmail() + eventSendAccountMultiRegistrationEmail.userId = foundUser.id + eventProtocol.writeEvent( + event.setEventSendConfirmationEmail(eventSendAccountMultiRegistrationEmail), + ) + logger.info(`sendAccountMultiRegistrationEmail of ${firstName}.${lastName} to ${email}`) + /* uncomment this, when you need the activation link on the console */ + // In case EMails are disabled log the activation link for the user + if (!emailSent) { + logger.debug(`Email not send!`) + } + logger.info('createUser() faked and send multi registration mail...') - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const emailSent = await sendAccountMultiRegistrationEmail({ - firstName, - lastName, - email, - }) - logger.info(`sendAccountMultiRegistrationEmail of ${firstName}.${lastName} to ${email}`) - /* uncomment this, when you need the activation link on the console */ - // In case EMails are disabled log the activation link for the user - if (!emailSent) { - logger.debug(`Email not send!`) + return user } - logger.info('createUser() faked and send multi registration mail...') - - return user } const passphrase = PassphraseGenerate() @@ -473,16 +479,11 @@ export class UserResolver { const eventRegister = new EventRegister() const eventRedeemRegister = new EventRedeemRegister() const eventSendConfirmEmail = new EventSendConfirmationEmail() - // const dbEmailContact = new DbUserContact() - // dbEmailContact.email = email - const dbUser = new DbUser() - // dbUser.emailContact = dbEmailContact + let dbUser = new DbUser() dbUser.gradidoID = gradidoID - // dbUser.email = email dbUser.firstName = firstName dbUser.lastName = lastName - // dbUser.emailHash = emailHash dbUser.language = language dbUser.publisherId = publisherId dbUser.passphrase = passphrase.join(' ') @@ -513,22 +514,22 @@ export class UserResolver { // loginUser.pubKey = keyPair[0] // loginUser.privKey = encryptedPrivkey - const event = new Event() const queryRunner = getConnection().createQueryRunner() await queryRunner.connect() await queryRunner.startTransaction('READ UNCOMMITTED') try { - await queryRunner.manager.save(dbUser).catch((error) => { + dbUser = await queryRunner.manager.save(dbUser).catch((error) => { logger.error('Error while saving dbUser', error) throw new Error('error saving user') }) - const emailContact = newEmailContact(email, dbUser.id) - await queryRunner.manager.save(emailContact).catch((error) => { + let emailContact = newEmailContact(email, dbUser.id) + emailContact = await queryRunner.manager.save(emailContact).catch((error) => { logger.error('Error while saving emailContact', error) throw new Error('error saving email user contact') }) dbUser.emailContact = emailContact + dbUser.emailId = emailContact.id await queryRunner.manager.save(dbUser).catch((error) => { logger.error('Error while updating dbUser', error) throw new Error('error updating user') @@ -559,8 +560,6 @@ export class UserResolver { eventSendConfirmEmail.userId = dbUser.id eventProtocol.writeEvent(event.setEventSendConfirmationEmail(eventSendConfirmEmail)) - /* uncomment this, when you need the activation link on the console */ - // In case EMails are disabled log the activation link for the user if (!emailSent) { logger.debug(`Account confirmation link: ${activationLink}`) } @@ -893,20 +892,30 @@ export class UserResolver { } async function findUserByEmail(email: string): Promise { - const dbUserContact = await DbUserContact.findOneOrFail(email, { withDeleted: true }).catch( - () => { - logger.error(`UserContact with email=${email} does not exists`) - throw new Error('No user with this credentials') - }, - ) - const userId = dbUserContact.userId - const dbUser = await DbUser.findOneOrFail(userId).catch(() => { - logger.error(`User with emeilContact=${email} connected per userId=${userId} does not exist`) + const dbUserContact = await DbUserContact.findOneOrFail( + { email: email }, + { withDeleted: true }, + ).catch(() => { + logger.error(`UserContact with email=${email} does not exists`) throw new Error('No user with this credentials') }) + const userId = dbUserContact.userId + const dbUser = await DbUser.findOneOrFail(userId).catch(() => { + logger.error(`User with emailContact=${email} connected per userId=${userId} does not exist`) + throw new Error('No user with this credentials') + }) + dbUser.emailContact = dbUserContact return dbUser } +async function checkEmailExists(email: string): Promise { + const userContact = await DbUserContact.findOne({ email: email }, { withDeleted: true }) + if (userContact) { + return true + } + return false +} + /* const isTimeExpired = (optIn: LoginEmailOptIn, duration: number): boolean => { const timeElapsed = Date.now() - new Date(optIn.updatedAt).getTime() diff --git a/backend/src/typeorm/repository/User.ts b/backend/src/typeorm/repository/User.ts index 01f61dcbc..21cafbb30 100644 --- a/backend/src/typeorm/repository/User.ts +++ b/backend/src/typeorm/repository/User.ts @@ -4,9 +4,15 @@ import { User } from '@entity/User' @EntityRepository(User) export class UserRepository extends Repository { async findByPubkeyHex(pubkeyHex: string): Promise { - return this.createQueryBuilder('user') + const user = await this.createQueryBuilder('user') .where('hex(user.pubKey) = :pubkeyHex', { pubkeyHex }) .getOneOrFail() + /* + user.emailContact = await this.createQueryBuilder('userContact') + .where('userContact.id = :user.emailId', { user.emailId }) + .getOneOrFail() + */ + return user } async findBySearchCriteriaPagedFiltered( diff --git a/backend/src/util/communityUser.ts b/backend/src/util/communityUser.ts index 2f0743270..e885b7043 100644 --- a/backend/src/util/communityUser.ts +++ b/backend/src/util/communityUser.ts @@ -12,6 +12,7 @@ const communityDbUser: dbUser = { alias: '', // email: 'support@gradido.net', emailContact: new UserContact(), + emailId: -1, firstName: 'Gradido', lastName: 'Akademie', pubKey: Buffer.from(''), diff --git a/backend/src/webhook/elopage.ts b/backend/src/webhook/elopage.ts index d5eaef521..6c8ca7e49 100644 --- a/backend/src/webhook/elopage.ts +++ b/backend/src/webhook/elopage.ts @@ -30,6 +30,7 @@ import { LoginElopageBuys } from '@entity/LoginElopageBuys' import { UserResolver } from '@/graphql/resolver/UserResolver' import { User as dbUser } from '@entity/User' +import { UserContact as dbUserContact } from '@entity/UserContact' export const elopageWebhook = async (req: any, res: any): Promise => { // eslint-disable-next-line no-console @@ -127,7 +128,8 @@ export const elopageWebhook = async (req: any, res: any): Promise => { } // Do we already have such a user? - if ((await dbUser.count({ email })) !== 0) { + // if ((await dbUser.count({ email })) !== 0) { + if ((await dbUserContact.count({ email })) !== 0) { // eslint-disable-next-line no-console console.log(`Did not create User - already exists with email: ${email}`) return diff --git a/database/entity/0048-add_user_contacts_table/User.ts b/database/entity/0048-add_user_contacts_table/User.ts index 010cb0c20..40bfa601a 100644 --- a/database/entity/0048-add_user_contacts_table/User.ts +++ b/database/entity/0048-add_user_contacts_table/User.ts @@ -43,12 +43,12 @@ export class User extends BaseEntity { @Column({ length: 255, unique: true, nullable: false, collation: 'utf8mb4_unicode_ci' }) email: string */ - @OneToOne(() => UserContact, { primary: true, cascade: true }) + @OneToOne(() => UserContact) @JoinColumn({ name: 'email_id' }) emailContact: UserContact @Column({ name: 'email_id', type: 'int', unsigned: true, nullable: true, default: null }) - emailId?: number | null + emailId: number | null @Column({ name: 'first_name', diff --git a/database/entity/0048-add_user_contacts_table/UserContact.ts b/database/entity/0048-add_user_contacts_table/UserContact.ts index 7c2dff3db..936e433a6 100644 --- a/database/entity/0048-add_user_contacts_table/UserContact.ts +++ b/database/entity/0048-add_user_contacts_table/UserContact.ts @@ -1,4 +1,13 @@ -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, DeleteDateColumn } from 'typeorm' +import { + BaseEntity, + Entity, + PrimaryGeneratedColumn, + Column, + DeleteDateColumn, + OneToOne, + JoinColumn, +} from 'typeorm' +import { User } from './User' @Entity('user_contacts', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) export class UserContact extends BaseEntity { @@ -14,6 +23,10 @@ export class UserContact extends BaseEntity { }) type: string + @OneToOne(() => User) + @JoinColumn({ name: 'user_id' }) + user: User + @Column({ name: 'user_id', type: 'int', unsigned: true, nullable: false }) userId: number diff --git a/database/migrations/0048-add_user_contacts_table.ts b/database/migrations/0048-add_user_contacts_table.ts index 49f647e39..d1b35a400 100644 --- a/database/migrations/0048-add_user_contacts_table.ts +++ b/database/migrations/0048-add_user_contacts_table.ts @@ -22,7 +22,7 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis \`email_checked\` tinyint(4) NOT NULL DEFAULT 0, \`phone\` varchar(255) COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, \`created_at\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - \`updated_at\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + \`updated_at\` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, \`deleted_at\` datetime NULL DEFAULT NULL, PRIMARY KEY (\`id\`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) From 0f90f960ceb83570ed00b3609b73740c94052c9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Fri, 26 Aug 2022 02:40:44 +0200 Subject: [PATCH 050/304] remove unused code --- backend/src/typeorm/repository/User.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/backend/src/typeorm/repository/User.ts b/backend/src/typeorm/repository/User.ts index 21cafbb30..04a30de8f 100644 --- a/backend/src/typeorm/repository/User.ts +++ b/backend/src/typeorm/repository/User.ts @@ -4,15 +4,9 @@ import { User } from '@entity/User' @EntityRepository(User) export class UserRepository extends Repository { async findByPubkeyHex(pubkeyHex: string): Promise { - const user = await this.createQueryBuilder('user') + return await this.createQueryBuilder('user') .where('hex(user.pubKey) = :pubkeyHex', { pubkeyHex }) .getOneOrFail() - /* - user.emailContact = await this.createQueryBuilder('userContact') - .where('userContact.id = :user.emailId', { user.emailId }) - .getOneOrFail() - */ - return user } async findBySearchCriteriaPagedFiltered( From 1184666fe2062694d3a96c397181fdeb8d2a1fa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Fri, 26 Aug 2022 14:42:37 +0200 Subject: [PATCH 051/304] try to solve problem of dbUser-entity with emailContact in context --- backend/src/graphql/directive/isAuthorized.ts | 2 +- backend/src/typeorm/repository/User.ts | 20 +++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/backend/src/graphql/directive/isAuthorized.ts b/backend/src/graphql/directive/isAuthorized.ts index 065c01957..c24cde47a 100644 --- a/backend/src/graphql/directive/isAuthorized.ts +++ b/backend/src/graphql/directive/isAuthorized.ts @@ -31,7 +31,7 @@ const isAuthorized: AuthChecker = async ({ context }, rights) => { // TODO - load from database dynamically & admin - maybe encode this in the token to prevent many database requests // TODO this implementation is bullshit - two database queries cause our user identifiers are not aligned and vary between email, id and pubKey - const userRepository = await getCustomRepository(UserRepository) + const userRepository = getCustomRepository(UserRepository) try { const user = await userRepository.findByPubkeyHex(context.pubKey) context.user = user diff --git a/backend/src/typeorm/repository/User.ts b/backend/src/typeorm/repository/User.ts index 04a30de8f..3c859ce0c 100644 --- a/backend/src/typeorm/repository/User.ts +++ b/backend/src/typeorm/repository/User.ts @@ -1,12 +1,20 @@ import { Brackets, EntityRepository, ObjectLiteral, Repository } from '@dbTools/typeorm' -import { User } from '@entity/User' +import { User as DbUser } from '@entity/User' -@EntityRepository(User) -export class UserRepository extends Repository { - async findByPubkeyHex(pubkeyHex: string): Promise { - return await this.createQueryBuilder('user') +@EntityRepository(DbUser) +export class UserRepository extends Repository { + async findByPubkeyHex(pubkeyHex: string): Promise { + const dbUser = await this.createQueryBuilder('user') .where('hex(user.pubKey) = :pubkeyHex', { pubkeyHex }) .getOneOrFail() + /* + const dbUser = await this.findOneOrFail(`hex(user.pubKey) = { pubkeyHex }`) + const emailContact = await this.query( + `SELECT * from user_contacts where id = { dbUser.emailId }`, + ) + dbUser.emailContact = emailContact + */ + return dbUser } async findBySearchCriteriaPagedFiltered( @@ -15,7 +23,7 @@ export class UserRepository extends Repository { filterCriteria: ObjectLiteral[], currentPage: number, pageSize: number, - ): Promise<[User[], number]> { + ): Promise<[DbUser[], number]> { const query = await this.createQueryBuilder('user') .select(select) .withDeleted() From 1d1de2011a1f2bfc3691382da53f434232b6d877 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Fri, 26 Aug 2022 20:00:29 +0200 Subject: [PATCH 052/304] failed try to load OneToOne relation of user to userConmtact as emailConact-attribut... grrrrrr... --- backend/src/graphql/model/User.ts | 8 +++++--- backend/src/typeorm/repository/User.ts | 3 ++- database/entity/0048-add_user_contacts_table/User.ts | 2 +- .../entity/0048-add_user_contacts_table/UserContact.ts | 3 +-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/backend/src/graphql/model/User.ts b/backend/src/graphql/model/User.ts index a28fe4b69..e64df8294 100644 --- a/backend/src/graphql/model/User.ts +++ b/backend/src/graphql/model/User.ts @@ -12,13 +12,15 @@ export class User { this.gradidoID = user.gradidoID this.alias = user.alias this.emailId = user.emailId - this.email = user.emailContact.email - this.emailContact = user.emailContact + if (user.emailContact) { + this.email = user.emailContact.email + this.emailContact = user.emailContact + this.emailChecked = user.emailContact.emailChecked + } this.firstName = user.firstName this.lastName = user.lastName this.deletedAt = user.deletedAt this.createdAt = user.createdAt - this.emailChecked = user.emailContact.emailChecked this.language = user.language this.publisherId = user.publisherId this.isAdmin = user.isAdmin diff --git a/backend/src/typeorm/repository/User.ts b/backend/src/typeorm/repository/User.ts index 3c859ce0c..b347fae40 100644 --- a/backend/src/typeorm/repository/User.ts +++ b/backend/src/typeorm/repository/User.ts @@ -5,6 +5,7 @@ import { User as DbUser } from '@entity/User' export class UserRepository extends Repository { async findByPubkeyHex(pubkeyHex: string): Promise { const dbUser = await this.createQueryBuilder('user') + .leftJoinAndSelect('user.emailContact', 'emailContact') .where('hex(user.pubKey) = :pubkeyHex', { pubkeyHex }) .getOneOrFail() /* @@ -24,7 +25,7 @@ export class UserRepository extends Repository { currentPage: number, pageSize: number, ): Promise<[DbUser[], number]> { - const query = await this.createQueryBuilder('user') + const query = this.createQueryBuilder('user') .select(select) .withDeleted() .where( diff --git a/database/entity/0048-add_user_contacts_table/User.ts b/database/entity/0048-add_user_contacts_table/User.ts index 40bfa601a..6c4bf52f1 100644 --- a/database/entity/0048-add_user_contacts_table/User.ts +++ b/database/entity/0048-add_user_contacts_table/User.ts @@ -43,7 +43,7 @@ export class User extends BaseEntity { @Column({ length: 255, unique: true, nullable: false, collation: 'utf8mb4_unicode_ci' }) email: string */ - @OneToOne(() => UserContact) + @OneToOne(() => UserContact, (emailContact) => emailContact.userId) @JoinColumn({ name: 'email_id' }) emailContact: UserContact diff --git a/database/entity/0048-add_user_contacts_table/UserContact.ts b/database/entity/0048-add_user_contacts_table/UserContact.ts index 936e433a6..942a7de4f 100644 --- a/database/entity/0048-add_user_contacts_table/UserContact.ts +++ b/database/entity/0048-add_user_contacts_table/UserContact.ts @@ -23,8 +23,7 @@ export class UserContact extends BaseEntity { }) type: string - @OneToOne(() => User) - @JoinColumn({ name: 'user_id' }) + @OneToOne(() => User, (user) => user.emailContact) user: User @Column({ name: 'user_id', type: 'int', unsigned: true, nullable: false }) From 7269b4b67b1eb46b2c3e978ab30ca063ab807609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 30 Aug 2022 00:57:57 +0200 Subject: [PATCH 053/304] solve problems reading user with emailcontact --- backend/src/graphql/model/User.ts | 2 +- backend/src/graphql/model/UserContact.ts | 4 ++-- backend/src/graphql/resolver/UserResolver.ts | 6 +----- database/entity/0048-add_user_contacts_table/User.ts | 4 ++-- database/entity/0048-add_user_contacts_table/UserContact.ts | 2 +- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/backend/src/graphql/model/User.ts b/backend/src/graphql/model/User.ts index e64df8294..8d56c6775 100644 --- a/backend/src/graphql/model/User.ts +++ b/backend/src/graphql/model/User.ts @@ -14,7 +14,7 @@ export class User { this.emailId = user.emailId if (user.emailContact) { this.email = user.emailContact.email - this.emailContact = user.emailContact + this.emailContact = new UserContact(user.emailContact) this.emailChecked = user.emailContact.emailChecked } this.firstName = user.firstName diff --git a/backend/src/graphql/model/UserContact.ts b/backend/src/graphql/model/UserContact.ts index 902e2f9f2..fda79559f 100644 --- a/backend/src/graphql/model/UserContact.ts +++ b/backend/src/graphql/model/UserContact.ts @@ -1,9 +1,9 @@ import { ObjectType, Field } from 'type-graphql' -import { UserContact as dbUserCOntact} from '@entity/UserContact' +import { UserContact as dbUserContact} from '@entity/UserContact' @ObjectType() export class UserContact { - constructor(userContact: dbUserCOntact) { + constructor(userContact: dbUserContact) { this.id = userContact.id this.type = userContact.type this.userId = userContact.userId diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 37a9946a7..2ed77dbdd 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -850,11 +850,7 @@ export class UserResolver { @Query(() => Boolean) async hasElopage(@Ctx() context: Context): Promise { logger.info(`hasElopage()...`) - const userEntity = context.user - if (!userEntity) { - logger.info('missing context.user for EloPage-check') - return false - } + const userEntity = getUser(context) const elopageBuys = hasElopageBuys(userEntity.emailContact.email) logger.debug(`has ElopageBuys = ${elopageBuys}`) return elopageBuys diff --git a/database/entity/0048-add_user_contacts_table/User.ts b/database/entity/0048-add_user_contacts_table/User.ts index 6c4bf52f1..ab79c8ffa 100644 --- a/database/entity/0048-add_user_contacts_table/User.ts +++ b/database/entity/0048-add_user_contacts_table/User.ts @@ -43,7 +43,7 @@ export class User extends BaseEntity { @Column({ length: 255, unique: true, nullable: false, collation: 'utf8mb4_unicode_ci' }) email: string */ - @OneToOne(() => UserContact, (emailContact) => emailContact.userId) + @OneToOne(() => UserContact, (emailContact) => emailContact.user) @JoinColumn({ name: 'email_id' }) emailContact: UserContact @@ -115,7 +115,7 @@ export class User extends BaseEntity { @JoinColumn({ name: 'user_id' }) contributions?: Contribution[] - @OneToMany(() => UserContact, (usercontact) => usercontact.userId) + @OneToMany(() => UserContact, (usercontact) => usercontact.user) @JoinColumn({ name: 'user_id' }) usercontacts?: UserContact[] } diff --git a/database/entity/0048-add_user_contacts_table/UserContact.ts b/database/entity/0048-add_user_contacts_table/UserContact.ts index 942a7de4f..20732ae6f 100644 --- a/database/entity/0048-add_user_contacts_table/UserContact.ts +++ b/database/entity/0048-add_user_contacts_table/UserContact.ts @@ -53,7 +53,7 @@ export class UserContact extends BaseEntity { @Column({ name: 'created_at', default: () => 'CURRENT_TIMESTAMP', nullable: false }) createdAt: Date - @DeleteDateColumn({ name: 'updated_at', nullable: true }) + @Column({ name: 'updated_at', nullable: true, default: null, type: 'datetime' }) updatedAt: Date | null @DeleteDateColumn({ name: 'deleted_at', nullable: true }) From f5ee1614f8ddeacf86134985a391a1fba2ea0d34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Wed, 31 Aug 2022 01:06:59 +0200 Subject: [PATCH 054/304] add precision of 3 milliseconds on datetime collumns --- .../0048-add_user_contacts_table.ts | 34 ++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/database/migrations/0048-add_user_contacts_table.ts b/database/migrations/0048-add_user_contacts_table.ts index d1b35a400..f2a436e53 100644 --- a/database/migrations/0048-add_user_contacts_table.ts +++ b/database/migrations/0048-add_user_contacts_table.ts @@ -10,6 +10,7 @@ import { v4 as uuidv4 } from 'uuid' export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` CREATE TABLE IF NOT EXISTS \`user_contacts\` ( \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, @@ -21,13 +22,25 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis \`email_resend_count\` int DEFAULT '0', \`email_checked\` tinyint(4) NOT NULL DEFAULT 0, \`phone\` varchar(255) COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, - \`created_at\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - \`updated_at\` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, - \`deleted_at\` datetime NULL DEFAULT NULL, + \`created_at\` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + \`updated_at\` datetime(3) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(3), + \`deleted_at\` datetime(3) NULL DEFAULT NULL, PRIMARY KEY (\`id\`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) await queryFn('ALTER TABLE `users` ADD COLUMN `email_id` int(10) NULL AFTER `email`;') + // define datetime column with a precision of 3 milliseconds + await queryFn( + 'ALTER TABLE `users` MODIFY COLUMN `created` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) AFTER `email_hash`;', + ) + // define datetime column with a precision of 3 milliseconds + await queryFn( + 'ALTER TABLE `users` MODIFY COLUMN `deletedAt` datetime(3) NULL DEFAULT NULL AFTER `last_name`;', + ) + // define datetime column with a precision of 3 milliseconds + await queryFn( + 'ALTER TABLE `users` MODIFY COLUMN `is_admin` datetime(3) NULL DEFAULT NULL AFTER `language`;', + ) // merge values from login_email_opt_in table with users.email in new user_contacts table await queryFn(` @@ -58,13 +71,26 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis `UPDATE users as u SET u.email_id = "${contact.id}" WHERE u.id = "${contact.user_id}"`, ) } - // this step comes after verification and test + // these steps comes after verification and test await queryFn('ALTER TABLE users DROP COLUMN email;') + await queryFn('ALTER TABLE users DROP COLUMN email_checked;') } export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { // this step comes after verification and test await queryFn('ALTER TABLE users ADD COLUMN email varchar(255) NULL AFTER privkey;') + await queryFn( + 'ALTER TABLE users ADD COLUMN email_checked tinyint(4) NOT NULL DEFAULT 0 AFTER email;', + ) + await queryFn( + 'ALTER TABLE `users` MODIFY COLUMN `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `email_hash`;', + ) + await queryFn( + 'ALTER TABLE `users` MODIFY COLUMN `deletedAt` datetime NULL DEFAULT NULL AFTER `last_name`;', + ) + await queryFn( + 'ALTER TABLE `users` MODIFY COLUMN `is_admin` datetime NULL DEFAULT NULL AFTER `language`;', + ) // reconstruct the previous email back from contacts to users table const contacts = await queryFn(`SELECT c.id, c.email, c.user_id FROM user_contacts as c`) From 852c4e64992f052bea193eb306ec0aa348a9e80f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Wed, 31 Aug 2022 01:12:12 +0200 Subject: [PATCH 055/304] change seeding now with UserContacts entry --- backend/src/graphql/resolver/UserResolver.ts | 19 ++++++++++++------- backend/src/seeds/factory/user.ts | 19 ++++++++++++++----- backend/src/seeds/index.ts | 11 ++++++++++- 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 2ed77dbdd..6a59ee22f 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -371,7 +371,7 @@ export class UserResolver { logger.debug('login credentials valid...') const user = new User(dbUser, await getUserCreation(dbUser.id)) - logger.debug('user=' + user) + logger.debug(`user= ${JSON.stringify(user, null, 2)}`) // Elopage Status & Stored PublisherId user.hasElopage = await this.hasElopage({ ...context, user: dbUser }) @@ -389,7 +389,7 @@ export class UserResolver { const ev = new EventLogin() ev.userId = user.id eventProtocol.writeEvent(new Event().setEventLogin(ev)) - logger.info('successful Login:' + user) + logger.info(`successful Login: ${JSON.stringify(user, null, 2)}`) return user } @@ -665,14 +665,14 @@ export class UserResolver { `email was sent more than ${printTimeDuration(CONFIG.EMAIL_CODE_VALID_TIME)} ago`, ) } - logger.debug('optInCode is valid...') + logger.debug('EmailVerificationCode is valid...') // load user const user = await DbUser.findOneOrFail({ id: userContact.userId }).catch(() => { logger.error('Could not find corresponding Login User') throw new Error('Could not find corresponding Login User') }) - logger.debug('user with optInCode found...') + logger.debug('user with EmailVerificationCode found...') // Generate Passphrase if needed if (!user.passphrase) { @@ -713,12 +713,17 @@ export class UserResolver { logger.error('error saving user: ' + error) throw new Error('error saving user: ' + error) }) + // Save userContact + await queryRunner.manager.save(userContact).catch((error) => { + logger.error('error saving userContact: ' + error) + throw new Error('error saving userContact: ' + error) + }) await queryRunner.commitTransaction() - logger.info('User data written successfully...') + logger.info('User and UserContact data written successfully...') } catch (e) { await queryRunner.rollbackTransaction() - logger.error('Error on writing User data:' + e) + logger.error('Error on writing User and UserContact data:' + e) throw e } finally { await queryRunner.release() @@ -896,7 +901,7 @@ async function findUserByEmail(email: string): Promise { throw new Error('No user with this credentials') }) const userId = dbUserContact.userId - const dbUser = await DbUser.findOneOrFail(userId).catch(() => { + const dbUser = await DbUser.findOneOrFail({ id: userId }, { withDeleted: true }).catch(() => { logger.error(`User with emailContact=${email} connected per userId=${userId} does not exist`) throw new Error('No user with this credentials') }) diff --git a/backend/src/seeds/factory/user.ts b/backend/src/seeds/factory/user.ts index d94f94b3c..c2eb20bc4 100644 --- a/backend/src/seeds/factory/user.ts +++ b/backend/src/seeds/factory/user.ts @@ -1,8 +1,8 @@ import { createUser, setPassword } from '@/seeds/graphql/mutations' import { User } from '@entity/User' -import { LoginEmailOptIn } from '@entity/LoginEmailOptIn' import { UserInterface } from '@/seeds/users/UserInterface' import { ApolloServerTestClient } from 'apollo-server-testing' +import { UserContact } from '@entity/UserContact' export const userFactory = async ( client: ApolloServerTestClient, @@ -15,17 +15,23 @@ export const userFactory = async ( createUser: { id }, }, } = await mutate({ mutation: createUser, variables: user }) + // console.log('creatUser:', { id }, { user }) + // get user from database + let dbUser = await User.findOneOrFail({ id }) + // console.log('dbUser:', dbUser) + + const emailContact = await UserContact.findOneOrFail({ userId: id }) + // console.log('emailContact:', emailContact) if (user.emailChecked) { - const optin = await LoginEmailOptIn.findOneOrFail({ userId: id }) await mutate({ mutation: setPassword, - variables: { password: 'Aa12345_', code: optin.verificationCode }, + variables: { password: 'Aa12345_', code: emailContact.emailVerificationCode }, }) } - // get user from database - const dbUser = await User.findOneOrFail({ id }) + // get last changes of user from database + dbUser = await User.findOneOrFail({ id }) if (user.createdAt || user.deletedAt || user.isAdmin) { if (user.createdAt) dbUser.createdAt = user.createdAt @@ -34,5 +40,8 @@ export const userFactory = async ( await dbUser.save() } + // get last changes of user from database + dbUser = await User.findOneOrFail({ id }, { withDeleted: true }) + return dbUser } diff --git a/backend/src/seeds/index.ts b/backend/src/seeds/index.ts index 8e9a4e2d8..c5a55cb84 100644 --- a/backend/src/seeds/index.ts +++ b/backend/src/seeds/index.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +import { backendLogger as logger } from '@/server/logger' import createServer from '../server/createServer' import { createTestClient } from 'apollo-server-testing' @@ -50,11 +51,14 @@ const run = async () => { const seedClient = createTestClient(server.apollo) const { con } = server await cleanDB() + logger.info('##seed## clean database successful...') // seed the standard users for (let i = 0; i < users.length; i++) { - await userFactory(seedClient, users[i]) + const dbUser = await userFactory(seedClient, users[i]) + logger.info(`##seed## seed standard users[ ${i} ]= ${JSON.stringify(dbUser, null, 2)}`) } + logger.info('##seed## seeding all standard users successful...') // seed 100 random users for (let i = 0; i < 100; i++) { @@ -64,7 +68,9 @@ const run = async () => { email: internet.email(), language: datatype.boolean() ? 'en' : 'de', }) + logger.info(`##seed## seed ${i}. random user`) } + logger.info('##seed## seeding all random users successful...') // create GDD for (let i = 0; i < creations.length; i++) { @@ -73,16 +79,19 @@ const run = async () => { // eslint-disable-next-line no-empty while (new Date().getTime() < now + 1000) {} // we have to wait a little! quick fix for account sum problem of bob@baumeister.de, (see https://github.com/gradido/gradido/issues/1886) } + logger.info('##seed## seeding all creations successful...') // create Transaction Links for (let i = 0; i < transactionLinks.length; i++) { await transactionLinkFactory(seedClient, transactionLinks[i]) } + logger.info('##seed## seeding all transactionLinks successful...') // create Contribution Links for (let i = 0; i < contributionLinks.length; i++) { await contributionLinkFactory(seedClient, contributionLinks[i]) } + logger.info('##seed## seeding all contributionLinks successful...') await con.close() } From faa0500f100f2ba64b5d71c165610df75bbe818d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Wed, 31 Aug 2022 15:44:41 +0200 Subject: [PATCH 056/304] adapt seeding using User and UserContact --- backend/src/graphql/model/UserContact.ts | 2 +- backend/src/graphql/resolver/AdminResolver.ts | 9 ++++-- backend/src/graphql/resolver/UserResolver.ts | 7 +++-- .../src/graphql/resolver/util/creations.ts | 14 +++++++-- backend/src/seeds/factory/creation.ts | 29 +++++++++++++++++-- 5 files changed, 50 insertions(+), 11 deletions(-) diff --git a/backend/src/graphql/model/UserContact.ts b/backend/src/graphql/model/UserContact.ts index fda79559f..796c7f5f3 100644 --- a/backend/src/graphql/model/UserContact.ts +++ b/backend/src/graphql/model/UserContact.ts @@ -1,5 +1,5 @@ import { ObjectType, Field } from 'type-graphql' -import { UserContact as dbUserContact} from '@entity/UserContact' +import { UserContact as dbUserContact } from '@entity/UserContact' @ObjectType() export class UserContact { diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 5d283026d..7fde128c9 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -32,7 +32,6 @@ import { TransactionRepository } from '@repository/Transaction' import { calculateDecay } from '@/util/decay' import { Contribution } from '@entity/Contribution' import { hasElopageBuys } from '@/util/hasElopageBuys' -import { LoginEmailOptIn } from '@entity/LoginEmailOptIn' import { User as dbUser } from '@entity/User' import { User } from '@model/User' import { TransactionTypeId } from '@enum/TransactionTypeId' @@ -44,7 +43,7 @@ import Paginated from '@arg/Paginated' import TransactionLinkFilters from '@arg/TransactionLinkFilters' import { Order } from '@enum/Order' import { communityUser } from '@/util/communityUser' -import { checkEmailVerificationCode, activationLink, printTimeDuration } from './UserResolver' +import { activationLink, printTimeDuration } from './UserResolver' import { sendAccountActivationEmail } from '@/mailer/sendAccountActivationEmail' import { transactionLinkCode as contributionLinkCode } from './TransactionLinkResolver' import CONFIG from '@/config' @@ -247,6 +246,9 @@ export class AdminResolver { @Args() { email, amount, memo, creationDate }: AdminCreateContributionArgs, @Ctx() context: Context, ): Promise { + logger.info( + `adminCreateContribution(email=${email}, amount=${amount}, memo=${memo}, creationDate=${creationDate})`, + ) const emailContact = await UserContact.findOne({ email }, { withDeleted: true }) if (!emailContact) { logger.error(`Could not find user with email: ${email}`) @@ -263,8 +265,9 @@ export class AdminResolver { const moderator = getUser(context) logger.trace('moderator: ', moderator.id) const creations = await getUserCreation(emailContact.userId) - logger.trace('creations', creations) + logger.trace('creations:', creations) const creationDateObj = new Date(creationDate) + logger.trace('creationDateObj:', creationDateObj) validateContribution(creations, amount, creationDateObj) const contribution = Contribution.create() contribution.userId = emailContact.userId diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 6a59ee22f..514c52973 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -16,7 +16,6 @@ import UnsecureLoginArgs from '@arg/UnsecureLoginArgs' import UpdateUserInfosArgs from '@arg/UpdateUserInfosArgs' import { klicktippNewsletterStateMiddleware } from '@/middleware/klicktippMiddleware' import { OptInType } from '@enum/OptInType' -import { LoginEmailOptIn } from '@entity/LoginEmailOptIn' import { sendResetPasswordEmail as sendResetPasswordEmailMailer } from '@/mailer/sendResetPasswordEmail' import { sendAccountActivationEmail } from '@/mailer/sendAccountActivationEmail' import { sendAccountMultiRegistrationEmail } from '@/mailer/sendAccountMultiRegistrationEmail' @@ -148,6 +147,7 @@ const SecretKeyCryptographyCreateKey = (salt: string, password: string): Buffer[ return [encryptionKeyHash, encryptionKey] } +/* const getEmailHash = (email: string): Buffer => { logger.trace('getEmailHash...') const emailHash = Buffer.alloc(sodium.crypto_generichash_BYTES) @@ -155,6 +155,7 @@ const getEmailHash = (email: string): Buffer => { logger.debug(`getEmailHash...successful: ${emailHash}`) return emailHash } +*/ const SecretKeyCryptographyEncrypt = (message: Buffer, encryptionKey: Buffer): Buffer => { logger.trace('SecretKeyCryptographyEncrypt...') @@ -191,7 +192,7 @@ const newEmailContact = (email: string, userId: number): DbUserContact => { logger.debug(`newEmailContact...successful: ${emailContact}`) return emailContact } - +/* const newEmailOptIn = (userId: number): LoginEmailOptIn => { logger.trace('newEmailOptIn...') const emailOptIn = new LoginEmailOptIn() @@ -201,7 +202,7 @@ const newEmailOptIn = (userId: number): LoginEmailOptIn => { logger.debug(`newEmailOptIn...successful: ${emailOptIn}`) return emailOptIn } - +*/ /* // needed by AdminResolver // checks if given code exists and can be resent diff --git a/backend/src/graphql/resolver/util/creations.ts b/backend/src/graphql/resolver/util/creations.ts index ad15ebec6..4f1cec0e0 100644 --- a/backend/src/graphql/resolver/util/creations.ts +++ b/backend/src/graphql/resolver/util/creations.ts @@ -15,14 +15,21 @@ export const validateContribution = ( amount: Decimal, creationDate: Date, ): void => { - logger.trace('isContributionValid', creations, amount, creationDate) + logger.trace('isContributionValid: ', creations, amount, creationDate) const index = getCreationIndex(creationDate.getMonth()) if (index < 0) { + logger.error( + 'No information for available creations with the given creationDate=', + creationDate, + ) throw new Error('No information for available creations for the given date') } if (amount.greaterThan(creations[index].toString())) { + logger.error( + `The amount (${amount} GDD) to be created exceeds the amount (${creations[index]} GDD) still available for this month.`, + ) throw new Error( `The amount (${amount} GDD) to be created exceeds the amount (${creations[index]} GDD) still available for this month.`, ) @@ -41,7 +48,7 @@ export const getUserCreations = async ( await queryRunner.connect() const dateFilter = 'last_day(curdate() - interval 3 month) + interval 1 day' - logger.trace('getUserCreations dateFilter', dateFilter) + logger.trace('getUserCreations dateFilter=', dateFilter) const unionString = includePending ? ` @@ -51,6 +58,7 @@ export const getUserCreations = async ( AND contribution_date >= ${dateFilter} AND confirmed_at IS NULL AND deleted_at IS NULL` : '' + logger.trace('getUserCreations unionString=', unionString) const unionQuery = await queryRunner.manager.query(` SELECT MONTH(date) AS month, sum(amount) AS sum, userId AS id FROM @@ -62,6 +70,7 @@ export const getUserCreations = async ( GROUP BY month, userId ORDER BY date DESC `) + logger.trace('getUserCreations unionQuery=', unionQuery) await queryRunner.release() @@ -82,6 +91,7 @@ export const getUserCreations = async ( export const getUserCreation = async (id: number, includePending = true): Promise => { logger.trace('getUserCreation', id, includePending) const creations = await getUserCreations([id], includePending) + logger.trace('getUserCreation creations=', creations) return creations[0] ? creations[0].creations : FULL_CREATION_AVAILABLE } diff --git a/backend/src/seeds/factory/creation.ts b/backend/src/seeds/factory/creation.ts index d3f0f78ca..05be6d28e 100644 --- a/backend/src/seeds/factory/creation.ts +++ b/backend/src/seeds/factory/creation.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +import { backendLogger as logger } from '@/server/logger' import { adminCreateContribution, confirmContribution } from '@/seeds/graphql/mutations' import { login } from '@/seeds/graphql/queries' import { CreationInterface } from '@/seeds/creation/CreationInterface' @@ -8,6 +9,7 @@ import { ApolloServerTestClient } from 'apollo-server-testing' import { User } from '@entity/User' import { Transaction } from '@entity/Transaction' import { Contribution } from '@entity/Contribution' +import { UserContact } from '@entity/UserContact' // import CONFIG from '@/config/index' export const nMonthsBefore = (date: Date, months = 1): string => { @@ -19,29 +21,46 @@ export const creationFactory = async ( creation: CreationInterface, ): Promise => { const { mutate, query } = client - + logger.trace('creationFactory...') await query({ query: login, variables: { email: 'peter@lustig.de', password: 'Aa12345_' } }) + logger.trace('creationFactory... after login') // TODO it would be nice to have this mutation return the id await mutate({ mutation: adminCreateContribution, variables: { ...creation } }) + logger.trace('creationFactory... after adminCreateContribution') - const user = await User.findOneOrFail({ where: { email: creation.email } }) + const userContact = await UserContact.findOneOrFail({ where: { email: creation.email } }) + logger.trace('creationFactory... after UserContact.findOneOrFail userContact=', userContact) + const user = await User.findOneOrFail({ where: { id: userContact.userId } }) + logger.trace('creationFactory... after User.findOneOrFail user=', user) const pendingCreation = await Contribution.findOneOrFail({ where: { userId: user.id, amount: creation.amount }, order: { createdAt: 'DESC' }, }) + logger.trace( + 'creationFactory... after Contribution.findOneOrFail pendingCreation=', + pendingCreation, + ) if (creation.confirmed) { + logger.trace('creationFactory... creation.confirmed=', creation.confirmed) await mutate({ mutation: confirmContribution, variables: { id: pendingCreation.id } }) + logger.trace('creationFactory... after confirmContribution') const confirmedCreation = await Contribution.findOneOrFail({ id: pendingCreation.id }) + logger.trace( + 'creationFactory... after Contribution.findOneOrFail confirmedCreation=', + confirmedCreation, + ) if (creation.moveCreationDate) { + logger.trace('creationFactory... creation.moveCreationDate=', creation.moveCreationDate) const transaction = await Transaction.findOneOrFail({ where: { userId: user.id, creationDate: new Date(creation.creationDate) }, order: { balanceDate: 'DESC' }, }) + logger.trace('creationFactory... after Transaction.findOneOrFail transaction=', transaction) if (transaction.decay.equals(0) && transaction.creationDate) { confirmedCreation.contributionDate = new Date( nMonthsBefore(transaction.creationDate, creation.moveCreationDate), @@ -52,11 +71,17 @@ export const creationFactory = async ( transaction.balanceDate = new Date( nMonthsBefore(transaction.balanceDate, creation.moveCreationDate), ) + logger.trace('creationFactory... before transaction.save transaction=', transaction) await transaction.save() + logger.trace( + 'creationFactory... before confirmedCreation.save confirmedCreation=', + confirmedCreation, + ) await confirmedCreation.save() } } } else { + logger.trace('creationFactory... pendingCreation=', pendingCreation) return pendingCreation } } From eedaf9e6e3d75d63fcb57bf1dc208e30e5ef4ee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Wed, 31 Aug 2022 23:04:55 +0200 Subject: [PATCH 057/304] unit tests of AdminResolver now with Users and UserContacts --- .../graphql/resolver/AdminResolver.test.ts | 4 ++- backend/src/graphql/resolver/AdminResolver.ts | 36 +++++++++++++------ backend/src/seeds/factory/creation.ts | 12 +++---- backend/src/typeorm/repository/User.ts | 22 ++++++++++-- 4 files changed, 54 insertions(+), 20 deletions(-) diff --git a/backend/src/graphql/resolver/AdminResolver.test.ts b/backend/src/graphql/resolver/AdminResolver.test.ts index f0ce064b4..9de1a7116 100644 --- a/backend/src/graphql/resolver/AdminResolver.test.ts +++ b/backend/src/graphql/resolver/AdminResolver.test.ts @@ -1117,7 +1117,9 @@ describe('AdminResolver', () => { }), ).resolves.toEqual( expect.objectContaining({ - errors: [new GraphQLError('Could not find user with email: bob@baumeister.de')], + errors: [ + new GraphQLError('Could not find UserContact with email: bob@baumeister.de'), + ], }), ) }) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 7fde128c9..34819ae73 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -75,24 +75,24 @@ export class AdminResolver { { searchText, currentPage = 1, pageSize = 25, filters }: SearchUsersArgs, ): Promise { const userRepository = getCustomRepository(UserRepository) - + /* const filterCriteria: ObjectLiteral[] = [] if (filters) { if (filters.byActivated !== null) { - filterCriteria.push({ emailChecked: filters.byActivated }) + filterCriteria.push({ 'emailContact.emailChecked': filters.byActivated }) } if (filters.byDeleted !== null) { filterCriteria.push({ deletedAt: filters.byDeleted ? Not(IsNull()) : IsNull() }) } } - + */ const userFields = [ 'id', 'firstName', 'lastName', - 'email', - 'emailChecked', + 'emailId', + 'emailContact', 'deletedAt', 'isAdmin', ] @@ -101,7 +101,7 @@ export class AdminResolver { return 'user.' + fieldName }), searchText, - filterCriteria, + filters, currentPage, pageSize, ) @@ -249,7 +249,11 @@ export class AdminResolver { logger.info( `adminCreateContribution(email=${email}, amount=${amount}, memo=${memo}, creationDate=${creationDate})`, ) - const emailContact = await UserContact.findOne({ email }, { withDeleted: true }) + const emailContact = await UserContact.findOne({ + where: { email }, + withDeleted: true, + relations: ['user'], + }) if (!emailContact) { logger.error(`Could not find user with email: ${email}`) throw new Error(`Could not find user with email: ${email}`) @@ -258,6 +262,10 @@ export class AdminResolver { logger.error('This emailContact was deleted. Cannot create a contribution.') throw new Error('This emailContact was deleted. Cannot create a contribution.') } + if (emailContact.user.deletedAt) { + logger.error('This user was deleted. Cannot create a contribution.') + throw new Error('This user was deleted. Cannot create a contribution.') + } if (!emailContact.emailChecked) { logger.error('Contribution could not be saved, Email is not activated') throw new Error('Contribution could not be saved, Email is not activated') @@ -317,12 +325,16 @@ export class AdminResolver { @Args() { id, email, amount, memo, creationDate }: AdminUpdateContributionArgs, @Ctx() context: Context, ): Promise { - const emailContact = await UserContact.findOne({ email }, { withDeleted: true }) + const emailContact = await UserContact.findOne({ + where: { email }, + withDeleted: true, + relations: ['user'], + }) if (!emailContact) { logger.error(`Could not find UserContact with email: ${email}`) throw new Error(`Could not find UserContact with email: ${email}`) } - const user = await dbUser.findOne({ id: emailContact.userId }, { withDeleted: true }) + const user = emailContact.user if (!user) { logger.error(`Could not find User to emailContact: ${email}`) throw new Error(`Could not find User to emailContact: ${email}`) @@ -388,7 +400,11 @@ export class AdminResolver { const userIds = contributions.map((p) => p.userId) const userCreations = await getUserCreations(userIds) - const users = await dbUser.find({ where: { id: In(userIds) }, withDeleted: true }) + const users = await dbUser.find({ + where: { id: In(userIds) }, + withDeleted: true, + relations: ['emailContact'], + }) return contributions.map((contribution) => { const user = users.find((u) => u.id === contribution.userId) diff --git a/backend/src/seeds/factory/creation.ts b/backend/src/seeds/factory/creation.ts index 05be6d28e..7f19e2828 100644 --- a/backend/src/seeds/factory/creation.ts +++ b/backend/src/seeds/factory/creation.ts @@ -24,15 +24,16 @@ export const creationFactory = async ( logger.trace('creationFactory...') await query({ query: login, variables: { email: 'peter@lustig.de', password: 'Aa12345_' } }) logger.trace('creationFactory... after login') - // TODO it would be nice to have this mutation return the id await mutate({ mutation: adminCreateContribution, variables: { ...creation } }) logger.trace('creationFactory... after adminCreateContribution') - const userContact = await UserContact.findOneOrFail({ where: { email: creation.email } }) + const userContact = await UserContact.findOneOrFail({ + where: { email: creation.email }, + relations: ['user'], + }) logger.trace('creationFactory... after UserContact.findOneOrFail userContact=', userContact) - const user = await User.findOneOrFail({ where: { id: userContact.userId } }) - logger.trace('creationFactory... after User.findOneOrFail user=', user) + const user = userContact.user const pendingCreation = await Contribution.findOneOrFail({ where: { userId: user.id, amount: creation.amount }, @@ -42,12 +43,10 @@ export const creationFactory = async ( 'creationFactory... after Contribution.findOneOrFail pendingCreation=', pendingCreation, ) - if (creation.confirmed) { logger.trace('creationFactory... creation.confirmed=', creation.confirmed) await mutate({ mutation: confirmContribution, variables: { id: pendingCreation.id } }) logger.trace('creationFactory... after confirmContribution') - const confirmedCreation = await Contribution.findOneOrFail({ id: pendingCreation.id }) logger.trace( 'creationFactory... after Contribution.findOneOrFail confirmedCreation=', @@ -61,6 +60,7 @@ export const creationFactory = async ( order: { balanceDate: 'DESC' }, }) logger.trace('creationFactory... after Transaction.findOneOrFail transaction=', transaction) + if (transaction.decay.equals(0) && transaction.creationDate) { confirmedCreation.contributionDate = new Date( nMonthsBefore(transaction.creationDate, creation.moveCreationDate), diff --git a/backend/src/typeorm/repository/User.ts b/backend/src/typeorm/repository/User.ts index b347fae40..8b3e29859 100644 --- a/backend/src/typeorm/repository/User.ts +++ b/backend/src/typeorm/repository/User.ts @@ -1,4 +1,5 @@ -import { Brackets, EntityRepository, ObjectLiteral, Repository } from '@dbTools/typeorm' +import SearchUsersFilters from '@/graphql/arg/SearchUsersFilters' +import { Brackets, EntityRepository, IsNull, Not, Repository } from '@dbTools/typeorm' import { User as DbUser } from '@entity/User' @EntityRepository(DbUser) @@ -21,17 +22,18 @@ export class UserRepository extends Repository { async findBySearchCriteriaPagedFiltered( select: string[], searchCriteria: string, - filterCriteria: ObjectLiteral[], + filters: SearchUsersFilters, currentPage: number, pageSize: number, ): Promise<[DbUser[], number]> { const query = this.createQueryBuilder('user') .select(select) + .leftJoinAndSelect('user.emailContact', 'emailContact') .withDeleted() .where( new Brackets((qb) => { qb.where( - 'user.firstName like :name or user.lastName like :lastName or user.email like :email', + 'user.firstName like :name or user.lastName like :lastName or emailContact.email like :email', { name: `%${searchCriteria}%`, lastName: `%${searchCriteria}%`, @@ -40,9 +42,23 @@ export class UserRepository extends Repository { ) }), ) + /* filterCriteria.forEach((filter) => { query.andWhere(filter) }) + */ + if (filters) { + if (filters.byActivated !== null) { + query.andWhere('emailContact.emailChecked = :value', { value: filters.byActivated }) + // filterCriteria.push({ 'emailContact.emailChecked': filters.byActivated }) + } + + if (filters.byDeleted !== null) { + // filterCriteria.push({ deletedAt: filters.byDeleted ? Not(IsNull()) : IsNull() }) + query.andWhere({ deletedAt: filters.byDeleted ? Not(IsNull()) : IsNull() }) + } + } + return query .take(pageSize) .skip((currentPage - 1) * pageSize) From a0fe5f79519af1cfff7c9b82bf0926dba43b00f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Thu, 1 Sep 2022 01:07:25 +0200 Subject: [PATCH 058/304] adapt UserResolverTest to work with Users and UserContacts --- .../src/graphql/resolver/UserResolver.test.ts | 68 ++++++++++--------- backend/src/graphql/resolver/UserResolver.ts | 6 +- 2 files changed, 39 insertions(+), 35 deletions(-) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 51f6ce073..14edc7343 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -22,6 +22,9 @@ import { ContributionLink } from '@model/ContributionLink' import { logger } from '@test/testSetup' import { validate as validateUUID, version as versionUUID } from 'uuid' import { peterLustig } from '@/seeds/users/peter-lustig' +import { UserContact } from '@entity/UserContact' +import { OptInType } from '../enum/OptInType' +import { UserContactType } from '../enum/UserContactType' // import { klicktippSignIn } from '@/apis/KlicktippController' @@ -82,7 +85,7 @@ describe('UserResolver', () => { } let result: any - let emailOptIn: string + let emailVerificationCode: string let user: User[] beforeAll(async () => { @@ -101,11 +104,11 @@ describe('UserResolver', () => { }) describe('valid input data', () => { - let loginEmailOptIn: LoginEmailOptIn[] + // let loginEmailOptIn: LoginEmailOptIn[] beforeAll(async () => { - user = await User.find() - loginEmailOptIn = await LoginEmailOptIn.find() - emailOptIn = loginEmailOptIn[0].verificationCode.toString() + user = await User.find({ relations: ['emailContact'] }) + // loginEmailOptIn = await LoginEmailOptIn.find() + emailVerificationCode = user[0].emailContact.emailVerificationCode.toString() }) describe('filling all tables', () => { @@ -115,8 +118,8 @@ describe('UserResolver', () => { id: expect.any(Number), gradidoID: expect.any(String), alias: null, - email: 'peter@lustig.de', - emailId: null, + emailContact: expect.any(UserContact), // 'peter@lustig.de', + emailId: expect.any(Number), firstName: 'Peter', lastName: 'Lustig', password: '0', @@ -124,7 +127,7 @@ describe('UserResolver', () => { privKey: null, // emailHash: expect.any(Buffer), createdAt: expect.any(Date), - emailChecked: false, + // emailChecked: false, passphrase: expect.any(String), language: 'de', isAdmin: null, @@ -141,17 +144,20 @@ describe('UserResolver', () => { }) it('creates an email optin', () => { - expect(loginEmailOptIn).toEqual([ - { - id: expect.any(Number), - userId: user[0].id, - verificationCode: expect.any(String), - emailOptInTypeId: 1, - createdAt: expect.any(Date), - resendCount: 0, - updatedAt: expect.any(Date), - }, - ]) + expect(user[0].emailContact).toEqual({ + id: expect.any(Number), + type: UserContactType.USER_CONTACT_EMAIL, + userId: user[0].id, + email: 'peter@lustig.de', + emailChecked: false, + emailVerificationCode: expect.any(String), + emailOptInTypeId: OptInType.EMAIL_OPT_IN_REGISTER, + emailResendCount: 0, + phone: null, + createdAt: expect.any(Date), + deletedAt: null, + updatedAt: null, + }) }) }) }) @@ -160,7 +166,7 @@ describe('UserResolver', () => { it('sends an account activation email', () => { const activationLink = CONFIG.EMAIL_LINK_VERIFICATION.replace( /{optin}/g, - emailOptIn, + emailVerificationCode, ).replace(/{code}/g, '') expect(sendAccountActivationEmail).toBeCalledWith({ link: activationLink, @@ -244,7 +250,7 @@ describe('UserResolver', () => { // activate account of admin Peter Lustig await mutate({ mutation: setPassword, - variables: { code: emailOptIn, password: 'Aa12345_' }, + variables: { code: emailVerificationCode, password: 'Aa12345_' }, }) // make Peter Lustig Admin const peter = await User.findOneOrFail({ id: user[0].id }) @@ -266,7 +272,9 @@ describe('UserResolver', () => { }) it('sets the contribution link id', async () => { - await expect(User.findOne({ email: 'ein@besucher.de' })).resolves.toEqual( + await expect( + UserContact.findOne({ email: 'ein@besucher.de' }, { relations: ['user'] }), + ).resolves.toEqual( expect.objectContaining({ contributionLinkId: link.id, }), @@ -616,13 +624,13 @@ bei Gradidio sei dabei!`, describe('user exists in DB', () => { let result: any - let loginEmailOptIn: LoginEmailOptIn[] + let emailContact: UserContact beforeAll(async () => { await userFactory(testEnv, bibiBloxberg) - await resetEntity(LoginEmailOptIn) + // await resetEntity(LoginEmailOptIn) result = await mutate({ mutation: forgotPassword, variables }) - loginEmailOptIn = await LoginEmailOptIn.find() + emailContact = await UserContact.findOneOrFail(variables) }) afterAll(async () => { @@ -630,18 +638,12 @@ bei Gradidio sei dabei!`, }) it('returns true', async () => { - await expect(result).toEqual( - expect.objectContaining({ - data: { - forgotPassword: true, - }, - }), - ) + expect(result).toEqual(expect.objectContaining({ data: { forgotPassword: true } })) }) it('sends reset password email', () => { expect(sendResetPasswordEmail).toBeCalledWith({ - link: activationLink(loginEmailOptIn[0]), + link: activationLink(emailContact.emailVerificationCode), firstName: 'Bibi', lastName: 'Bloxberg', email: 'bibi@bloxberg.de', diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 514c52973..0cde3c73a 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -896,17 +896,19 @@ export class UserResolver { async function findUserByEmail(email: string): Promise { const dbUserContact = await DbUserContact.findOneOrFail( { email: email }, - { withDeleted: true }, + { withDeleted: true, relations: ['user'] }, ).catch(() => { logger.error(`UserContact with email=${email} does not exists`) throw new Error('No user with this credentials') }) - const userId = dbUserContact.userId + const dbUser = dbUserContact.user + /* const dbUser = await DbUser.findOneOrFail({ id: userId }, { withDeleted: true }).catch(() => { logger.error(`User with emailContact=${email} connected per userId=${userId} does not exist`) throw new Error('No user with this credentials') }) dbUser.emailContact = dbUserContact + */ return dbUser } From 97dee4d67cf7318f957037b8bf5fdf1205861434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Fri, 2 Sep 2022 02:34:45 +0200 Subject: [PATCH 059/304] adapt tests to work with User and UserContact --- .../src/graphql/resolver/UserResolver.test.ts | 38 ++++++++------- backend/src/graphql/resolver/UserResolver.ts | 48 +++++-------------- backend/src/seeds/factory/contributionLink.ts | 6 ++- backend/src/seeds/factory/user.ts | 4 +- 4 files changed, 40 insertions(+), 56 deletions(-) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 14edc7343..b8d2a1d37 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -215,10 +215,12 @@ describe('UserResolver', () => { mutation: createUser, variables: { ...variables, email: 'bibi@bloxberg.de', language: 'it' }, }) - await expect(User.find()).resolves.toEqual( + await expect(User.find({ relations: ['emailContact'] }, )).resolves.toEqual( expect.arrayContaining([ expect.objectContaining({ - email: 'bibi@bloxberg.de', + emailContact: expect.objectContaining({ + email: 'bibi@bloxberg.de', + }), language: 'de', }), ]), @@ -232,10 +234,12 @@ describe('UserResolver', () => { mutation: createUser, variables: { ...variables, email: 'raeuber@hotzenplotz.de', publisherId: undefined }, }) - await expect(User.find()).resolves.toEqual( + await expect(User.find({ relations: ['emailContact'] }, )).resolves.toEqual( expect.arrayContaining([ expect.objectContaining({ - email: 'raeuber@hotzenplotz.de', + emailContact: expect.objectContaining({ + email: 'raeuber@hotzenplotz.de', + }), publisherId: null, }), ]), @@ -276,7 +280,9 @@ describe('UserResolver', () => { UserContact.findOne({ email: 'ein@besucher.de' }, { relations: ['user'] }), ).resolves.toEqual( expect.objectContaining({ - contributionLinkId: link.id, + user: expect.objectContaining({ + contributionLinkId: link.id, + }), }), ) }) @@ -322,20 +328,20 @@ bei Gradidio sei dabei!`, } let result: any - let emailOptIn: string + let emailVerificationCode: string describe('valid optin code and valid password', () => { - let newUser: any + let newUser: User beforeAll(async () => { await mutate({ mutation: createUser, variables: createUserVariables }) - const loginEmailOptIn = await LoginEmailOptIn.find() - emailOptIn = loginEmailOptIn[0].verificationCode.toString() + const emailContact = await UserContact.findOneOrFail({ email: createUserVariables.email }) + emailVerificationCode = emailContact.emailVerificationCode.toString() result = await mutate({ mutation: setPassword, - variables: { code: emailOptIn, password: 'Aa12345_' }, + variables: { code: emailVerificationCode, password: 'Aa12345_' }, }) - newUser = await User.find() + newUser = await User.findOneOrFail({ id: emailContact.userId }, { relations: ['emailContact'] }) }) afterAll(async () => { @@ -343,11 +349,11 @@ bei Gradidio sei dabei!`, }) it('sets email checked to true', () => { - expect(newUser[0].emailChecked).toBeTruthy() + expect(newUser.emailContact.emailChecked).toBeTruthy() }) it('updates the password', () => { - expect(newUser[0].password).toEqual('3917921995996627700') + expect(newUser.password).toEqual('3917921995996627700') }) /* @@ -369,11 +375,11 @@ bei Gradidio sei dabei!`, describe('no valid password', () => { beforeAll(async () => { await mutate({ mutation: createUser, variables: createUserVariables }) - const loginEmailOptIn = await LoginEmailOptIn.find() - emailOptIn = loginEmailOptIn[0].verificationCode.toString() + const emailContact = await UserContact.findOneOrFail({ email: createUserVariables.email }) + emailVerificationCode = emailContact.emailVerificationCode.toString() result = await mutate({ mutation: setPassword, - variables: { code: emailOptIn, password: 'not-valid' }, + variables: { code: emailVerificationCode, password: 'not-valid' }, }) }) diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 0cde3c73a..64a21cef1 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -324,25 +324,6 @@ export class UserResolver { logger.info(`login with ${email}, ***, ${publisherId} ...`) email = email.trim().toLowerCase() const dbUser = await findUserByEmail(email) - /* - const dbUserContact = await DbUserContact.findOneOrFail({ email }, { withDeleted: true }).catch( - () => { - logger.error(`UserContact with email=${email} does not exists`) - throw new Error('No user with this credentials') - }, - ) - const userId = dbUserContact.userId - const dbUser = await DbUser.findOneOrFail(userId).catch(() => { - logger.error(`User with emeilContact=${email} connected per userId=${userId} does not exist`) - throw new Error('No user with this credentials') - }) - */ - /* - const dbUser = await DbUser.findOneOrFail({ email }, { withDeleted: true }).catch(() => { - logger.error(`User with email=${email} does not exists`) - throw new Error('No user with this credentials') - }) - */ if (dbUser.deletedAt) { logger.error('The User was permanently deleted in database.') throw new Error('This user was permanently deleted. Contact support for questions.') @@ -591,8 +572,9 @@ export class UserResolver { async forgotPassword(@Arg('email') email: string): Promise { logger.info(`forgotPassword(${email})...`) email = email.trim().toLowerCase() - const user = await findUserByEmail(email) - // const user = await DbUser.findOne({ email }) + const user = await findUserByEmail(email).catch(() => { + logger.warn(`fail on find UserContact per ${email}`) + }) if (!user) { logger.warn(`no user found with ${email}`) return true @@ -650,12 +632,13 @@ export class UserResolver { throw new Error('Could not login with emailVerificationCode') }) */ - const userContact = await DbUserContact.findOneOrFail({ emailVerificationCode: code }).catch( - () => { - logger.error('Could not login with emailVerificationCode') - throw new Error('Could not login with emailVerificationCode') - }, - ) + const userContact = await DbUserContact.findOneOrFail( + { emailVerificationCode: code }, + { relations: ['user'] }, + ).catch(() => { + logger.error('Could not login with emailVerificationCode') + throw new Error('Could not login with emailVerificationCode') + }) logger.debug('userContact loaded...') // Code is only valid for `CONFIG.EMAIL_CODE_VALID_TIME` minutes if (!isEmailVerificationCodeValid(userContact.updatedAt)) { @@ -669,10 +652,7 @@ export class UserResolver { logger.debug('EmailVerificationCode is valid...') // load user - const user = await DbUser.findOneOrFail({ id: userContact.userId }).catch(() => { - logger.error('Could not find corresponding Login User') - throw new Error('Could not find corresponding Login User') - }) + const user = userContact.user logger.debug('user with EmailVerificationCode found...') // Generate Passphrase if needed @@ -902,13 +882,7 @@ async function findUserByEmail(email: string): Promise { throw new Error('No user with this credentials') }) const dbUser = dbUserContact.user - /* - const dbUser = await DbUser.findOneOrFail({ id: userId }, { withDeleted: true }).catch(() => { - logger.error(`User with emailContact=${email} connected per userId=${userId} does not exist`) - throw new Error('No user with this credentials') - }) dbUser.emailContact = dbUserContact - */ return dbUser } diff --git a/backend/src/seeds/factory/contributionLink.ts b/backend/src/seeds/factory/contributionLink.ts index 5c83b6ad3..b422993e1 100644 --- a/backend/src/seeds/factory/contributionLink.ts +++ b/backend/src/seeds/factory/contributionLink.ts @@ -3,6 +3,7 @@ import { createContributionLink } from '@/seeds/graphql/mutations' import { login } from '@/seeds/graphql/queries' import { ContributionLink } from '@model/ContributionLink' import { ContributionLinkInterface } from '@/seeds/contributionLink/ContributionLinkInterface' +import { User } from '@/graphql/model/User' export const contributionLinkFactory = async ( client: ApolloServerTestClient, @@ -11,7 +12,10 @@ export const contributionLinkFactory = async ( const { mutate, query } = client // login as admin - await query({ query: login, variables: { email: 'peter@lustig.de', password: 'Aa12345_' } }) + const user = await query({ + query: login, + variables: { email: 'peter@lustig.de', password: 'Aa12345_' }, + }) const variables = { amount: contributionLink.amount, diff --git a/backend/src/seeds/factory/user.ts b/backend/src/seeds/factory/user.ts index c2eb20bc4..df6e1ef6b 100644 --- a/backend/src/seeds/factory/user.ts +++ b/backend/src/seeds/factory/user.ts @@ -17,10 +17,10 @@ export const userFactory = async ( } = await mutate({ mutation: createUser, variables: user }) // console.log('creatUser:', { id }, { user }) // get user from database - let dbUser = await User.findOneOrFail({ id }) + let dbUser = await User.findOneOrFail({ id }, { relations: ['emailContact']}) // console.log('dbUser:', dbUser) - const emailContact = await UserContact.findOneOrFail({ userId: id }) + const emailContact = dbUser.emailContact // console.log('emailContact:', emailContact) if (user.emailChecked) { From 0619fb2f6714c3a8fb894dfbe531420e3d6d98e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 6 Sep 2022 00:26:44 +0200 Subject: [PATCH 060/304] tests for Password handling --- .../src/graphql/resolver/UserResolver.test.ts | 77 +++++++++++++------ 1 file changed, 55 insertions(+), 22 deletions(-) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index b8d2a1d37..96ef634ce 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -7,7 +7,6 @@ import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg' import { createUser, setPassword, forgotPassword, updateUserInfos } from '@/seeds/graphql/mutations' import { login, logout, verifyLogin, queryOptIn, searchAdminUsers } from '@/seeds/graphql/queries' import { GraphQLError } from 'graphql' -import { LoginEmailOptIn } from '@entity/LoginEmailOptIn' import { User } from '@entity/User' import CONFIG from '@/config' import { sendAccountActivationEmail } from '@/mailer/sendAccountActivationEmail' @@ -215,7 +214,7 @@ describe('UserResolver', () => { mutation: createUser, variables: { ...variables, email: 'bibi@bloxberg.de', language: 'it' }, }) - await expect(User.find({ relations: ['emailContact'] }, )).resolves.toEqual( + await expect(User.find({ relations: ['emailContact'] })).resolves.toEqual( expect.arrayContaining([ expect.objectContaining({ emailContact: expect.objectContaining({ @@ -234,7 +233,7 @@ describe('UserResolver', () => { mutation: createUser, variables: { ...variables, email: 'raeuber@hotzenplotz.de', publisherId: undefined }, }) - await expect(User.find({ relations: ['emailContact'] }, )).resolves.toEqual( + await expect(User.find({ relations: ['emailContact'] })).resolves.toEqual( expect.arrayContaining([ expect.objectContaining({ emailContact: expect.objectContaining({ @@ -281,7 +280,7 @@ describe('UserResolver', () => { ).resolves.toEqual( expect.objectContaining({ user: expect.objectContaining({ - contributionLinkId: link.id, + contributionLinkId: link.id, }), }), ) @@ -341,7 +340,10 @@ bei Gradidio sei dabei!`, mutation: setPassword, variables: { code: emailVerificationCode, password: 'Aa12345_' }, }) - newUser = await User.findOneOrFail({ id: emailContact.userId }, { relations: ['emailContact'] }) + newUser = await User.findOneOrFail( + { id: emailContact.userId }, + { relations: ['emailContact'] }, + ) }) afterAll(async () => { @@ -616,35 +618,63 @@ bei Gradidio sei dabei!`, describe('forgotPassword', () => { const variables = { email: 'bibi@bloxberg.de' } + const emailCodeRequestTime = CONFIG.EMAIL_CODE_REQUEST_TIME + describe('user is not in DB', () => { - it('returns true', async () => { - await expect(mutate({ mutation: forgotPassword, variables })).resolves.toEqual( - expect.objectContaining({ - data: { - forgotPassword: true, - }, - }), - ) + describe('duration not expired', () => { + it('returns true', async () => { + await expect(mutate({ mutation: forgotPassword, variables })).resolves.toEqual( + expect.objectContaining({ + data: { + forgotPassword: true, + }, + }), + ) + }) }) }) describe('user exists in DB', () => { - let result: any let emailContact: UserContact beforeAll(async () => { await userFactory(testEnv, bibiBloxberg) // await resetEntity(LoginEmailOptIn) - result = await mutate({ mutation: forgotPassword, variables }) emailContact = await UserContact.findOneOrFail(variables) }) afterAll(async () => { await cleanDB() + CONFIG.EMAIL_CODE_REQUEST_TIME = emailCodeRequestTime }) - it('returns true', async () => { - expect(result).toEqual(expect.objectContaining({ data: { forgotPassword: true } })) + describe('duration not expired', () => { + it('returns true', async () => { + await expect(mutate({ mutation: forgotPassword, variables })).resolves.toEqual( + expect.objectContaining({ + errors: [ + new GraphQLError( + `email already sent less than ${printTimeDuration( + CONFIG.EMAIL_CODE_REQUEST_TIME, + )} minutes ago`, + ), + ], + }), + ) + }) + }) + + describe('duration reset to 0', () => { + it('returns true', async () => { + CONFIG.EMAIL_CODE_REQUEST_TIME = 0 + await expect(mutate({ mutation: forgotPassword, variables })).resolves.toEqual( + expect.objectContaining({ + data: { + forgotPassword: true, + }, + }), + ) + }) }) it('sends reset password email', () => { @@ -659,6 +689,7 @@ bei Gradidio sei dabei!`, describe('request reset password again', () => { it('thows an error', async () => { + CONFIG.EMAIL_CODE_REQUEST_TIME = emailCodeRequestTime await expect(mutate({ mutation: forgotPassword, variables })).resolves.toEqual( expect.objectContaining({ errors: [new GraphQLError('email already sent less than 10 minutes minutes ago')], @@ -670,11 +701,13 @@ bei Gradidio sei dabei!`, }) describe('queryOptIn', () => { - let loginEmailOptIn: LoginEmailOptIn[] + // let loginEmailOptIn: LoginEmailOptIn[] + let emailContact: UserContact beforeAll(async () => { await userFactory(testEnv, bibiBloxberg) - loginEmailOptIn = await LoginEmailOptIn.find() + // loginEmailOptIn = await LoginEmailOptIn.find() + emailContact = await UserContact.findOneOrFail({ email: bibiBloxberg.email }) }) afterAll(async () => { @@ -689,8 +722,8 @@ bei Gradidio sei dabei!`, expect.objectContaining({ errors: [ // keep Whitspace in error message! - new GraphQLError(`Could not find any entity of type "LoginEmailOptIn" matching: { - "verificationCode": "not-valid" + new GraphQLError(`Could not find any entity of type "UserContact" matching: { + "emailVerificationCode": "not-valid" }`), ], }), @@ -703,7 +736,7 @@ bei Gradidio sei dabei!`, await expect( query({ query: queryOptIn, - variables: { optIn: loginEmailOptIn[0].verificationCode.toString() }, + variables: { optIn: emailContact.emailVerificationCode.toString() }, }), ).resolves.toEqual( expect.objectContaining({ From e6155d52e1906ac8fdb38aa24dc132c25b1ffccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Mon, 12 Sep 2022 18:34:21 +0200 Subject: [PATCH 061/304] solve error --- backend/src/graphql/resolver/AdminResolver.ts | 22 ++++--------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 167390a21..21627b099 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -417,30 +417,16 @@ export class AdminResolver { relations: ['emailContact'], }) + return contributions.map((contribution) => { + const user = users.find((u) => u.id === contribution.userId) + const creation = userCreations.find((c) => c.id === contribution.userId) + return new UnconfirmedContribution( contribution, user, creation ? creation.creations : FULL_CREATION_AVAILABLE, ) - /* - return contributions.map((contribution) => { - const user = users.find((u) => u.id === contribution.userId) - const creation = userCreations.find((c) => c.id === contribution.userId) - - return { - id: contribution.id, - userId: contribution.userId, - date: contribution.contributionDate, - memo: contribution.memo, - amount: contribution.amount, - moderator: contribution.moderatorId, - firstName: user ? user.firstName : '', - lastName: user ? user.lastName : '', - email: user ? user.emailContact.email : '', - creation: creation ? creation.creations : FULL_CREATION_AVAILABLE, - } }) - */ } @Authorized([RIGHTS.ADMIN_DELETE_CONTRIBUTION]) From 68ba6def1409b10df904bcce142aa4acb21e8b62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Mon, 12 Sep 2022 18:41:17 +0200 Subject: [PATCH 062/304] now find users including emailContact --- backend/src/util/klicktipp.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/src/util/klicktipp.ts b/backend/src/util/klicktipp.ts index c8f83acc3..0432f196e 100644 --- a/backend/src/util/klicktipp.ts +++ b/backend/src/util/klicktipp.ts @@ -7,16 +7,16 @@ export async function retrieveNotRegisteredEmails(): Promise { if (!con) { throw new Error('No connection to database') } - const users = await User.find() + const users = await User.find({ relations: ['emailContact'] }) const notRegisteredUser = [] for (let i = 0; i < users.length; i++) { const user = users[i] try { - await getKlickTippUser(user.email) + await getKlickTippUser(user.emailContact.email) } catch (err) { - notRegisteredUser.push(user.email) + notRegisteredUser.push(user.emailContact.email) // eslint-disable-next-line no-console - console.log(`${user.email}`) + console.log(`${user.emailContact.email}`) } } await con.close() From 298924001cb26919735db2e3a02962138fb519b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Mon, 12 Sep 2022 18:45:42 +0200 Subject: [PATCH 063/304] linting --- database/migrations/0049-add_user_contacts_table.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/database/migrations/0049-add_user_contacts_table.ts b/database/migrations/0049-add_user_contacts_table.ts index 82c2555ab..c3b89ed88 100644 --- a/database/migrations/0049-add_user_contacts_table.ts +++ b/database/migrations/0049-add_user_contacts_table.ts @@ -7,10 +7,7 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { v4 as uuidv4 } from 'uuid' - export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { - await queryFn(` CREATE TABLE IF NOT EXISTS \`user_contacts\` ( \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, From 7cd5ecb463ad5e32917d3a94ddbfb99889829942 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Mon, 12 Sep 2022 19:02:12 +0200 Subject: [PATCH 064/304] linting --- backend/src/graphql/resolver/AdminResolver.ts | 2 -- backend/src/graphql/resolver/UserResolver.test.ts | 2 +- backend/src/seeds/factory/contributionLink.ts | 2 +- backend/src/seeds/factory/creation.ts | 1 - backend/src/seeds/factory/user.ts | 3 +-- backend/src/webhook/elopage.ts | 1 - database/entity/0049-add_user_contacts_table/UserContact.ts | 1 - 7 files changed, 3 insertions(+), 9 deletions(-) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 21627b099..021978710 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -4,8 +4,6 @@ import { Resolver, Query, Arg, Args, Authorized, Mutation, Ctx, Int } from 'type import { getCustomRepository, IsNull, - Not, - ObjectLiteral, getConnection, In, MoreThan, diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 96ef634ce..5db5e3fc4 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -import { testEnvironment, headerPushMock, resetToken, cleanDB, resetEntity } from '@test/helpers' +import { testEnvironment, headerPushMock, resetToken, cleanDB } from '@test/helpers' import { userFactory } from '@/seeds/factory/user' import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg' import { createUser, setPassword, forgotPassword, updateUserInfos } from '@/seeds/graphql/mutations' diff --git a/backend/src/seeds/factory/contributionLink.ts b/backend/src/seeds/factory/contributionLink.ts index b422993e1..d8f31d585 100644 --- a/backend/src/seeds/factory/contributionLink.ts +++ b/backend/src/seeds/factory/contributionLink.ts @@ -3,7 +3,6 @@ import { createContributionLink } from '@/seeds/graphql/mutations' import { login } from '@/seeds/graphql/queries' import { ContributionLink } from '@model/ContributionLink' import { ContributionLinkInterface } from '@/seeds/contributionLink/ContributionLinkInterface' -import { User } from '@/graphql/model/User' export const contributionLinkFactory = async ( client: ApolloServerTestClient, @@ -12,6 +11,7 @@ export const contributionLinkFactory = async ( const { mutate, query } = client // login as admin + // eslint-disable-next-line @typescript-eslint/no-unused-vars const user = await query({ query: login, variables: { email: 'peter@lustig.de', password: 'Aa12345_' }, diff --git a/backend/src/seeds/factory/creation.ts b/backend/src/seeds/factory/creation.ts index 7f19e2828..99fd39d3b 100644 --- a/backend/src/seeds/factory/creation.ts +++ b/backend/src/seeds/factory/creation.ts @@ -6,7 +6,6 @@ import { adminCreateContribution, confirmContribution } from '@/seeds/graphql/mu import { login } from '@/seeds/graphql/queries' import { CreationInterface } from '@/seeds/creation/CreationInterface' import { ApolloServerTestClient } from 'apollo-server-testing' -import { User } from '@entity/User' import { Transaction } from '@entity/Transaction' import { Contribution } from '@entity/Contribution' import { UserContact } from '@entity/UserContact' diff --git a/backend/src/seeds/factory/user.ts b/backend/src/seeds/factory/user.ts index df6e1ef6b..faa34e31a 100644 --- a/backend/src/seeds/factory/user.ts +++ b/backend/src/seeds/factory/user.ts @@ -2,7 +2,6 @@ import { createUser, setPassword } from '@/seeds/graphql/mutations' import { User } from '@entity/User' import { UserInterface } from '@/seeds/users/UserInterface' import { ApolloServerTestClient } from 'apollo-server-testing' -import { UserContact } from '@entity/UserContact' export const userFactory = async ( client: ApolloServerTestClient, @@ -17,7 +16,7 @@ export const userFactory = async ( } = await mutate({ mutation: createUser, variables: user }) // console.log('creatUser:', { id }, { user }) // get user from database - let dbUser = await User.findOneOrFail({ id }, { relations: ['emailContact']}) + let dbUser = await User.findOneOrFail({ id }, { relations: ['emailContact'] }) // console.log('dbUser:', dbUser) const emailContact = dbUser.emailContact diff --git a/backend/src/webhook/elopage.ts b/backend/src/webhook/elopage.ts index 6c8ca7e49..87af4088c 100644 --- a/backend/src/webhook/elopage.ts +++ b/backend/src/webhook/elopage.ts @@ -29,7 +29,6 @@ import { LoginElopageBuys } from '@entity/LoginElopageBuys' import { UserResolver } from '@/graphql/resolver/UserResolver' -import { User as dbUser } from '@entity/User' import { UserContact as dbUserContact } from '@entity/UserContact' export const elopageWebhook = async (req: any, res: any): Promise => { diff --git a/database/entity/0049-add_user_contacts_table/UserContact.ts b/database/entity/0049-add_user_contacts_table/UserContact.ts index 20732ae6f..97b12d4cd 100644 --- a/database/entity/0049-add_user_contacts_table/UserContact.ts +++ b/database/entity/0049-add_user_contacts_table/UserContact.ts @@ -5,7 +5,6 @@ import { Column, DeleteDateColumn, OneToOne, - JoinColumn, } from 'typeorm' import { User } from './User' From d9313b68dbda117d2187fb7b750a8f2b6abbbefd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Mon, 12 Sep 2022 19:26:59 +0200 Subject: [PATCH 065/304] init moderator in UnconfirmedContribution --- backend/src/graphql/model/UnconfirmedContribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/graphql/model/UnconfirmedContribution.ts b/backend/src/graphql/model/UnconfirmedContribution.ts index bea53fdec..c42b4fd11 100644 --- a/backend/src/graphql/model/UnconfirmedContribution.ts +++ b/backend/src/graphql/model/UnconfirmedContribution.ts @@ -14,7 +14,7 @@ export class UnconfirmedContribution { this.firstName = user ? user.firstName : '' this.lastName = user ? user.lastName : '' this.email = user ? user.emailContact.email : '' - // this.moderator = contribution.moderatorId + this.moderator = contribution.moderatorId this.creation = creations this.state = contribution.contributionStatus this.messageCount = contribution.messages ? contribution.messages.length : 0 From 13d79fd8b7a714e56bee426441f94cc819de6d22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Wed, 14 Sep 2022 23:00:47 +0200 Subject: [PATCH 066/304] remove multi-line comments --- backend/src/graphql/resolver/AdminResolver.ts | 45 ------------------- 1 file changed, 45 deletions(-) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 021978710..b33f65404 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -77,18 +77,6 @@ export class AdminResolver { { searchText, currentPage = 1, pageSize = 25, filters }: SearchUsersArgs, ): Promise { const userRepository = getCustomRepository(UserRepository) - /* - const filterCriteria: ObjectLiteral[] = [] - if (filters) { - if (filters.byActivated !== null) { - filterCriteria.push({ 'emailContact.emailChecked': filters.byActivated }) - } - - if (filters.byDeleted !== null) { - filterCriteria.push({ deletedAt: filters.byDeleted ? Not(IsNull()) : IsNull() }) - } - } - */ const userFields = [ 'id', 'firstName', @@ -121,27 +109,6 @@ export class AdminResolver { users.map(async (user) => { let emailConfirmationSend = '' if (!user.emailContact.emailChecked) { - /* - const emailOptIn = await LoginEmailOptIn.findOne( - { - userId: user.id, - }, - { - order: { - updatedAt: 'DESC', - createdAt: 'DESC', - }, - select: ['updatedAt', 'createdAt'], - }, - ) - if (emailOptIn) { - if (emailOptIn.updatedAt) { - emailConfirmationSend = emailOptIn.updatedAt.toISOString() - } else { - emailConfirmationSend = emailOptIn.createdAt.toISOString() - } - } - */ if (user.emailContact.updatedAt) { emailConfirmationSend = user.emailContact.updatedAt.toISOString() } else { @@ -558,18 +525,6 @@ export class AdminResolver { throw new Error(`Could not find User to emailContact: ${email}`) } - /* - const user = await dbUser.findOneOrFail({ email: email }) - - // can be both types: REGISTER and RESET_PASSWORD - let optInCode = await LoginEmailOptIn.findOne({ - where: { userId: user.id }, - order: { updatedAt: 'DESC' }, - }) - - optInCode = await checkOptInCode(optInCode, user) - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars const emailSent = await sendAccountActivationEmail({ link: activationLink(emailContact.emailVerificationCode), From 64aab998e2840327443527e5efd54f36bebc0b49 Mon Sep 17 00:00:00 2001 From: clauspeterhuebner <86960882+clauspeterhuebner@users.noreply.github.com> Date: Wed, 14 Sep 2022 23:57:53 +0200 Subject: [PATCH 067/304] Update backend/src/graphql/resolver/UserResolver.test.ts Co-authored-by: Moriz Wahl --- backend/src/graphql/resolver/UserResolver.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 5db5e3fc4..5fef81ef1 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -142,7 +142,7 @@ describe('UserResolver', () => { expect(verUUID).toEqual(4) }) - it('creates an email optin', () => { + it('creates an email contact', () => { expect(user[0].emailContact).toEqual({ id: expect.any(Number), type: UserContactType.USER_CONTACT_EMAIL, From 45330a60fadd24ea9babae3996d5a0a5110bc34c Mon Sep 17 00:00:00 2001 From: clauspeterhuebner <86960882+clauspeterhuebner@users.noreply.github.com> Date: Thu, 15 Sep 2022 00:59:45 +0200 Subject: [PATCH 068/304] Update database/entity/0049-add_user_contacts_table/User.ts Co-authored-by: Moriz Wahl --- database/entity/0049-add_user_contacts_table/User.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/entity/0049-add_user_contacts_table/User.ts b/database/entity/0049-add_user_contacts_table/User.ts index e3ac7d591..bf8ca3277 100644 --- a/database/entity/0049-add_user_contacts_table/User.ts +++ b/database/entity/0049-add_user_contacts_table/User.ts @@ -120,7 +120,7 @@ export class User extends BaseEntity { @JoinColumn({ name: 'user_id' }) messages?: ContributionMessage[] - @OneToMany(() => UserContact, (usercontact: UserContact) => usercontact.user) + @OneToMany(() => UserContact, (userContact: UserContact) => userContact.user) @JoinColumn({ name: 'user_id' }) usercontacts?: UserContact[] } From 9a99a8741d0f28672982cf7c090d7e4e6fc00586 Mon Sep 17 00:00:00 2001 From: clauspeterhuebner <86960882+clauspeterhuebner@users.noreply.github.com> Date: Thu, 15 Sep 2022 01:05:34 +0200 Subject: [PATCH 069/304] Update database/entity/0049-add_user_contacts_table/User.ts Co-authored-by: Moriz Wahl --- database/entity/0049-add_user_contacts_table/User.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/entity/0049-add_user_contacts_table/User.ts b/database/entity/0049-add_user_contacts_table/User.ts index bf8ca3277..abe40df54 100644 --- a/database/entity/0049-add_user_contacts_table/User.ts +++ b/database/entity/0049-add_user_contacts_table/User.ts @@ -122,5 +122,5 @@ export class User extends BaseEntity { @OneToMany(() => UserContact, (userContact: UserContact) => userContact.user) @JoinColumn({ name: 'user_id' }) - usercontacts?: UserContact[] + userContacts?: UserContact[] } From 411e03c843a146ecc4f55cd741fedcdc9bc6a60d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Thu, 15 Sep 2022 02:40:59 +0200 Subject: [PATCH 070/304] rework PR comments --- backend/src/graphql/resolver/AdminResolver.ts | 20 +- .../resolver/TransactionLinkResolver.ts | 5 +- .../graphql/resolver/TransactionResolver.ts | 8 +- backend/src/graphql/resolver/UserResolver.ts | 2 +- backend/src/seeds/factory/user.ts | 2 +- .../UC_Introduction_of_Gradido-ID.md | 318 +++++++++--------- 6 files changed, 184 insertions(+), 171 deletions(-) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index b33f65404..488a39a22 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -41,7 +41,7 @@ import Paginated from '@arg/Paginated' import TransactionLinkFilters from '@arg/TransactionLinkFilters' import { Order } from '@enum/Order' import { communityUser } from '@/util/communityUser' -import { activationLink, printTimeDuration } from './UserResolver' +import { findUserByEmail, activationLink, printTimeDuration } from './UserResolver' import { sendAccountActivationEmail } from '@/mailer/sendAccountActivationEmail' import { transactionLinkCode as contributionLinkCode } from './TransactionLinkResolver' import CONFIG from '@/config' @@ -403,6 +403,7 @@ export class AdminResolver { throw new Error('Contribution not found for given id.') } contribution.contributionStatus = ContributionStatus.DELETED + await contribution.save() const res = await contribution.softRemove() return !!res } @@ -514,16 +515,21 @@ export class AdminResolver { @Mutation(() => Boolean) async sendActivationEmail(@Arg('email') email: string): Promise { email = email.trim().toLowerCase() - const emailContact = await UserContact.findOne({ email: email }) - if (!emailContact) { - logger.error(`Could not find UserContact with email: ${email}`) - throw new Error(`Could not find UserContact with email: ${email}`) - } - const user = await dbUser.findOne({ id: emailContact.userId }) + // const user = await dbUser.findOne({ id: emailContact.userId }) + const user = await findUserByEmail(email) if (!user) { logger.error(`Could not find User to emailContact: ${email}`) throw new Error(`Could not find User to emailContact: ${email}`) } + if (user.deletedAt) { + logger.error(`User with emailContact: ${email} is deleted.`) + throw new Error(`User with emailContact: ${email} is deleted.`) + } + const emailContact = user.emailContact + if (emailContact.deletedAt) { + logger.error(`The emailContact: ${email} of htis User is deleted.`) + throw new Error(`The emailContact: ${email} of htis User is deleted.`) + } // eslint-disable-next-line @typescript-eslint/no-unused-vars const emailSent = await sendAccountActivationEmail({ diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index ccc0f628d..194126f3f 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -283,7 +283,10 @@ export class TransactionLinkResolver { return true } else { const transactionLink = await dbTransactionLink.findOneOrFail({ code }) - const linkedUser = await dbUser.findOneOrFail({ id: transactionLink.userId }) + const linkedUser = await dbUser.findOneOrFail( + { id: transactionLink.userId }, + { relations: ['user'] }, + ) if (user.id === linkedUser.id) { throw new Error('Cannot redeem own transaction link.') diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index ae6445343..3cd871fc3 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -36,6 +36,7 @@ import Decimal from 'decimal.js-light' import { BalanceResolver } from './BalanceResolver' import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const' import { UserContact } from '@entity/UserContact' +import { findUserByEmail } from './UserResolver' export const executeTransaction = async ( amount: Decimal, @@ -294,13 +295,15 @@ export class TransactionResolver { } // validate recipient user + const recipientUser = await findUserByEmail(email) + /* const emailContact = await UserContact.findOne({ email }, { withDeleted: true }) if (!emailContact) { logger.error(`Could not find UserContact with email: ${email}`) throw new Error(`Could not find UserContact with email: ${email}`) } - - const recipientUser = await dbUser.findOne({ id: emailContact.userId }) + */ + // const recipientUser = await dbUser.findOne({ id: emailContact.userId }) if (!recipientUser) { logger.error(`unknown recipient to UserContact: email=${email}`) throw new Error('unknown recipient') @@ -309,6 +312,7 @@ export class TransactionResolver { logger.error(`The recipient account was deleted: recipientUser=${recipientUser}`) throw new Error('The recipient account was deleted') } + const emailContact = recipientUser.emailContact if (!emailContact.emailChecked) { logger.error(`The recipient account is not activated: recipientUser=${recipientUser}`) throw new Error('The recipient account is not activated') diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 64a21cef1..19829c95f 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -873,7 +873,7 @@ export class UserResolver { } } -async function findUserByEmail(email: string): Promise { +export async function findUserByEmail(email: string): Promise { const dbUserContact = await DbUserContact.findOneOrFail( { email: email }, { withDeleted: true, relations: ['user'] }, diff --git a/backend/src/seeds/factory/user.ts b/backend/src/seeds/factory/user.ts index faa34e31a..d566275db 100644 --- a/backend/src/seeds/factory/user.ts +++ b/backend/src/seeds/factory/user.ts @@ -40,7 +40,7 @@ export const userFactory = async ( } // get last changes of user from database - dbUser = await User.findOneOrFail({ id }, { withDeleted: true }) + // dbUser = await User.findOneOrFail({ id }, { withDeleted: true }) return dbUser } diff --git a/docu/Concepts/TechnicalRequirements/UC_Introduction_of_Gradido-ID.md b/docu/Concepts/TechnicalRequirements/UC_Introduction_of_Gradido-ID.md index c8eb12524..9d607ba97 100644 --- a/docu/Concepts/TechnicalRequirements/UC_Introduction_of_Gradido-ID.md +++ b/docu/Concepts/TechnicalRequirements/UC_Introduction_of_Gradido-ID.md @@ -1,159 +1,159 @@ -# Introduction of Gradido-ID - -## Motivation - -The introduction of the Gradido-ID base on the requirement to identify an user account per technical key instead of using an email-address. Such a technical key ensures an exact identification of an user account without giving detailed information for possible missusage. - -Additionally the Gradido-ID allows to administrade any user account data like changing the email address or define several email addresses without any side effects on the identification of the user account. - -## Definition - -The formalized definition of the Gradido-ID can be found in the document [BenutzerVerwaltung#Gradido-ID](../BusinessRequirements/BenutzerVerwaltung#Gradido-ID). - -## Steps of Introduction - -To Introduce the Gradido-ID there are several steps necessary. The first step is to define a proper database schema with additional columns and tables followed by data migration steps to add or initialize the new columns and tables by keeping valid data at all. - -The second step is to decribe all concerning business logic processes, which have to be adapted by introducing the Gradido-ID. - -### Database-Schema - -#### Users-Table - -The entity users has to be changed by adding the following columns. - -| Column | Type | Description | -| ------------------------ | ------ | ----------------------------------------------------------------------------------------------------------------- | -| gradidoID | String | technical unique key of the user as UUID (version 4) | -| alias | String | a business unique key of the user | -| passphraseEncryptionType | int | defines the type of encrypting the passphrase: 1 = email (default), 2 = gradidoID, ... | -| emailID | int | technical foreign key to the entry with type Email and contactChannel=maincontact of the new entity UserContacts | - -##### Email vs emailID - -The existing column `email`, will now be changed to the primary email contact, which will be stored as a contact entry in the new `UserContacts` table. It is necessary to decide if the content of the `email `will be changed to the foreign key `emailID `to the contact entry with the email address or if the email itself will be kept as a denormalized and duplicate value in the `users `table. - -The preferred and proper solution will be to add a new column `Users.emailId `as foreign key to the `UsersContact `entry and delete the `Users.email` column after the migration of the email address in the `UsersContact `table. - -#### new UserContacts-Table - -A new entity `UserContacts `is introduced to store several contacts of different types like email, telephone or other kinds of contact addresses. - -| Column | Type | Description | -| --------------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| id | int | the technical key of a contact entity | -| type | int | Defines the type of contact entry as enum: Email, Phone, etc | -| userID | int | Defines the foreign key to the `Users` table | -| email | String | defines the address of a contact entry of type Email | -| emailVerificationCode | unsinged bigint(20) | unique code to verify email or password reset | -| emailOptInType | int | REGISTER=1, RESET_PASSWORD=2 | -| emailResendCount | int | counter how often the email was resend | -| emailChecked | boolean | flag if email is verified and confirmed | -| createdAt | DateTime | point of time the Contact was created | -| updatedAt | DateTime | point of time the Contact was updated | -| deletedAt | DateTime | point of time the Contact was soft deleted | -| phone | String | defines the address of a contact entry of type Phone | -| contactChannels | String | define the contact channel as comma separated list for which this entry is confirmed by the user e.g. main contact (default), infomail, contracting, advertisings, ... | - -### Database-Migration - -After the adaption of the database schema and to keep valid consistent data, there must be several steps of data migration to initialize the new and changed columns and tables. - -#### Initialize GradidoID - -In a one-time migration create for each entry of the `Users `tabel an unique UUID (version4). - -#### Primary Email Contact - -In a one-time migration read for each entry of the `Users `table the `Users.id` and `Users.email`, select from the table `login_email_opt_in` the entry with the `login_email_opt_in.user_id` = `Users.id` and create a new entry in the `UsersContact `table, by initializing the contact-values with: - -* id = new technical key -* type = Enum-Email -* userID = `Users.id` -* email = `Users.email` -* emailVerifyCode = `login_email_opt_in.verification_code` -* emailOptInType = `login_email_opt_in.email_opt_in_type_id` -* emailResendCount = `login_email_opt_in.resent_count` -* emailChecked = `Users.emailChecked` -* createdAt = `login_email_opt_in.created_at` -* updatedAt = `login_email_opt_in.updated_at` -* phone = null -* usedChannel = Enum-"main contact" - -and update the `Users `entry with `Users.emailId = UsersContact.Id` and `Users.passphraseEncryptionType = 1` - -After this one-time migration and a verification, which ensures that all data are migrated, then the columns `Users.email`, `Users.emailChecked`, `Users.emailHash` and the table `login_email_opt_in` can be deleted. - -### Adaption of BusinessLogic - -The following logic or business processes has to be adapted for introducing the Gradido-ID - -#### Read-Write Access of Users-Table especially Email - -The ORM mapping has to be adapted to the changed and new database schema. - -#### Registration Process - -The logic of the registration process has to be adapted by - -* initializing the `Users.userID` with a unique UUID -* creating a new `UsersContact `entry with the given email address and *maincontact* as `usedChannel ` -* set `emailID `in the `Users `table as foreign key to the new `UsersContact `entry -* set `Users.passphraseEncrpytionType = 2` and encrypt the passphrase with the `Users.userID` instead of the `UsersContact.email` - -#### Login Process - -The logic of the login process has to be adapted by - -* search the users data by reading the `Users `and the `UsersContact` table with the email (or alias as soon as the user can maintain his profil with an alias) as input -* depending on the `Users.passphraseEncryptionType` decrypt the stored password - * = 1 : with the email - * = 2 : with the userID - -#### Password En/Decryption - -The logic of the password en/decryption has to be adapted by encapsulate the logic to be controlled with an input parameter. The input parameter can be the email or the userID. - -#### Change Password Process - -The logic of change password has to be adapted by - -* if the `Users.passphraseEncryptionType` = 1, then - - * read the users email address from the `UsersContact `table - * give the email address as input for the password decryption of the existing password - * use the `Users.userID` as input for the password encryption for the new password - * change the `Users.passphraseEnrycptionType` to the new value =2 -* if the `Users.passphraseEncryptionType` = 2, then - - * give the `Users.userID` as input for the password decryption of the existing password - * use the `Users.userID` as input for the password encryption fo the new password - -#### Search- and Access Logic - -A new logic has to be introduced to search the user identity per different input values. That means searching the user data must be possible by - -* searching per email (only with maincontact as contactchannel) -* searching per userID -* searching per alias - -#### Identity-Mapping - -A new mapping logic will be necessary to allow using unmigrated APIs like GDT-servers api. So it must be possible to give this identity-mapping logic the following input to get the respective output: - -* email -> userID -* email -> gradidoID -* email -> alias -* userID -> gradidoID -* userID -> email -* userID -> alias -* alias -> gradidoID -* alias -> email -* alias -> userID -* gradidoID -> email -* gradidoID -> userID -* gradidoID -> alias - -#### GDT-Access - -To use the GDT-servers api the used identifier for GDT has to be switch from email to userID. +# Introduction of Gradido-ID + +## Motivation + +The introduction of the Gradido-ID base on the requirement to identify an user account per technical key instead of using an email-address. Such a technical key ensures an exact identification of an user account without giving detailed information for possible missusage. + +Additionally the Gradido-ID allows to administrade any user account data like changing the email address or define several email addresses without any side effects on the identification of the user account. + +## Definition + +The formalized definition of the Gradido-ID can be found in the document [BenutzerVerwaltung#Gradido-ID](../BusinessRequirements/BenutzerVerwaltung#Gradido-ID). + +## Steps of Introduction + +To Introduce the Gradido-ID there are several steps necessary. The first step is to define a proper database schema with additional columns and tables followed by data migration steps to add or initialize the new columns and tables by keeping valid data at all. + +The second step is to decribe all concerning business logic processes, which have to be adapted by introducing the Gradido-ID. + +### Database-Schema + +#### Users-Table + +The entity users has to be changed by adding the following columns. + +| Column | Type | Description | +| ------------------------ | ------ | ----------------------------------------------------------------------------------------------------------------- | +| gradidoID | String | technical unique key of the user as UUID (version 4) | +| alias | String | a business unique key of the user | +| passphraseEncryptionType | int | defines the type of encrypting the passphrase: 1 = email (default), 2 = gradidoID, ... | +| emailID | int | technical foreign key to the entry with type Email and contactChannel=maincontact of the new entity UserContacts | + +##### Email vs emailID + +The existing column `email`, will now be changed to the primary email contact, which will be stored as a contact entry in the new `UserContacts` table. It is necessary to decide if the content of the `email `will be changed to the foreign key `emailID `to the contact entry with the email address or if the email itself will be kept as a denormalized and duplicate value in the `users `table. + +The preferred and proper solution will be to add a new column `Users.emailId `as foreign key to the `UsersContact `entry and delete the `Users.email` column after the migration of the email address in the `UsersContact `table. + +#### new UserContacts-Table + +A new entity `UserContacts `is introduced to store several contacts of different types like email, telephone or other kinds of contact addresses. + +| Column | Type | Description | +| --------------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| id | int | the technical key of a contact entity | +| type | int | Defines the type of contact entry as enum: Email, Phone, etc | +| userID | int | Defines the foreign key to the `Users` table | +| email | String | defines the address of a contact entry of type Email | +| emailVerificationCode | unsinged bigint(20) | unique code to verify email or password reset | +| emailOptInType | int | REGISTER=1, RESET_PASSWORD=2 | +| emailResendCount | int | counter how often the email was resend | +| emailChecked | boolean | flag if email is verified and confirmed | +| createdAt | DateTime | point of time the Contact was created | +| updatedAt | DateTime | point of time the Contact was updated | +| deletedAt | DateTime | point of time the Contact was soft deleted | +| phone | String | defines the address of a contact entry of type Phone | +| contactChannels | String | define the contact channel as comma separated list for which this entry is confirmed by the user e.g. main contact (default), infomail, contracting, advertisings, ... | + +### Database-Migration + +After the adaption of the database schema and to keep valid consistent data, there must be several steps of data migration to initialize the new and changed columns and tables. + +#### Initialize GradidoID + +In a one-time migration create for each entry of the `Users `tabel an unique UUID (version4). + +#### Primary Email Contact + +In a one-time migration read for each entry of the `Users `table the `Users.id` and `Users.email`, select from the table `login_email_opt_in` the entry with the `login_email_opt_in.user_id` = `Users.id` and create a new entry in the `UsersContact `table, by initializing the contact-values with: + +* id = new technical key +* type = Enum-Email +* userID = `Users.id` +* email = `Users.email` +* emailVerifyCode = `login_email_opt_in.verification_code` +* emailOptInType = `login_email_opt_in.email_opt_in_type_id` +* emailResendCount = `login_email_opt_in.resent_count` +* emailChecked = `Users.emailChecked` +* createdAt = `login_email_opt_in.created_at` +* updatedAt = `login_email_opt_in.updated_at` +* phone = null +* usedChannel = Enum-"main contact" + +and update the `Users `entry with `Users.emailId = UsersContact.Id` and `Users.passphraseEncryptionType = 1` + +After this one-time migration and a verification, which ensures that all data are migrated, then the columns `Users.email`, `Users.emailChecked`, `Users.emailHash` and the table `login_email_opt_in` can be deleted. + +### Adaption of BusinessLogic + +The following logic or business processes has to be adapted for introducing the Gradido-ID + +#### Read-Write Access of Users-Table especially Email + +The ORM mapping has to be adapted to the changed and new database schema. + +#### Registration Process + +The logic of the registration process has to be adapted by + +* initializing the `Users.userID` with a unique UUID +* creating a new `UsersContact `entry with the given email address and *maincontact* as `usedChannel ` +* set `emailID `in the `Users `table as foreign key to the new `UsersContact `entry +* set `Users.passphraseEncrpytionType = 2` and encrypt the passphrase with the `Users.userID` instead of the `UsersContact.email` + +#### Login Process + +The logic of the login process has to be adapted by + +* search the users data by reading the `Users `and the `UsersContact` table with the email (or alias as soon as the user can maintain his profil with an alias) as input +* depending on the `Users.passphraseEncryptionType` decrypt the stored password + * = 1 : with the email + * = 2 : with the userID + +#### Password En/Decryption + +The logic of the password en/decryption has to be adapted by encapsulate the logic to be controlled with an input parameter. The input parameter can be the email or the userID. + +#### Change Password Process + +The logic of change password has to be adapted by + +* if the `Users.passphraseEncryptionType` = 1, then + + * read the users email address from the `UsersContact `table + * give the email address as input for the password decryption of the existing password + * use the `Users.userID` as input for the password encryption for the new password + * change the `Users.passphraseEnrycptionType` to the new value =2 +* if the `Users.passphraseEncryptionType` = 2, then + + * give the `Users.userID` as input for the password decryption of the existing password + * use the `Users.userID` as input for the password encryption fo the new password + +#### Search- and Access Logic + +A new logic has to be introduced to search the user identity per different input values. That means searching the user data must be possible by + +* searching per email (only with maincontact as contactchannel) +* searching per userID +* searching per alias + +#### Identity-Mapping + +A new mapping logic will be necessary to allow using unmigrated APIs like GDT-servers api. So it must be possible to give this identity-mapping logic the following input to get the respective output: + +* email -> userID +* email -> gradidoID +* email -> alias +* userID -> gradidoID +* userID -> email +* userID -> alias +* alias -> gradidoID +* alias -> email +* alias -> userID +* gradidoID -> email +* gradidoID -> userID +* gradidoID -> alias + +#### GDT-Access + +To use the GDT-servers api the used identifier for GDT has to be switch from email to userID. From 9fea90fe5733d5eed4e07043c54bc357db02fa0e Mon Sep 17 00:00:00 2001 From: mahula Date: Thu, 15 Sep 2022 09:07:40 +0200 Subject: [PATCH 071/304] add run exclusion of tests marked to skip --- e2e-tests/cypress/tests/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e-tests/cypress/tests/package.json b/e2e-tests/cypress/tests/package.json index b3229deb6..86b93125c 100644 --- a/e2e-tests/cypress/tests/package.json +++ b/e2e-tests/cypress/tests/package.json @@ -14,7 +14,7 @@ } }, "scripts": { - "cypress-e2e-tests": "yarn run cypress run -e \"TAGS=not @skip\"", + "cypress-e2e-tests": "yarn run cypress run", "lint": "eslint --max-warnings=0 --ext .js,.ts ." }, "dependencies": { From 1418d2e8fb91b0c89c8770a713ae13aa328ebfb7 Mon Sep 17 00:00:00 2001 From: mahula Date: Thu, 15 Sep 2022 09:07:59 +0200 Subject: [PATCH 072/304] update yarn.lock --- e2e-tests/cypress/tests/yarn.lock | 549 +++++++++++++++--------------- 1 file changed, 272 insertions(+), 277 deletions(-) diff --git a/e2e-tests/cypress/tests/yarn.lock b/e2e-tests/cypress/tests/yarn.lock index b84e43c24..78452edae 100644 --- a/e2e-tests/cypress/tests/yarn.lock +++ b/e2e-tests/cypress/tests/yarn.lock @@ -17,38 +17,38 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" - integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.1.tgz#72d647b4ff6a4f82878d184613353af1dd0290f9" + integrity sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg== "@babel/core@^7.16.0": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" - integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.1.tgz#c8fa615c5e88e272564ace3d42fbc8b17bfeb22b" + integrity sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.10" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helpers" "^7.18.9" - "@babel/parser" "^7.18.10" + "@babel/generator" "^7.19.0" + "@babel/helper-compilation-targets" "^7.19.1" + "@babel/helper-module-transforms" "^7.19.0" + "@babel/helpers" "^7.19.0" + "@babel/parser" "^7.19.1" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.18.10" - "@babel/types" "^7.18.10" + "@babel/traverse" "^7.19.1" + "@babel/types" "^7.19.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.18.10": - version "7.18.12" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.12.tgz#fa58daa303757bd6f5e4bbca91b342040463d9f4" - integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg== +"@babel/generator@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.0.tgz#785596c06425e59334df2ccee63ab166b738419a" + integrity sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg== dependencies: - "@babel/types" "^7.18.10" + "@babel/types" "^7.19.0" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" @@ -67,41 +67,41 @@ "@babel/helper-explode-assignable-expression" "^7.18.6" "@babel/types" "^7.18.9" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" - integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.19.0", "@babel/helper-compilation-targets@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz#7f630911d83b408b76fe584831c98e5395d7a17c" + integrity sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg== dependencies: - "@babel/compat-data" "^7.18.8" + "@babel/compat-data" "^7.19.1" "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.20.2" + browserslist "^4.21.3" semver "^6.3.0" "@babel/helper-create-class-features-plugin@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz#d802ee16a64a9e824fcbf0a2ffc92f19d58550ce" - integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw== + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz#bfd6904620df4e46470bae4850d66be1054c404b" + integrity sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" "@babel/helper-member-expression-to-functions" "^7.18.9" "@babel/helper-optimise-call-expression" "^7.18.6" "@babel/helper-replace-supers" "^7.18.9" "@babel/helper-split-export-declaration" "^7.18.6" -"@babel/helper-create-regexp-features-plugin@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz#3e35f4e04acbbf25f1b3534a657610a000543d3c" - integrity sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz#7976aca61c0984202baca73d84e2337a5424a41b" + integrity sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" regexpu-core "^5.1.0" -"@babel/helper-define-polyfill-provider@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz#bd10d0aca18e8ce012755395b05a79f45eca5073" - integrity sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg== +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== dependencies: "@babel/helper-compilation-targets" "^7.17.7" "@babel/helper-plugin-utils" "^7.16.7" @@ -122,13 +122,13 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" - integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== dependencies: - "@babel/template" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" @@ -151,19 +151,19 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" - integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz#309b230f04e22c58c6a2c0c0c7e50b216d350c30" + integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" "@babel/helper-simple-access" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.0" + "@babel/types" "^7.19.0" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -172,10 +172,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" - integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz#4796bb14961521f0f8715990bee2fb6e51ce21bf" + integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== "@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" @@ -188,15 +188,15 @@ "@babel/types" "^7.18.9" "@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6" - integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ== + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" + integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-member-expression-to-functions" "^7.18.9" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/traverse" "^7.19.1" + "@babel/types" "^7.19.0" "@babel/helper-simple-access@^7.18.6": version "7.18.6" @@ -225,9 +225,9 @@ integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== "@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== "@babel/helper-validator-option@^7.18.6": version "7.18.6" @@ -235,23 +235,23 @@ integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== "@babel/helper-wrap-function@^7.18.9": - version "7.18.11" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz#bff23ace436e3f6aefb61f85ffae2291c80ed1fb" - integrity sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w== + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz#89f18335cff1152373222f76a4b37799636ae8b1" + integrity sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg== dependencies: - "@babel/helper-function-name" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.18.11" - "@babel/types" "^7.18.10" + "@babel/traverse" "^7.19.0" + "@babel/types" "^7.19.0" -"@babel/helpers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" - integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== +"@babel/helpers@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.0.tgz#f30534657faf246ae96551d88dd31e9d1fa1fc18" + integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg== dependencies: - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.0" + "@babel/types" "^7.19.0" "@babel/highlight@^7.18.6": version "7.18.6" @@ -262,10 +262,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.18.10", "@babel/parser@^7.18.11", "@babel/parser@^7.18.8": - version "7.18.11" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9" - integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== +"@babel/parser@^7.18.10", "@babel/parser@^7.18.8", "@babel/parser@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.1.tgz#6f6d6c2e621aad19a92544cc217ed13f1aac5b4c" + integrity sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -283,13 +283,13 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-proposal-optional-chaining" "^7.18.9" -"@babel/plugin-proposal-async-generator-functions@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz#85ea478c98b0095c3e4102bff3b67d306ed24952" - integrity sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew== +"@babel/plugin-proposal-async-generator-functions@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz#34f6f5174b688529342288cd264f80c9ea9fb4a7" + integrity sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q== dependencies: "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -554,16 +554,17 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-classes@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz#90818efc5b9746879b869d5ce83eb2aa48bbc3da" - integrity sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g== +"@babel/plugin-transform-classes@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz#0e61ec257fba409c41372175e7c1e606dc79bb20" + integrity sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.19.0" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/helper-replace-supers" "^7.18.9" "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" @@ -575,10 +576,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-destructuring@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz#68906549c021cb231bee1db21d3b5b095f8ee292" - integrity sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA== +"@babel/plugin-transform-destructuring@^7.18.13": + version "7.18.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz#9e03bc4a94475d62b7f4114938e6c5c33372cbf5" + integrity sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow== dependencies: "@babel/helper-plugin-utils" "^7.18.9" @@ -654,14 +655,14 @@ "@babel/helper-simple-access" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz#545df284a7ac6a05125e3e405e536c5853099a06" - integrity sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A== +"@babel/plugin-transform-modules-systemjs@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz#5f20b471284430f02d9c5059d9b9a16d4b085a1f" + integrity sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A== dependencies: "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-module-transforms" "^7.19.0" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/helper-validator-identifier" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" @@ -673,13 +674,13 @@ "@babel/helper-module-transforms" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz#c89bfbc7cc6805d692f3a49bc5fc1b630007246d" - integrity sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz#ec7455bab6cd8fb05c525a94876f435a48128888" + integrity sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.19.0" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-transform-new-target@^7.18.6": version "7.18.6" @@ -725,15 +726,15 @@ "@babel/plugin-transform-react-jsx" "^7.18.6" "@babel/plugin-transform-react-jsx@^7.18.6": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz#ea47b2c4197102c196cbd10db9b3bb20daa820f1" - integrity sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A== + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" + integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.18.10" + "@babel/types" "^7.19.0" "@babel/plugin-transform-react-pure-annotations@^7.18.6": version "7.18.6" @@ -759,15 +760,15 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-runtime@^7.16.0": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz#37d14d1fa810a368fd635d4d1476c0154144a96f" - integrity sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ== + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.1.tgz#a3df2d7312eea624c7889a2dcd37fd1dfd25b2c6" + integrity sha512-2nJjTUFIzBMP/f/miLxEK9vxwW/KUXsdvN4sR//TmuDhe6yU2h57WmIOE12Gng3MDP/xpjUV/ToZRdcf8Yj4fA== dependencies: "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.9" - babel-plugin-polyfill-corejs2 "^0.3.2" - babel-plugin-polyfill-corejs3 "^0.5.3" - babel-plugin-polyfill-regenerator "^0.4.0" + "@babel/helper-plugin-utils" "^7.19.0" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" semver "^6.3.0" "@babel/plugin-transform-shorthand-properties@^7.18.6": @@ -777,12 +778,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz#6ea7a6297740f381c540ac56caf75b05b74fb664" - integrity sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA== +"@babel/plugin-transform-spread@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz#dd60b4620c2fec806d60cfaae364ec2188d593b6" + integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-transform-sticky-regex@^7.18.6": @@ -822,17 +823,17 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/preset-env@^7.16.0": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.10.tgz#83b8dfe70d7eea1aae5a10635ab0a5fe60dfc0f4" - integrity sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA== + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.19.1.tgz#9f04c916f9c0205a48ebe5cc1be7768eb1983f67" + integrity sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA== dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/compat-data" "^7.19.1" + "@babel/helper-compilation-targets" "^7.19.1" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/helper-validator-option" "^7.18.6" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.18.10" + "@babel/plugin-proposal-async-generator-functions" "^7.19.1" "@babel/plugin-proposal-class-properties" "^7.18.6" "@babel/plugin-proposal-class-static-block" "^7.18.6" "@babel/plugin-proposal-dynamic-import" "^7.18.6" @@ -866,9 +867,9 @@ "@babel/plugin-transform-async-to-generator" "^7.18.6" "@babel/plugin-transform-block-scoped-functions" "^7.18.6" "@babel/plugin-transform-block-scoping" "^7.18.9" - "@babel/plugin-transform-classes" "^7.18.9" + "@babel/plugin-transform-classes" "^7.19.0" "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.18.13" "@babel/plugin-transform-dotall-regex" "^7.18.6" "@babel/plugin-transform-duplicate-keys" "^7.18.9" "@babel/plugin-transform-exponentiation-operator" "^7.18.6" @@ -878,9 +879,9 @@ "@babel/plugin-transform-member-expression-literals" "^7.18.6" "@babel/plugin-transform-modules-amd" "^7.18.6" "@babel/plugin-transform-modules-commonjs" "^7.18.6" - "@babel/plugin-transform-modules-systemjs" "^7.18.9" + "@babel/plugin-transform-modules-systemjs" "^7.19.0" "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" "@babel/plugin-transform-new-target" "^7.18.6" "@babel/plugin-transform-object-super" "^7.18.6" "@babel/plugin-transform-parameters" "^7.18.8" @@ -888,18 +889,18 @@ "@babel/plugin-transform-regenerator" "^7.18.6" "@babel/plugin-transform-reserved-words" "^7.18.6" "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.18.9" + "@babel/plugin-transform-spread" "^7.19.0" "@babel/plugin-transform-sticky-regex" "^7.18.6" "@babel/plugin-transform-template-literals" "^7.18.9" "@babel/plugin-transform-typeof-symbol" "^7.18.9" "@babel/plugin-transform-unicode-escapes" "^7.18.10" "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.18.10" - babel-plugin-polyfill-corejs2 "^0.3.2" - babel-plugin-polyfill-corejs3 "^0.5.3" - babel-plugin-polyfill-regenerator "^0.4.0" - core-js-compat "^3.22.1" + "@babel/types" "^7.19.0" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" semver "^6.3.0" "@babel/preset-modules@^0.1.5": @@ -926,13 +927,13 @@ "@babel/plugin-transform-react-pure-annotations" "^7.18.6" "@babel/runtime@^7.16.0", "@babel/runtime@^7.8.4": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" - integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259" + integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.18.10", "@babel/template@^7.18.6": +"@babel/template@^7.18.10": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== @@ -941,26 +942,26 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/traverse@^7.18.10", "@babel/traverse@^7.18.11", "@babel/traverse@^7.18.9": - version "7.18.11" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.11.tgz#3d51f2afbd83ecf9912bcbb5c4d94e3d2ddaa16f" - integrity sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ== +"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.1.tgz#0fafe100a8c2a603b4718b1d9bf2568d1d193347" + integrity sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.10" + "@babel/generator" "^7.19.0" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.11" - "@babel/types" "^7.18.10" + "@babel/parser" "^7.19.1" + "@babel/types" "^7.19.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.4.4": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.10.tgz#4908e81b6b339ca7c6b7a555a5fc29446f26dde6" - integrity sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ== +"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.4.4": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.0.tgz#75f21d73d73dc0351f3368d28db73465f4814600" + integrity sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA== dependencies: "@babel/helper-string-parser" "^7.18.10" "@babel/helper-validator-identifier" "^7.18.6" @@ -979,9 +980,9 @@ node-hook "^1.0.0" "@badeball/cypress-cucumber-preprocessor@^12.0.0": - version "12.1.0" - resolved "https://registry.yarnpkg.com/@badeball/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-12.1.0.tgz#19be05b0fd7e70521436f164aff04e40e45cf20c" - integrity sha512-8yAlQpqpzODOW/G0k0/GUzGmNyixF+0GzhCmki3mK5zGlVIx1uYYMqOsUcMvAdYCiEbE0svBcGQ+VVSrgDksrQ== + version "12.2.0" + resolved "https://registry.yarnpkg.com/@badeball/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-12.2.0.tgz#1702bbc2a10b40c7e90f10bd1840761a86c7ecc9" + integrity sha512-XSuZl4eWMcfq8rauhUnvgbNeKiDLKfaR87huj9VwPAhfIc2cRHNHCiXCasB7ci99McGaudqLqu2QsfZMStTVag== dependencies: "@badeball/cypress-configuration" "^4.0.0" "@cucumber/cucumber-expressions" "^16.0.0" @@ -1105,14 +1106,14 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== -"@eslint/eslintrc@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" - integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== +"@eslint/eslintrc@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.2.tgz#58b69582f3b7271d8fa67fe5251767a5b38ea356" + integrity sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.3.2" + espree "^9.4.0" globals "^13.15.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -1134,6 +1135,11 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" @@ -1201,14 +1207,14 @@ fastq "^1.6.0" "@types/node@*": - version "18.7.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.9.tgz#180bfc495c91dc62573967edf047e15dbdce1491" - integrity sha512-0N5Y1XAdcl865nDdjbO0m3T6FdmQ4ijE89/urOHLREyTXbpMWbSafx9y7XIsgWGtwUP2iYTinLyyW3FatAxBLQ== + version "18.7.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.18.tgz#633184f55c322e4fb08612307c274ee6d5ed3154" + integrity sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg== "@types/node@^14.14.31": - version "14.18.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.25.tgz#57c72455af0a658da5b59aa062b2f89e73df0a61" - integrity sha512-9pLfceRSrKIsv/MISN6RoFWTIzka36Uk2Uuf5a8cHyDYhEgl5Hm5dXoe621KULeBjt+cFsY18mILsWWtJeG80w== + version "14.18.29" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.29.tgz#a0c58d67a42f8953c13d32f0acda47ed26dfce40" + integrity sha512-LhF+9fbIX4iPzhsRLpK5H7iPdvW8L4IwGciXQIOEcuF62+9nw/VQVsOViAOOGxY3OlOKGLFv0sWwJXdwQeTn6A== "@types/parse-json@^4.0.0": version "4.0.0" @@ -1423,29 +1429,29 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-plugin-polyfill-corejs2@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz#e4c31d4c89b56f3cf85b92558954c66b54bd972d" - integrity sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q== +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== dependencies: "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.2" + "@babel/helper-define-polyfill-provider" "^0.3.3" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz#d7e09c9a899079d71a8b670c6181af56ec19c5c7" - integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw== +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.2" - core-js-compat "^3.21.0" + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" -babel-plugin-polyfill-regenerator@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz#8f51809b6d5883e07e71548d75966ff7635527fe" - integrity sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw== +babel-plugin-polyfill-regenerator@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.2" + "@babel/helper-define-polyfill-provider" "^0.3.3" babelify@^10.0.0: version "10.0.0" @@ -1702,7 +1708,7 @@ browserify@^17.0.0: vm-browserify "^1.0.0" xtend "^4.0.0" -browserslist@^4.20.2, browserslist@^4.21.3: +browserslist@^4.21.3: version "4.21.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== @@ -1772,9 +1778,9 @@ callsites@^3.0.0: integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== caniuse-lite@^1.0.30001370: - version "1.0.30001381" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001381.tgz#e62955310e6e69cdf4b40bc5bc0895aa24bc4b8b" - integrity sha512-fEnkDOKpvp6qc+olg7+NzE1SqyfiyKf4uci7fAU38M3zxs0YOyKOxW/nMZ2l9sJbt7KZHcDIxUnbI0Iime7V4w== + version "1.0.30001400" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001400.tgz#3038bee70d8b875604cd8833cb0e5e254ee0281a" + integrity sha512-Mv659Hn65Z4LgZdJ7ge5JTVbE3rqbJaaXgW5LEI9/tOaXclfIZ8DW7D7FCWWWmWiiPS7AC48S8kf3DApSxQdgA== caseless@~0.12.0: version "0.12.0" @@ -1819,9 +1825,9 @@ chokidar@^3.4.0: fsevents "~2.3.2" ci-info@^3.2.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" - integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== + version "3.4.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.4.0.tgz#b28484fd436cbc267900364f096c9dc185efb251" + integrity sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -1976,13 +1982,12 @@ convert-source-map@~1.1.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" integrity sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg== -core-js-compat@^3.21.0, core-js-compat@^3.22.1: - version "3.24.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.24.1.tgz#d1af84a17e18dfdd401ee39da9996f9a7ba887de" - integrity sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw== +core-js-compat@^3.25.1: + version "3.25.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.25.1.tgz#6f13a90de52f89bbe6267e5620a412c7f7ff7e42" + integrity sha512-pOHS7O0i8Qt4zlPW/eIFjwp+NrTPx+wTL0ctgI2fHn31sZOq89rDsmtc/A2vAX7r6shl+bmVI+678He46jgBlw== dependencies: browserslist "^4.21.3" - semver "7.0.0" core-util-is@1.0.2: version "1.0.2" @@ -2063,9 +2068,9 @@ crypto-browserify@^3.0.0: randomfill "^1.0.3" cypress@^10.4.0: - version "10.6.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.6.0.tgz#13f46867febf2c3715874ed5dce9c2e946b175fe" - integrity sha512-6sOpHjostp8gcLO34p6r/Ci342lBs8S5z9/eb3ZCQ22w2cIhMWGUoGKkosabPBfKcvRS9BE4UxybBtlIs8gTQA== + version "10.8.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.8.0.tgz#12a681f2642b6f13d636bab65d5b71abdb1497a5" + integrity sha512-QVse0dnLm018hgti2enKMVZR9qbIO488YGX06nH5j3Dg1isL38DwrBtyrax02CANU6y8F4EJUuyW6HJKw1jsFA== dependencies: "@cypress/request" "^2.88.10" "@cypress/xvfb" "^1.2.4" @@ -2086,7 +2091,7 @@ cypress@^10.4.0: dayjs "^1.10.4" debug "^4.3.2" enquirer "^2.3.6" - eventemitter2 "^6.4.3" + eventemitter2 "6.4.7" execa "4.1.0" executable "^4.1.1" extract-zip "2.0.1" @@ -2235,9 +2240,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.4.202: - version "1.4.225" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.225.tgz#3e27bdd157cbaf19768141f2e0f0f45071e52338" - integrity sha512-ICHvGaCIQR3P88uK8aRtx8gmejbVJyC6bB4LEC3anzBrIzdzC7aiZHY4iFfXhN4st6I7lMO0x4sgBHf/7kBvRw== + version "1.4.251" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.251.tgz#8b62448f3c591f0d32488df09454dda72dec96d5" + integrity sha512-k4o4cFrWPv4SoJGGAydd07GmlRVzmeDIJ6MaEChTUjk4Dmomn189tCicSzil2oyvbPoGgg2suwPDNWq4gWRhoQ== elliptic@^6.5.3: version "6.5.4" @@ -2279,15 +2284,15 @@ error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0: - version "1.20.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" - integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== + version "1.20.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.2.tgz#8495a07bc56d342a3b8ea3ab01bd986700c2ccb3" + integrity sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.1.1" + get-intrinsic "^1.1.2" get-symbol-description "^1.0.0" has "^1.0.3" has-property-descriptors "^1.0.0" @@ -2299,9 +2304,9 @@ es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0: is-shared-array-buffer "^1.0.2" is-string "^1.0.7" is-weakref "^1.0.2" - object-inspect "^1.12.0" + object-inspect "^1.12.2" object-keys "^1.1.1" - object.assign "^4.1.2" + object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" string.prototype.trimend "^1.0.5" string.prototype.trimstart "^1.0.5" @@ -2484,13 +2489,14 @@ eslint-visitor-keys@^3.3.0: integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== eslint@^8.19.0: - version "8.22.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.22.0.tgz#78fcb044196dfa7eef30a9d65944f6f980402c48" - integrity sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA== + version "8.23.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.1.tgz#cfd7b3f7fdd07db8d16b4ac0516a29c8d8dca5dc" + integrity sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg== dependencies: - "@eslint/eslintrc" "^1.3.0" + "@eslint/eslintrc" "^1.3.2" "@humanwhocodes/config-array" "^0.10.4" "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" + "@humanwhocodes/module-importer" "^1.0.1" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -2500,13 +2506,12 @@ eslint@^8.19.0: eslint-scope "^7.1.1" eslint-utils "^3.0.0" eslint-visitor-keys "^3.3.0" - espree "^9.3.3" + espree "^9.4.0" esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" find-up "^5.0.0" - functional-red-black-tree "^1.0.1" glob-parent "^6.0.1" globals "^13.15.0" globby "^11.1.0" @@ -2515,6 +2520,7 @@ eslint@^8.19.0: import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" + js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" @@ -2526,12 +2532,11 @@ eslint@^8.19.0: strip-ansi "^6.0.1" strip-json-comments "^3.1.0" text-table "^0.2.0" - v8-compile-cache "^2.0.3" -espree@^9.3.2, espree@^9.3.3: - version "9.3.3" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.3.tgz#2dd37c4162bb05f433ad3c1a52ddf8a49dc08e9d" - integrity sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng== +espree@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" + integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== dependencies: acorn "^8.8.0" acorn-jsx "^5.3.2" @@ -2561,7 +2566,7 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -eventemitter2@^6.4.3: +eventemitter2@6.4.7: version "6.4.7" resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== @@ -2638,9 +2643,9 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -2775,11 +2780,6 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - functions-have-names@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" @@ -2795,10 +2795,10 @@ get-assigned-identifiers@^1.2.0: resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -3120,9 +3120,9 @@ is-buffer@^1.1.0: integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + version "1.2.6" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.6.tgz#fd6170b0b8c7e2cc73de342ef8284a2202023c44" + integrity sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q== is-ci@^3.0.0: version "3.0.1" @@ -3276,6 +3276,11 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== +js-sdsl@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.4.tgz#78793c90f80e8430b7d8dc94515b6c77d98a26a6" + integrity sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -3613,7 +3618,7 @@ object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.0, object-inspect@^1.9.0: +object-inspect@^1.12.2, object-inspect@^1.9.0: version "1.12.2" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== @@ -3623,7 +3628,7 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.0, object.assign@^4.1.2: +object.assign@^4.1.0, object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -3954,10 +3959,10 @@ reflect-metadata@0.1.13: resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== -regenerate-unicode-properties@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" - integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== dependencies: regenerate "^1.4.2" @@ -4005,26 +4010,26 @@ regexpp@^3.2.0: integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== regexpu-core@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d" - integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA== + version "5.2.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.1.tgz#a69c26f324c1e962e9ffd0b88b055caba8089139" + integrity sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ== dependencies: regenerate "^1.4.2" - regenerate-unicode-properties "^10.0.1" - regjsgen "^0.6.0" - regjsparser "^0.8.2" + regenerate-unicode-properties "^10.1.0" + regjsgen "^0.7.1" + regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.0.0" -regjsgen@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" - integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== +regjsgen@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" + integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== -regjsparser@^0.8.2: - version "0.8.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" - integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" @@ -4123,11 +4128,6 @@ safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -4491,9 +4491,9 @@ typedarray@^0.0.6: integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typescript@^4.7.4: - version "4.7.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" - integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== + version "4.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.3.tgz#d59344522c4bc464a65a730ac695007fdb66dd88" + integrity sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig== umd@^3.0.0: version "3.0.3" @@ -4540,9 +4540,9 @@ unicode-match-property-value-ecmascript@^2.0.0: integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== universalify@^2.0.0: version "2.0.0" @@ -4555,9 +4555,9 @@ untildify@^4.0.0: integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== update-browserslist-db@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" - integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== + version "1.0.9" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz#2924d3927367a38d5c555413a7ce138fc95fcb18" + integrity sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -4613,11 +4613,6 @@ uuid@8.3.2, uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" From 9890898191147e76985de93bbb7fe90170c0b70a Mon Sep 17 00:00:00 2001 From: mahula Date: Thu, 15 Sep 2022 09:14:29 +0200 Subject: [PATCH 073/304] add custom command for reusable login via API --- e2e-tests/cypress/tests/cypress.config.ts | 5 +++- .../cypress/tests/cypress/support/e2e.ts | 26 +++++++++++++++++++ .../cypress/tests/cypress/support/index.ts | 11 ++++++++ e2e-tests/cypress/tests/tsconfig.json | 4 +-- 4 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 e2e-tests/cypress/tests/cypress/support/e2e.ts create mode 100644 e2e-tests/cypress/tests/cypress/support/index.ts diff --git a/e2e-tests/cypress/tests/cypress.config.ts b/e2e-tests/cypress/tests/cypress.config.ts index 0f1d6aa01..e4ae6c34d 100644 --- a/e2e-tests/cypress/tests/cypress.config.ts +++ b/e2e-tests/cypress/tests/cypress.config.ts @@ -31,13 +31,16 @@ export default defineConfig({ excludeSpecPattern: "*.js", baseUrl: 'http://localhost:3000', chromeWebSecurity: false, - supportFile: false, + supportFile: 'cypress/support/index.ts', viewportHeight: 720, viewportWidth: 1280, retries: { runMode: 2, openMode: 0 }, + env: { + backendURL: 'http://localhost:4000', + }, setupNodeEvents } }) diff --git a/e2e-tests/cypress/tests/cypress/support/e2e.ts b/e2e-tests/cypress/tests/cypress/support/e2e.ts new file mode 100644 index 000000000..c34292165 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/support/e2e.ts @@ -0,0 +1,26 @@ +Cypress.Commands.add('login', (email, password) => { + Cypress.LocalStorage.clear + + cy.request({ + method: 'POST', + url: Cypress.env('backendURL'), + body: { + "operationName": null, + "variables": { + "email": email, + "password": password + }, + "query": "query ($email: String!, $password: String!, $publisherId: Int) {\n login(email: $email, password: $password, publisherId: $publisherId) {\n email\n firstName\n lastName\n language\n klickTipp {\n newsletterState\n __typename\n }\n hasElopage\n publisherId\n isAdmin\n creation\n __typename\n }\n}\n" + } + }) + .then((response) => { + let vuexToken = { + token : JSON.parse(JSON.stringify(response.headers))['token'], + // TODO: how to compute the token time from the token im response? + tokenTime : 1663224487 + }; + + cy.visit('/'); + window.localStorage.setItem('vuex', JSON.stringify(vuexToken)); + }) +}) \ No newline at end of file diff --git a/e2e-tests/cypress/tests/cypress/support/index.ts b/e2e-tests/cypress/tests/cypress/support/index.ts new file mode 100644 index 000000000..b5db7da24 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/support/index.ts @@ -0,0 +1,11 @@ +/// + +import './e2e'; + +declare global { + namespace Cypress { + interface Chainable { + login(email: string, password: string): Chainable + } + } +} \ No newline at end of file diff --git a/e2e-tests/cypress/tests/tsconfig.json b/e2e-tests/cypress/tests/tsconfig.json index e9739ec00..c031a126e 100644 --- a/e2e-tests/cypress/tests/tsconfig.json +++ b/e2e-tests/cypress/tests/tsconfig.json @@ -3,8 +3,8 @@ "target": "es2016", "lib": ["es6", "dom"], "baseUrl": "../node_modules", - "types": ["cypress", "node"], - "strict": true + "types": ["cypress", "node"], + "strict": true }, "include": ["**/*.ts"] } From 7e20531f3968fef12e75bfa7cc28453eb6f9057b Mon Sep 17 00:00:00 2001 From: mahula Date: Thu, 15 Sep 2022 09:55:44 +0200 Subject: [PATCH 074/304] update user authentication feature test --- .../cypress/e2e/User.Authentication.feature | 10 ++++----- .../tests/cypress/e2e/gradido_login.cy.js | 21 ------------------- .../tests/cypress/e2e/models/LoginPage.ts | 16 +++++++------- .../tests/cypress/e2e/models/OverviewPage.ts | 2 +- ...ser_is_logged_in_with_username_{string}.ts | 10 +++++++++ ...bmits_the_credentials_{string}_{string}.ts | 2 +- 6 files changed, 25 insertions(+), 36 deletions(-) delete mode 100644 e2e-tests/cypress/tests/cypress/e2e/gradido_login.cy.js create mode 100644 e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_is_logged_in_with_username_{string}.ts rename e2e-tests/cypress/tests/cypress/{e2e/User.Authentication => support/step_definitions}/the_user_submits_the_credentials_{string}_{string}.ts (84%) diff --git a/e2e-tests/cypress/tests/cypress/e2e/User.Authentication.feature b/e2e-tests/cypress/tests/cypress/e2e/User.Authentication.feature index 3f5129f1f..e2c459692 100644 --- a/e2e-tests/cypress/tests/cypress/e2e/User.Authentication.feature +++ b/e2e-tests/cypress/tests/cypress/e2e/User.Authentication.feature @@ -4,14 +4,14 @@ Feature: User authentication In order to be able to posts and do other contributions as myself Furthermore I want to be able to stay logged in and logout again -# Background: -# Given the following "users" are in the database: -# | email | password | name | -# | bibi@bloxberg.de | Aa12345_ | Bibi Bloxberg | + # TODO for these pre-conditions utilize seeding or API check, if user exists in test system + # Background: + # Given the following "users" are in the database: + # | email | password | name | + # | bibi@bloxberg.de | Aa12345_ | Bibi Bloxberg | Scenario: Log in successfully Given the browser navigates to page "/login" When the user submits the credentials "bibi@bloxberg.de" "Aa12345_" Then the user is logged in with username "Bibi Bloxberg" - \ No newline at end of file diff --git a/e2e-tests/cypress/tests/cypress/e2e/gradido_login.cy.js b/e2e-tests/cypress/tests/cypress/e2e/gradido_login.cy.js deleted file mode 100644 index 2a2f8b8ce..000000000 --- a/e2e-tests/cypress/tests/cypress/e2e/gradido_login.cy.js +++ /dev/null @@ -1,21 +0,0 @@ -import users from '../fixtures/users' -import LoginPage from './models/LoginPage' - -describe('Gradido', () => { - let userData; - - before(() => { - cy.fixture('users').then((usersFixture) => { - userData = usersFixture; - }); - }); - - it('login test (happy path)', () => { - const loginPage = new LoginPage(); - loginPage.goto(); - loginPage.enterEmail(userData.user.email); - loginPage.enterPassword(userData.user.password); - loginPage.submitLogin(); - cy.url().should('be.equal', `${Cypress.config('baseUrl')}/overview`); - }); -}); diff --git a/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.ts b/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.ts index 065646543..9886a80ff 100644 --- a/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.ts +++ b/e2e-tests/cypress/tests/cypress/e2e/models/LoginPage.ts @@ -2,11 +2,11 @@ export class LoginPage { // selectors - emailInputSelector = '[id=Email-input-field]'; - passwordInputSelector = '[id=Passwort-input-field]'; - submitBtnSelector = '[type=submit]'; - emailHintSelector = '[id=vee_Email]'; - passwordHintSelector = '[id=vee_Passwort]'; + emailInput = '#Email-input-field'; + passwordInput = '#Passwort-input-field'; + submitBtn = '[type=submit]'; + emailHint = '#vee_Email'; + passwordHint = '#vee_Passwort'; goto() { cy.visit('/'); @@ -14,17 +14,17 @@ export class LoginPage { } enterEmail(email: string) { - cy.get(this.emailInputSelector).clear().type(email); + cy.get(this.emailInput).clear().type(email); return this; } enterPassword(password: string) { - cy.get(this.passwordInputSelector).clear().type(password); + cy.get(this.passwordInput).clear().type(password); return this; } submitLogin() { - cy.get(this.submitBtnSelector).click(); + cy.get(this.submitBtn).click(); return this; } } diff --git a/e2e-tests/cypress/tests/cypress/e2e/models/OverviewPage.ts b/e2e-tests/cypress/tests/cypress/e2e/models/OverviewPage.ts index 85dc97083..1de37abe2 100644 --- a/e2e-tests/cypress/tests/cypress/e2e/models/OverviewPage.ts +++ b/e2e-tests/cypress/tests/cypress/e2e/models/OverviewPage.ts @@ -1,7 +1,7 @@ /// export class OverviewPage { - navbarNameSelector = '[data-test="navbar-item-username"]'; + navbarName = '[data-test="navbar-item-username"]'; goto() { cy.visit('/overview'); diff --git a/e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_is_logged_in_with_username_{string}.ts b/e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_is_logged_in_with_username_{string}.ts new file mode 100644 index 000000000..4a01a988f --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_is_logged_in_with_username_{string}.ts @@ -0,0 +1,10 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; +import { OverviewPage } from "../../e2e/models/OverviewPage"; + +Then("the user is logged in with username {string}", (username: string) => { + const overviewPage = new OverviewPage(); + cy.url().should('include', '/overview') + cy.get(overviewPage.navbarName).should('contain', username); +}); + + diff --git a/e2e-tests/cypress/tests/cypress/e2e/User.Authentication/the_user_submits_the_credentials_{string}_{string}.ts b/e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_submits_the_credentials_{string}_{string}.ts similarity index 84% rename from e2e-tests/cypress/tests/cypress/e2e/User.Authentication/the_user_submits_the_credentials_{string}_{string}.ts rename to e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_submits_the_credentials_{string}_{string}.ts index 94a8f7593..d6766f837 100644 --- a/e2e-tests/cypress/tests/cypress/e2e/User.Authentication/the_user_submits_the_credentials_{string}_{string}.ts +++ b/e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_submits_the_credentials_{string}_{string}.ts @@ -1,5 +1,5 @@ import { When } from "@badeball/cypress-cucumber-preprocessor"; -import { LoginPage } from "../models/LoginPage"; +import { LoginPage } from "../../e2e/models/LoginPage"; When("the user submits the credentials {string} {string}", (email: string, password: string) => { const loginPage = new LoginPage; From ce63ffed354196517c2b09db23daf25237fe12d9 Mon Sep 17 00:00:00 2001 From: mahula Date: Thu, 15 Sep 2022 10:13:02 +0200 Subject: [PATCH 075/304] add feature test for changing the password in user profile --- ...s_displayed_with_the_username _{string}.ts | 10 ------ .../e2e/UserProfile.ChangePassword.feature | 27 ++++++++++++++ .../the_user_fills_the_password_form_with.ts | 11 ++++++ ...he_user_is_presented_a_{string}_message.ts | 8 +++++ ...the_user_opens_the_change_password_menu.ts | 9 +++++ .../the_user_submits_the_password_form.ts | 7 ++++ .../tests/cypress/e2e/models/ProfilePage.ts | 35 +++++++++++++++++++ .../tests/cypress/e2e/models/SideNavMenu.ts | 17 +++++++++ .../tests/cypress/e2e/models/Toasts.ts | 7 ++++ .../step_definitions/the_user_cannot_login.ts | 8 +++++ ..._user_is_logged_in_as_{string}_{string}.ts | 5 +++ .../step_definitions/the_user_logs_out.ts | 7 ++++ .../Inputs/InputPasswordConfirmation.vue | 1 + frontend/src/components/Menu/Sidebar.vue | 4 +-- .../components/UserSettings/UserPassword.vue | 2 ++ 15 files changed, 146 insertions(+), 12 deletions(-) delete mode 100644 e2e-tests/cypress/tests/cypress/e2e/User.Authentication/the_user_is_logged_in_with_username_overview_page_is_displayed_with_the_username _{string}.ts create mode 100644 e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword.feature create mode 100644 e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword/the_user_fills_the_password_form_with.ts create mode 100644 e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword/the_user_is_presented_a_{string}_message.ts create mode 100644 e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword/the_user_opens_the_change_password_menu.ts create mode 100644 e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword/the_user_submits_the_password_form.ts create mode 100644 e2e-tests/cypress/tests/cypress/e2e/models/ProfilePage.ts create mode 100644 e2e-tests/cypress/tests/cypress/e2e/models/SideNavMenu.ts create mode 100644 e2e-tests/cypress/tests/cypress/e2e/models/Toasts.ts create mode 100644 e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_cannot_login.ts create mode 100644 e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_is_logged_in_as_{string}_{string}.ts create mode 100644 e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_logs_out.ts diff --git a/e2e-tests/cypress/tests/cypress/e2e/User.Authentication/the_user_is_logged_in_with_username_overview_page_is_displayed_with_the_username _{string}.ts b/e2e-tests/cypress/tests/cypress/e2e/User.Authentication/the_user_is_logged_in_with_username_overview_page_is_displayed_with_the_username _{string}.ts deleted file mode 100644 index d37236335..000000000 --- a/e2e-tests/cypress/tests/cypress/e2e/User.Authentication/the_user_is_logged_in_with_username_overview_page_is_displayed_with_the_username _{string}.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Then } from "@badeball/cypress-cucumber-preprocessor"; -import { OverviewPage } from "../models/OverviewPage"; - -Then("the user is logged in with username {string}", (username: string) => { - const overviewPage = new OverviewPage(); - cy.url().should('include', '/overview') - cy.get(overviewPage.navbarNameSelector).should('contain', username); -}); - - diff --git a/e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword.feature b/e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword.feature new file mode 100644 index 000000000..ceee131fb --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword.feature @@ -0,0 +1,27 @@ +Feature: User profile - change password + As a user + I want the option to change my password on my profile page. + + Background: + # TODO for these pre-conditions utilize seeding or API check, if user exists in test system + # Given the following "users" are in the database: + # | email | password | name | + # | bibi@bloxberg.de | Aa12345_ | Bibi Bloxberg | | + + # TODO instead of credentials use the name of an user object (see seeds in backend) + Given the user is logged in as "bibi@bloxberg.de" "Aa12345_" + + Scenario: Change password successfully + Given the browser navigates to page "/profile" + And the user opens the change password menu + When the user fills the password form with: + | Old password | Aa12345_ | + | New password | 12345Aa_ | + | Repeat new password | 12345Aa_ | + And the user submits the password form + And the user is presented a "success" message + And the user logs out + Then the user submits the credentials "bibi@bloxberg.de" "Aa12345_" + And the user cannot login + But the user submits the credentials "bibi@bloxberg.de" "12345Aa_" + And the user is logged in with username "Bibi Bloxberg" diff --git a/e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword/the_user_fills_the_password_form_with.ts b/e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword/the_user_fills_the_password_form_with.ts new file mode 100644 index 000000000..c1c1084fd --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword/the_user_fills_the_password_form_with.ts @@ -0,0 +1,11 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; +import { ProfilePage } from "../models/ProfilePage"; + +When("the user fills the password form with:", table => { + table = table.rowsHash(); + const profilePage = new ProfilePage(); + profilePage.enterOldPassword(table["Old password"]); + profilePage.enterNewPassword(table["New password"]); + profilePage.enterRepeatPassword(table["Repeat new password"]); + cy.get(profilePage.submitNewPasswordBtn).should('be.enabled'); +}); \ No newline at end of file diff --git a/e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword/the_user_is_presented_a_{string}_message.ts b/e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword/the_user_is_presented_a_{string}_message.ts new file mode 100644 index 000000000..79b63e499 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword/the_user_is_presented_a_{string}_message.ts @@ -0,0 +1,8 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; +import { Toasts } from "../models/Toasts"; + +When("the user is presented a {string} message", (type: string) => { + const toast = new Toasts(); + cy.get(toast.toastTitle).should('contain.text', 'Success'); + cy.get(toast.toastMessage).should('contain.text', 'Your password has been changed.'); +}); \ No newline at end of file diff --git a/e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword/the_user_opens_the_change_password_menu.ts b/e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword/the_user_opens_the_change_password_menu.ts new file mode 100644 index 000000000..78e6cdfe0 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword/the_user_opens_the_change_password_menu.ts @@ -0,0 +1,9 @@ +import { And } from "@badeball/cypress-cucumber-preprocessor"; +import { ProfilePage } from "../models/ProfilePage"; + +And("the user opens the change password menu", () => { + const profilePage = new ProfilePage(); + cy.get(profilePage.openChangePassword).click(); + cy.get(profilePage.newPasswordRepeatInput).should('be.visible'); + cy.get(profilePage.submitNewPasswordBtn).should('be.disabled'); +}); \ No newline at end of file diff --git a/e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword/the_user_submits_the_password_form.ts b/e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword/the_user_submits_the_password_form.ts new file mode 100644 index 000000000..7730f04fc --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/e2e/UserProfile.ChangePassword/the_user_submits_the_password_form.ts @@ -0,0 +1,7 @@ +import { And } from "@badeball/cypress-cucumber-preprocessor"; +import { ProfilePage } from "../models/ProfilePage"; + +And("the user submits the password form", () => { + const profilePage = new ProfilePage(); + profilePage.submitPasswordForm(); +}); \ No newline at end of file diff --git a/e2e-tests/cypress/tests/cypress/e2e/models/ProfilePage.ts b/e2e-tests/cypress/tests/cypress/e2e/models/ProfilePage.ts new file mode 100644 index 000000000..f7a243a40 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/e2e/models/ProfilePage.ts @@ -0,0 +1,35 @@ +/// + +export class ProfilePage { + // selectors + openChangePassword = '[data-test=open-password-change-form]'; + oldPasswordInput = '#password-input-field'; + newPasswordInput = '#Neues-Passwort-input-field'; + newPasswordRepeatInput = '#Neues-Passwort-wiederholen-input-field'; + submitNewPasswordBtn = '[data-test=submit-new-password-btn]'; + + goto() { + cy.visit('/profile'); + return this; + } + + enterOldPassword(password: string) { + cy.get(this.oldPasswordInput).clear().type(password); + return this; + } + + enterNewPassword(password: string) { + cy.get(this.newPasswordInput).clear().type(password); + return this; + } + + enterRepeatPassword(password: string) { + cy.get(this.newPasswordRepeatInput).clear().type(password); + return this; + } + + submitPasswordForm() { + cy.get(this.submitNewPasswordBtn).click(); + return this; + } +} diff --git a/e2e-tests/cypress/tests/cypress/e2e/models/SideNavMenu.ts b/e2e-tests/cypress/tests/cypress/e2e/models/SideNavMenu.ts new file mode 100644 index 000000000..6770fe6ff --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/e2e/models/SideNavMenu.ts @@ -0,0 +1,17 @@ +/// + +export class SideNavMenu { + // selectors + profileMenu = '[data-test=profile-menu]'; + logoutMenu = '[data-test=logout-menu]'; + + openUserProfile() { + cy.get(this.profileMenu).click(); + return this; + } + + logout() { + cy.get(this.logoutMenu).click(); + return this; + } + } \ No newline at end of file diff --git a/e2e-tests/cypress/tests/cypress/e2e/models/Toasts.ts b/e2e-tests/cypress/tests/cypress/e2e/models/Toasts.ts new file mode 100644 index 000000000..86fed8933 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/e2e/models/Toasts.ts @@ -0,0 +1,7 @@ +/// + +export class Toasts { + // selectors + toastTitle = '.gdd-toaster-title'; + toastMessage = '.gdd-toaster-body'; +} \ No newline at end of file diff --git a/e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_cannot_login.ts b/e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_cannot_login.ts new file mode 100644 index 000000000..9f7607565 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_cannot_login.ts @@ -0,0 +1,8 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; +import { Toasts } from "../../e2e/models/Toasts"; + +Then("the user cannot login", () => { + const toast = new Toasts(); + cy.get(toast.toastTitle).should('contain.text', 'Fehler!'); // 'Error!' + cy.get(toast.toastMessage).should('contain.text', 'Kein Benutzer mit diesen Anmeldedaten.'); // 'No user with this credentials.' +}); diff --git a/e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_is_logged_in_as_{string}_{string}.ts b/e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_is_logged_in_as_{string}_{string}.ts new file mode 100644 index 000000000..e8692da38 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_is_logged_in_as_{string}_{string}.ts @@ -0,0 +1,5 @@ +import { Given } from "@badeball/cypress-cucumber-preprocessor"; + +Given("the user is logged in as {string} {string}", (email: string, password: string) => { + cy.login(email, password); +}); \ No newline at end of file diff --git a/e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_logs_out.ts b/e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_logs_out.ts new file mode 100644 index 000000000..2822fce78 --- /dev/null +++ b/e2e-tests/cypress/tests/cypress/support/step_definitions/the_user_logs_out.ts @@ -0,0 +1,7 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; +import { SideNavMenu } from "../../e2e/models/SideNavMenu"; + +Then("the user logs out", () => { + const sideNavMenu = new SideNavMenu; + sideNavMenu.logout(); +}); \ No newline at end of file diff --git a/frontend/src/components/Inputs/InputPasswordConfirmation.vue b/frontend/src/components/Inputs/InputPasswordConfirmation.vue index 8154984ef..3209018c3 100644 --- a/frontend/src/components/Inputs/InputPasswordConfirmation.vue +++ b/frontend/src/components/Inputs/InputPasswordConfirmation.vue @@ -12,6 +12,7 @@ atLeastOneSpecialCharater: true, noWhitespaceCharacters: true, }" + id="new-password-input-field" :label="register ? $t('form.password') : $t('form.password_new')" :showAllErrors="true" :immediate="true" diff --git a/frontend/src/components/Menu/Sidebar.vue b/frontend/src/components/Menu/Sidebar.vue index 4b38851b2..f6abb6fbc 100644 --- a/frontend/src/components/Menu/Sidebar.vue +++ b/frontend/src/components/Menu/Sidebar.vue @@ -24,7 +24,7 @@ {{ $t('navigation.community') }} - + {{ $t('navigation.profile') }} @@ -48,7 +48,7 @@ {{ $t('navigation.admin_area') }} - + {{ $t('navigation.logout') }} diff --git a/frontend/src/components/UserSettings/UserPassword.vue b/frontend/src/components/UserSettings/UserPassword.vue index 0ba1576e8..2f571d400 100644 --- a/frontend/src/components/UserSettings/UserPassword.vue +++ b/frontend/src/components/UserSettings/UserPassword.vue @@ -6,6 +6,7 @@ {{ $t('settings.password.change-password') }} @@ -36,6 +37,7 @@ :variant="disabled ? 'light' : 'success'" class="mt-4" :disabled="disabled" + data-test="submit-new-password-btn" > {{ $t('form.save') }} From 4f589d95c69286a1c6bdaaf58235637c086cf5ca Mon Sep 17 00:00:00 2001 From: mahula Date: Thu, 15 Sep 2022 10:31:04 +0200 Subject: [PATCH 076/304] update .gitignore for cypress directory --- e2e-tests/cypress/.gitignore | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 e2e-tests/cypress/.gitignore diff --git a/e2e-tests/cypress/.gitignore b/e2e-tests/cypress/.gitignore new file mode 100644 index 000000000..7dfc547b4 --- /dev/null +++ b/e2e-tests/cypress/.gitignore @@ -0,0 +1,4 @@ +tests/node_modules/ +tests/cypress/screenshots/ +tests/cypress/videos/ +tests/cucumber-messages.ndjson From ad66d2519ee5f0b2335f4681201e447a5b8be1e8 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 15 Sep 2022 12:29:28 +0200 Subject: [PATCH 077/304] refactor: Add Client Request Time to Client Request and Add it to Context --- frontend/src/plugins/apolloProvider.js | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/plugins/apolloProvider.js b/frontend/src/plugins/apolloProvider.js index 4a0ff9914..05954d36b 100644 --- a/frontend/src/plugins/apolloProvider.js +++ b/frontend/src/plugins/apolloProvider.js @@ -12,6 +12,7 @@ const authLink = new ApolloLink((operation, forward) => { operation.setContext({ headers: { Authorization: token && token.length > 0 ? `Bearer ${token}` : '', + clientRequestTime: new Date().toString(), }, }) return forward(operation).map((response) => { From 80bbf2411669740747efcc3271bc49bc434ee88c Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 15 Sep 2022 12:30:29 +0200 Subject: [PATCH 078/304] add client request time to context --- backend/src/server/context.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/backend/src/server/context.ts b/backend/src/server/context.ts index d9fd55fe4..5bfc22e72 100644 --- a/backend/src/server/context.ts +++ b/backend/src/server/context.ts @@ -9,6 +9,7 @@ export interface Context { setHeaders: { key: string; value: string }[] role?: Role user?: dbUser + clientRequestTime?: string // hack to use less DB calls for Balance Resolver lastTransaction?: dbTransaction transactionCount?: number @@ -18,14 +19,17 @@ export interface Context { const context = (args: ExpressContext): Context => { const authorization = args.req.headers.authorization - let token: string | null = null - if (authorization) { - token = authorization.replace(/^Bearer /, '') - } - const context = { - token, + const clientRequestTime = args.req.headers.clientrequesttime + const context: Context = { + token: null, setHeaders: [], } + if (authorization) { + context.token = authorization.replace(/^Bearer /, '') + } + if (clientRequestTime && typeof clientRequestTime === 'string') { + context.clientRequestTime = clientRequestTime + } return context } From 23f5ebabd3d2eb5be98d5437b7e61b4629066721 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 15 Sep 2022 12:35:08 +0200 Subject: [PATCH 079/304] add client request time to request header of admin interface --- admin/src/plugins/apolloProvider.js | 1 + 1 file changed, 1 insertion(+) diff --git a/admin/src/plugins/apolloProvider.js b/admin/src/plugins/apolloProvider.js index 1f51be20a..95b7aab7e 100644 --- a/admin/src/plugins/apolloProvider.js +++ b/admin/src/plugins/apolloProvider.js @@ -10,6 +10,7 @@ const authLink = new ApolloLink((operation, forward) => { operation.setContext({ headers: { Authorization: token && token.length > 0 ? `Bearer ${token}` : '', + clientRequestTime: new Date().toString(), }, }) return forward(operation).map((response) => { From 7e9a82d7cfcca0f9f8e09d082476aec5c4777060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 15 Sep 2022 15:35:00 +0200 Subject: [PATCH 080/304] Update install.sh --- deployment/bare_metal/install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deployment/bare_metal/install.sh b/deployment/bare_metal/install.sh index 0fcf6d847..90b647f0e 100755 --- a/deployment/bare_metal/install.sh +++ b/deployment/bare_metal/install.sh @@ -90,7 +90,7 @@ sudo certbot # Install logrotate sudo apt-get install -y logrotate envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $SCRIPT_DIR/logrotate/gradido.conf.template > $SCRIPT_DIR/logrotate/gradido.conf -sudo mv $SCRIPT_DIR/logrotate/gradido.conf /etc/logrotate.d/gradido.conf +sudo mv $SCRIPT_DIR/logrotate/gradido.conf.template /etc/logrotate.d/gradido.conf sudo chown root:root /etc/logrotate.d/gradido.conf # Install mysql autobackup @@ -133,4 +133,4 @@ envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/admin/.env.te # Start gradido # Note: on first startup some errors will occur - nothing serious -./start.sh \ No newline at end of file +./start.sh From ef8cbacb6d248857c711de922f716ece5fd41e29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 15 Sep 2022 15:42:39 +0200 Subject: [PATCH 081/304] Update install.sh --- deployment/bare_metal/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/bare_metal/install.sh b/deployment/bare_metal/install.sh index 90b647f0e..0bcea653b 100755 --- a/deployment/bare_metal/install.sh +++ b/deployment/bare_metal/install.sh @@ -90,7 +90,7 @@ sudo certbot # Install logrotate sudo apt-get install -y logrotate envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $SCRIPT_DIR/logrotate/gradido.conf.template > $SCRIPT_DIR/logrotate/gradido.conf -sudo mv $SCRIPT_DIR/logrotate/gradido.conf.template /etc/logrotate.d/gradido.conf +sudo cp $SCRIPT_DIR/logrotate/gradido.conf.template /etc/logrotate.d/gradido.conf sudo chown root:root /etc/logrotate.d/gradido.conf # Install mysql autobackup From 03672bef255551ea730807c05cb33390457d7988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 15 Sep 2022 16:27:22 +0200 Subject: [PATCH 082/304] Update install.sh --- deployment/bare_metal/install.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/deployment/bare_metal/install.sh b/deployment/bare_metal/install.sh index 0bcea653b..01b1e7a0b 100755 --- a/deployment/bare_metal/install.sh +++ b/deployment/bare_metal/install.sh @@ -4,6 +4,12 @@ # How to do this is described in detail in [setup.md](./setup.md) # Find current directory & configure paths +## For manualy use in terminal +## set -o allexport +## SCRIPT_DIR=$(pwd) +## PROJECT_ROOT=$SCRIPT_DIR/../.. +## set +o allexport +# Use here in script set -o allexport SCRIPT_PATH=$(realpath $0) SCRIPT_DIR=$(dirname $SCRIPT_PATH) From 9624a79881596f3b7c4c47ef48181f0c9672c14c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 15 Sep 2022 17:22:48 +0200 Subject: [PATCH 083/304] Update setup.md --- deployment/bare_metal/setup.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/deployment/bare_metal/setup.md b/deployment/bare_metal/setup.md index f43a3d655..7c1154862 100644 --- a/deployment/bare_metal/setup.md +++ b/deployment/bare_metal/setup.md @@ -95,5 +95,17 @@ > cp .env.dist .env > nano .env >> Adjust values accordingly + # TODO the install.sh is not yet ready to run directly - consider to use it as pattern to do it manually -> ./install.sh + +!!! ATTENTION: + +- NGINX: + - Be aware to set the values for NGINX in the following files according to your needs before you install NGINX! + - `./nginx/sites-available/gradido.conf` + - `./nginx/sites-available/update-page.conf` +- Commands in `./install.sh`: + - The commands for setting the paths in the used env variables are not working directly in the terminal, consider the out commented commands for this purpose, see below. + +Follow the commands in `./install.sh`. + From bb8fc6a16eeb635c8c110b66e5df3512f67564ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Thu, 15 Sep 2022 17:48:22 +0200 Subject: [PATCH 084/304] change using findUserByEmail() instead of raw queries --- backend/src/seeds/factory/creation.ts | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/backend/src/seeds/factory/creation.ts b/backend/src/seeds/factory/creation.ts index 99fd39d3b..606bac1f7 100644 --- a/backend/src/seeds/factory/creation.ts +++ b/backend/src/seeds/factory/creation.ts @@ -8,7 +8,7 @@ import { CreationInterface } from '@/seeds/creation/CreationInterface' import { ApolloServerTestClient } from 'apollo-server-testing' import { Transaction } from '@entity/Transaction' import { Contribution } from '@entity/Contribution' -import { UserContact } from '@entity/UserContact' +import { findUserByEmail } from '@/graphql/resolver/UserResolver' // import CONFIG from '@/config/index' export const nMonthsBefore = (date: Date, months = 1): string => { @@ -27,12 +27,7 @@ export const creationFactory = async ( await mutate({ mutation: adminCreateContribution, variables: { ...creation } }) logger.trace('creationFactory... after adminCreateContribution') - const userContact = await UserContact.findOneOrFail({ - where: { email: creation.email }, - relations: ['user'], - }) - logger.trace('creationFactory... after UserContact.findOneOrFail userContact=', userContact) - const user = userContact.user + const user = await findUserByEmail(creation.email) // userContact.user const pendingCreation = await Contribution.findOneOrFail({ where: { userId: user.id, amount: creation.amount }, From e3e5fdd12b4566287bd9e28b8761c73b8ef22abd Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 16 Sep 2022 08:22:24 +0200 Subject: [PATCH 085/304] remove modal box if redeem a redeemlink --- .../LinkInformations/RedeemValid.vue | 2 +- frontend/src/pages/TransactionLink.spec.js | 56 +++++++++---------- frontend/src/pages/TransactionLink.vue | 7 +-- 3 files changed, 30 insertions(+), 35 deletions(-) diff --git a/frontend/src/components/LinkInformations/RedeemValid.vue b/frontend/src/components/LinkInformations/RedeemValid.vue index 353fefaf8..c468a396a 100644 --- a/frontend/src/components/LinkInformations/RedeemValid.vue +++ b/frontend/src/components/LinkInformations/RedeemValid.vue @@ -3,7 +3,7 @@

diff --git a/frontend/src/pages/TransactionLink.spec.js b/frontend/src/pages/TransactionLink.spec.js index b1bbd8950..fd58d6e1c 100644 --- a/frontend/src/pages/TransactionLink.spec.js +++ b/frontend/src/pages/TransactionLink.spec.js @@ -282,18 +282,18 @@ describe('TransactionLink', () => { }) describe('redeem link with success', () => { - let spy + // let spy beforeEach(async () => { - spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm') + // spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm') apolloMutateMock.mockResolvedValue() - spy.mockImplementation(() => Promise.resolve(true)) + // spy.mockImplementation(() => Promise.resolve(true)) await wrapper.findComponent({ name: 'RedeemValid' }).find('button').trigger('click') }) - it('opens the modal', () => { - expect(spy).toBeCalledWith('gdd_per_link.redeem-text') - }) + // it('opens the modal', () => { + // expect(spy).toBeCalledWith('gdd_per_link.redeem-text') + // }) it('calls the API', () => { expect(apolloMutateMock).toBeCalledWith( @@ -316,37 +316,37 @@ describe('TransactionLink', () => { }) }) - describe('cancel redeem link', () => { - let spy + // describe('cancel redeem link', () => { + // let spy - beforeEach(async () => { - spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm') - apolloMutateMock.mockResolvedValue() - spy.mockImplementation(() => Promise.resolve(false)) - await wrapper.findComponent({ name: 'RedeemValid' }).find('button').trigger('click') - }) + // beforeEach(async () => { + // spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm') + // apolloMutateMock.mockResolvedValue() + // spy.mockImplementation(() => Promise.resolve(false)) + // await wrapper.findComponent({ name: 'RedeemValid' }).find('button').trigger('click') + // }) - it('does not call the API', () => { - expect(apolloMutateMock).not.toBeCalled() - }) + // it('does not call the API', () => { + // expect(apolloMutateMock).not.toBeCalled() + // }) - it('does not toasts a success message', () => { - expect(mocks.$t).not.toBeCalledWith('gdd_per_link.redeemed', { n: '22' }) - expect(toastSuccessSpy).not.toBeCalled() - }) + // it('does not toasts a success message', () => { + // expect(mocks.$t).not.toBeCalledWith('gdd_per_link.redeemed', { n: '22' }) + // expect(toastSuccessSpy).not.toBeCalled() + // }) - it('does not push the route', () => { - expect(routerPushMock).not.toBeCalled() - }) - }) + // it('does not push the route', () => { + // expect(routerPushMock).not.toBeCalled() + // }) + // }) describe('redeem link with error', () => { - let spy + // let spy beforeEach(async () => { - spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm') + // spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm') apolloMutateMock.mockRejectedValue({ message: 'Oh Noo!' }) - spy.mockImplementation(() => Promise.resolve(true)) + // spy.mockImplementation(() => Promise.resolve(true)) await wrapper.findComponent({ name: 'RedeemValid' }).find('button').trigger('click') }) diff --git a/frontend/src/pages/TransactionLink.vue b/frontend/src/pages/TransactionLink.vue index 57236b55c..bd1909d7d 100644 --- a/frontend/src/pages/TransactionLink.vue +++ b/frontend/src/pages/TransactionLink.vue @@ -14,7 +14,7 @@ @@ -98,11 +98,6 @@ export default { this.$router.push('/overview') }) }, - redeemLink(amount) { - this.$bvModal.msgBoxConfirm(this.$t('gdd_per_link.redeem-text')).then((value) => { - if (value) this.mutationLink(amount) - }) - }, }, computed: { isContributionLink() { From caf487d2062667ac77794d0ea8624362b7737924 Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 16 Sep 2022 08:24:31 +0200 Subject: [PATCH 086/304] remove text from modal for redeem link --- frontend/src/locales/de.json | 1 - frontend/src/locales/en.json | 1 - frontend/src/locales/es.json | 1 - frontend/src/locales/fr.json | 1 - frontend/src/locales/nl.json | 1 - frontend/src/pages/TransactionLink.spec.js | 34 ---------------------- 6 files changed, 39 deletions(-) diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index e6b12b0fa..1ed8af19f 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -178,7 +178,6 @@ "no-redeem": "Du darfst deinen eigenen Link nicht einlösen!", "not-copied": "Dein Gerät lässt das Kopieren leider nicht zu! Bitte kopiere den Link von Hand!", "redeem": "Einlösen", - "redeem-text": "Willst du den Betrag jetzt einlösen?", "redeemed": "Erfolgreich eingelöst! Deinem Konto wurden {n} GDD gutgeschrieben.", "redeemed-at": "Der Link wurde bereits am {date} eingelöst.", "redeemed-title": "eingelöst", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 07125eceb..113fa1cb9 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -178,7 +178,6 @@ "no-redeem": "You not allowed to redeem your own link!", "not-copied": "Unfortunately, your device does not allow copying! Please copy the link by hand!", "redeem": "Redeem", - "redeem-text": "Do you want to redeem the amount now?", "redeemed": "Successfully redeemed! Your account has been credited with {n} GDD.", "redeemed-at": "The link was already redeemed on {date}.", "redeemed-title": "redeemed", diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 987bb71ef..b2a229f1c 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -180,7 +180,6 @@ "no-redeem": "No puedes canjear tu propio enlace!", "not-copied": "¡Desafortunadamente, su dispositivo no permite copiar! Copie el enlace manualmente!", "redeem": "Canjear", - "redeem-text": "¿Quieres canjear el importe ahora?", "redeemed": "¡Canjeado con éxito! Tu cuenta ha sido acreditada con {n} GDD.", "redeemed-at": "El enlace ya se canjeó el {date}.", "redeemed-title": "canjeado", diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 61037af1a..e7ac18a18 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -180,7 +180,6 @@ "no-redeem": "Vous n´êtes pas autorisé à percevoir votre propre lien!", "not-copied": "Malheureusement votre appareil ne permet pas de copier! Veuillez copier le lien manuellement svp!", "redeem": "Encaisser", - "redeem-text": "Voulez-vous percevoir le montant maintenant?", "redeemed": "Encaissé avec succès! Votre compte est crédité de {n} GDD.", "redeemed-at": "Le lien a déjà été perçu le {date}.", "redeemed-title": "encaisser", diff --git a/frontend/src/locales/nl.json b/frontend/src/locales/nl.json index 99b972514..34f484fd7 100644 --- a/frontend/src/locales/nl.json +++ b/frontend/src/locales/nl.json @@ -180,7 +180,6 @@ "no-redeem": "Je mag je eigen link niet inwisselen!", "not-copied": "Jouw apparaat laat het kopiëren helaas niet toe! Kopieer de link alsjeblieft met de hand!", "redeem": "Inwisselen", - "redeem-text": "Wil je het bedrag nu inwisselen?", "redeemed": "Succesvol ingewisseld! Op jouw rekening werden {n} GDD bijgeschreven.", "redeemed-at": "De link werd al op {date} ingewisseld.", "redeemed-title": "ingewisseld", diff --git a/frontend/src/pages/TransactionLink.spec.js b/frontend/src/pages/TransactionLink.spec.js index fd58d6e1c..831502acd 100644 --- a/frontend/src/pages/TransactionLink.spec.js +++ b/frontend/src/pages/TransactionLink.spec.js @@ -282,19 +282,12 @@ describe('TransactionLink', () => { }) describe('redeem link with success', () => { - // let spy beforeEach(async () => { - // spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm') apolloMutateMock.mockResolvedValue() - // spy.mockImplementation(() => Promise.resolve(true)) await wrapper.findComponent({ name: 'RedeemValid' }).find('button').trigger('click') }) - // it('opens the modal', () => { - // expect(spy).toBeCalledWith('gdd_per_link.redeem-text') - // }) - it('calls the API', () => { expect(apolloMutateMock).toBeCalledWith( expect.objectContaining({ @@ -316,37 +309,10 @@ describe('TransactionLink', () => { }) }) - // describe('cancel redeem link', () => { - // let spy - - // beforeEach(async () => { - // spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm') - // apolloMutateMock.mockResolvedValue() - // spy.mockImplementation(() => Promise.resolve(false)) - // await wrapper.findComponent({ name: 'RedeemValid' }).find('button').trigger('click') - // }) - - // it('does not call the API', () => { - // expect(apolloMutateMock).not.toBeCalled() - // }) - - // it('does not toasts a success message', () => { - // expect(mocks.$t).not.toBeCalledWith('gdd_per_link.redeemed', { n: '22' }) - // expect(toastSuccessSpy).not.toBeCalled() - // }) - - // it('does not push the route', () => { - // expect(routerPushMock).not.toBeCalled() - // }) - // }) - describe('redeem link with error', () => { - // let spy beforeEach(async () => { - // spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm') apolloMutateMock.mockRejectedValue({ message: 'Oh Noo!' }) - // spy.mockImplementation(() => Promise.resolve(true)) await wrapper.findComponent({ name: 'RedeemValid' }).find('button').trigger('click') }) From 222d8c2f579a936221c362a8f05921fc9c7fe359 Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 16 Sep 2022 08:25:55 +0200 Subject: [PATCH 087/304] fix lint --- frontend/src/pages/TransactionLink.spec.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/frontend/src/pages/TransactionLink.spec.js b/frontend/src/pages/TransactionLink.spec.js index 831502acd..d5a75aa4a 100644 --- a/frontend/src/pages/TransactionLink.spec.js +++ b/frontend/src/pages/TransactionLink.spec.js @@ -282,7 +282,6 @@ describe('TransactionLink', () => { }) describe('redeem link with success', () => { - beforeEach(async () => { apolloMutateMock.mockResolvedValue() await wrapper.findComponent({ name: 'RedeemValid' }).find('button').trigger('click') @@ -310,7 +309,6 @@ describe('TransactionLink', () => { }) describe('redeem link with error', () => { - beforeEach(async () => { apolloMutateMock.mockRejectedValue({ message: 'Oh Noo!' }) await wrapper.findComponent({ name: 'RedeemValid' }).find('button').trigger('click') From 641d2d4cc24f5276f3f1ccf3b8e6d2b79f67d625 Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 16 Sep 2022 09:58:41 +0200 Subject: [PATCH 088/304] creation date better represented --- .../components/CreationTransactionList.vue | 23 ++++++++++++------- admin/src/locales/de.json | 15 +++++++++--- admin/src/locales/en.json | 14 ++++++++--- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/admin/src/components/CreationTransactionList.vue b/admin/src/components/CreationTransactionList.vue index ec5c12aa4..ba0c7be6a 100644 --- a/admin/src/components/CreationTransactionList.vue +++ b/admin/src/components/CreationTransactionList.vue @@ -2,6 +2,13 @@
{{ $t('transactionlist.title') }}
+
+ Hilfe + +
{{ $t('transactionlist.submitted') }} {{ $t('math.equals') }} {{ $t('help.transactionlist.submitted') }}
+
{{ $t('transactionlist.confirmed') }} {{ $t('math.equals') }} {{ $t('help.transactionlist.confirmed') }}
+
+
diff --git a/admin/src/components/ContributionLinkForm.vue b/admin/src/components/ContributionLinkForm.vue index a159d33d3..6daf1e299 100644 --- a/admin/src/components/ContributionLinkForm.vue +++ b/admin/src/components/ContributionLinkForm.vue @@ -163,7 +163,6 @@ export default { if (this.form.validFrom === null) return this.toastError(this.$t('contributionLink.noStartDate')) if (this.form.validTo === null) return this.toastError(this.$t('contributionLink.noEndDate')) - // alert(JSON.stringify(this.form)) this.$apollo .mutate({ mutation: createContributionLink, @@ -182,6 +181,8 @@ export default { this.link = result.data.createContributionLink.link this.toastSuccess(this.link) this.onReset() + this.$root.$emit('bv::toggle::collapse', 'newContribution') + this.$emit('get-contribution-links') }) .catch((error) => { this.toastError(error.message) diff --git a/admin/src/components/ContributionLinkList.vue b/admin/src/components/ContributionLinkList.vue index 518d7d57e..18c136199 100644 --- a/admin/src/components/ContributionLinkList.vue +++ b/admin/src/components/ContributionLinkList.vue @@ -1,12 +1,12 @@

Htd! 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 literal 0 HcmV?d00001 From 9b0c2b01f521f5cfc96042b85c2db8923e91767f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 23 Aug 2022 17:38:59 +0200 Subject: [PATCH 043/304] draft for backend services --- .../BusinessRequirements/UC_Set_UserAlias.md | 68 ++++++++++++------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md b/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md index e6a95a19c..4dd39a50a 100644 --- a/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md +++ b/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md @@ -51,6 +51,8 @@ Die Erfassung des Alias erfolgt als zusätzliche Eingabe direkt bei der Registri ### Registrierung +#### Ausbaustufe-1 + In der Eingabemaske der Registrierung wird nun zusätzlich das Feld *Alias* angezeigt, das der User als Pflichtfeld ausfüllen muss. ![img](./image/RegisterWithAlias.png) @@ -65,14 +67,16 @@ Wurde vom User nun eine konfliktfreie *Alias*-Eingabe und alle Angaben der Regis ### Login +#### Ausbaustufe-1 + Meldet sich ein schon registrierter User erfolgreich an - das passiert wie bisher noch mit seiner Email-Adresse - dann wird geprüft, ob für diesen User schon ein Alias gespeichert ist. Wenn nicht dann erfolgt direkt nach der Anzeige des Login-Dialoges die Anzeige der User-Profilseite. ![img](./image/LoginProfileWithAlias.png) Auf der erweiterten User-Profil-Seite sind folgende Elemente neu hinzugekommen bzw. erweitert: -* **[AS-1]** Alias: neu hinzugekommen ist die Gruppe Alias mit dem Label, dem Eingabefeld und dem Link "Alias ändern" mit Stift-Icon -* **[AS-2]** E-Mail: ergänzt wurde die Gruppe E-Mail, in dem das Label "E-Mail", das Eingabefeld, das Label "bestätigt" mit zugehörigem Icon darunter und dem Link "E-Mail ändern" mit Stift-Icon. in der Ausbaustufe-1 ist der Link "E-Mail ändern" und das Stift-Icon disabled, so dass das Eingabefeld der E-Mail lediglich zur Anzeige der aktuell gesetzten E-Mail dient. Da mit der Änderungsmöglichkeit der E-Mail gleichzeitig auch der Login-Prozess und die Passwort-Verschlüsselung angepasst werden muss, wird dieses Feature auf eine spätere Ausbaustufe verschoben. +* Alias: neu hinzugekommen ist die Gruppe Alias mit dem Label, dem Eingabefeld und dem Link "Alias ändern" mit Stift-Icon +* E-Mail: ergänzt wurde die Gruppe E-Mail, in dem das Label "E-Mail", das Eingabefeld, das Label "bestätigt" mit zugehörigem Icon darunter und dem Link "E-Mail ändern" mit Stift-Icon. In der **Ausbaustufe-1** ist der Link "E-Mail ändern" und das Stift-Icon **immer disabled**, so dass das Eingabefeld der E-Mail lediglich zur Anzeige der aktuell gesetzten E-Mail dient. Da mit der Änderungsmöglichkeit der E-Mail gleichzeitig auch der Login-Prozess und die Passwort-Verschlüsselung angepasst werden muss, wird dieses Feature auf eine spätere Ausbaustufe verschoben. Der Sprung nach der Login-Seite nach erfolgreichem Login auf die Profil-Seite öffnet diese schon direkt im Bearbeitungs-Modus des Alias, so dass der User direkt seine Eingabe des Alias vornehmen kann. @@ -81,47 +85,65 @@ Der Sprung nach der Login-Seite nach erfolgreichem Login auf die Profil-Seite ö Im Eingabe-Modus des Alias hat das Eingabefeld den Fokus und darin wird: * wenn noch kein Alias für den User in der Datenbank vorhanden ist, vom System ein Vorschlag unterbreitet. Der Vorschlag basiert auf dem Vornamen des Users und wird durch folgende Logik ermittelt: - * es wird mit dem Vorname des Users eine Datenbankabfrage durchgeführt, die zählt, wieviele User-Aliase es schon mit diesem Vornamen gibt und direkt mit einer nachfolgenden Nummer als Postfix versehen sind. + * es wird mit dem Vorname des Users eine Datenbankabfrage durchgeführt, die zählt, wieviele User-Aliase es schon mit diesem Vornamen gibt und falls notwendig direkt mit einer nachfolgenden Nummer als Postfix versehen sind. * Aufgrund der Konvention, dass ein Alias mindestens 5 Zeichen lang sein muss, sind ggf. führende Nullen mitzuberücksichten. - * Beispiel: Max als Vorname - * in der Datenbank gibt es schon mehrer User mit den Aliasen: Maximilian, Max01, Max_M, Max-M, MaxMu und Max02. - * Dann schlägt das System den Alias Max03 vor, da Max nur 3 Zeichen lang ist und es schon zwei Aliase Max gefolgt mit einer Nummer gibt - * Die Aliase Maximilian, Max_M und MaxMu werden nicht mitgezählt, das diese nach Max keine direkt folgende Ziffern haben -* wenn schon ein Alias für den User in der Datenbank vorhanden ist, dann wird dieser ohne Systemvorschlag angezeigt. + * **Beispiel-1**: *Max* als Vorname + * in der Datenbank gibt es schon mehrer User mit den Aliasen: *Maximilian*, *Max01*, *Max_M*, *Max-M*, *MaxMu* und *Max02*. + * Dann schlägt das System den Alias *Max03* vor, da *Max* nur 3 Zeichen lang ist und es schon zwei Aliase *Max* gefolgt mit einer Nummer gibt (*Max01* und *Max02*) + * Die Aliase *Maximilian*, *Max_M*, *Max-M* und *MaxMu* werden nicht mitgezählt, das diese nach *Max* keine direkt folgende Ziffern haben + * **Beispiel-2**: *August* als Vorname + * in der Datenbank gibt es schon mehrer User mit den Aliasen: *Augusta*, *Augustus*, *Augustinus* + * Dann schlägt das System den Alias *August* vor, da *August* schon 6 Zeichen lang ist und es noch keinen anderen User mit Alias *August* gibt + * die Aliase *Augusta*, *Augustus* und *Augustinus* werden nicht mit gezählt, da diese länger als 5 Zeichen sind und sich von *August* unterscheiden + * **Beispiel-3**: *Nick* als Vorname + * in der Datenbank gibt es schon mehrer User mit den Aliasen: *Nicko*, *Nickodemus* + * Dann schlägt das System den Alias *Nick1* vor, da *Nick* kürzer als 5 Zeichen ist und es noch keinen anderen User mit dem Alias *Nick1* gibt + * die Aliase *Nicko* und *Nickodemus* werden nicht mit gezählt, da diese länger als 5 Zeichen sind und sich von *Nick* unterscheiden +* wenn schon ein Alias für den User in der Datenbank vorhanden ist, dann wird dieser unverändert aus der Datenbank und ohne Systemvorschlag einfach angezeigt. Der User kann nun den im Eingabefeld angezeigten Alias verändern, wobei die Alias-Konventionen, wie oben beschrieben einzuhalten und zu validieren sind. Mit dem Button "Eindeutigkeit prüfen" kann der im Eingabefeld stehende Alias auf Eindeutigkeit verifziert werden. Dabei wird dieser als Parameter einem Datenbank-Statement übergeben, das auf das Feld *Alias* in der *Users*-Tabelle ein Count mit dem übergebenen Parameter durchführt. Kommt als Ergebnis =0 zurück, ist der eingegebene Alias noch nicht vorhanden und kann genutzt werden. Liefert das Count-Statement einen Wert >0, dann ist dieser Alias schon von einem anderen User in Gebrauch und darf nicht gespeichert werden. Der User muss also seinen Alias erneut ändern. -Mit dem "Speichern"-Button wird die Eindeutigkeitsprüfung erneut implizit durchgeführt, um sicherzustellen, dass keine Alias-Konflikte in der Datenbank gespeichert werden. Sollte widererwarten doch ein Konflikt bei der Eindeutigkeitsprüfung auftauchen, so bleibt der Dialog im Eingabe-Modus des Alias geöffnet und zeigt dem User eine aussagekräftige Fehlermeldung an. +Mit dem "Speichern"-Button wird die Eindeutigkeitsprüfung erneut implizit durchgeführt, um sicherzustellen, dass keine Alias-Konflikte in der Datenbank gespeichert werden. Sollte wider erwarten doch ein Konflikt bei der Eindeutigkeitsprüfung auftauchen, so bleibt der Dialog im Eingabe-Modus des Alias geöffnet und zeigt dem User eine aussagekräftige Fehlermeldung an. Über das rote Icon (x) hinter dem Label "Alias ändern" kann die Eingabe bzw. das Ändern des Alias abgebrochen werden. -**[AS-1]** Die erweiterte Gruppe E-Mail bleibt immer im Anzeige-Modus und kann selbst über den Link "E-Mail ändern" und das Stift-Icon, die beide disabled sind, nicht in den Bearbeitungsmodus versetzt werden. Die aktuell gesetzte E-Mail des Users wird im disabled Eingabefeld nur angezeigt. Das Icon unter dem Label "bestätigt" zeigt den Status der E-Mail, ob diese schon vom User bestätigt wurde oder nicht. Der Schalter für das Label "Informationen per E-Mail" bleibt von dem Switch zwischen Anzeige-Modus und Bearbeitungs-Modus unberührt, dh. es kann zu jeder Zeit vom User defniert werden, ob er über die gesetzte E-Mail Informationen erhält oder nicht. +Die erweiterte Gruppe E-Mail bleibt immer im Anzeige-Modus und kann selbst über den Link "E-Mail ändern" und das Stift-Icon, die beide disabled sind, nicht in den Bearbeitungsmodus versetzt werden. Die aktuell gesetzte E-Mail des Users wird im disabled Eingabefeld nur angezeigt. Das Icon unter dem Label "bestätigt" zeigt den Status der E-Mail, ob diese schon vom User bestätigt wurde oder nicht. Der Schalter für das Label "Informationen per E-Mail" bleibt von dem Switch zwischen Anzeige-Modus und Bearbeitungs-Modus unberührt, dh. es kann zu jeder Zeit vom User definiert werden, ob er über die gesetzte E-Mail Informationen erhält oder nicht. -**[AS-2]** In der weiteren Ausbaustufe, die erst möglich ist, sobald der Login-Prozess und die Passwort-Verschlüsselung darauf umgestellt ist, wird der Link "E-Mail ändern" und das Sift-Icon enabled. Damit kann der User dann das E-Mail Eingabefeld in den Bearbeitungs-Modus versetzen. +Es gibt in dieser Ausbaustufe-1 noch keine Möglichkeit seine E-Mail-Adresse zu ändern, da vorher die Passwort-Verschlüsselung mit allen Auswirkungen auf den Registrierungs- und Login-Prozess umgebaut werden müssen. + +#### Ausbaustufe-x + +In der weiteren Ausbaustufe, die erst möglich ist, sobald der Login-Prozess und die Passwort-Verschlüsselung darauf umgestellt ist, wird der Link "E-Mail ändern" und das Sift-Icon enabled. Damit kann der User dann das E-Mail Eingabefeld in den Bearbeitungs-Modus versetzen. ![img](./image/LoginProfileEditEmail.png) -**[AS-2]** Im Eingabe-Modus des E-Mail-Feldes kann der User seine E-Mail-Adresse ändern. Über den Button "Speichern & Bestätigen" wird die veränderte E-Mail gegenüber den bisher gespeicherten E-Mails aller User verifiziert, dass es keine Dupletten gibt. +Im Eingabe-Modus des E-Mail-Feldes kann der User seine E-Mail-Adresse ändern. Sobald der User die vorhandene und schon bestätigte Email-Adresse ändert, wechselt die Anzeige des Icons unter dem Label "bestätigt" vom Icon (Hacken) zum Icon (X), um die Änderung dem User gleich sichtbar zu machen. Über den Button "Speichern & Bestätigen" wird die veränderte E-Mail gegenüber den bisher gespeicherten E-Mails aller User verifiziert, dass es keine Dupletten gibt. -Ist diese Prüfung erfolgreich, dann wird die geänderte E-Mail-Adresse in der Datenbank gespeichert, das Flag E-Mail-Checked auf FALSE gesetzt, damit das Bestätigt-Icon von "bestätigt" auf "unbestätigt" dem User angezeigt wird und zurück in den Anzeige-Modus der Gruppe E-Mail gewechselt. Mit der Speicherung der geänderten E-Mail wird eine Comfirmation-Email an diese E-Mail-Adresse zur Bestätigung durch den User gesendet. +Ist diese Eindeutigkeits-Prüfung erfolgreich, dann wird die geänderte E-Mail-Adresse in der Datenbank gespeichert, das Flag E-Mail-Checked auf FALSE gesetzt, damit das Bestätigt-Icon von "bestätigt" auf "unbestätigt" dem User angezeigt wird und zurück in den Anzeige-Modus der Gruppe E-Mail gewechselt. Mit der Speicherung der geänderten E-Mail wird eine Comfirmation-Email an diese E-Mail-Adresse zur Bestätigung durch den User gesendet. -Ist diese Prüfung fehlgeschlagen, sprich es gibt die zuspeichernde E-Mail schon in der Datenbank, dann wird das Speichern der geänderten E-Mail abgebrochen und es bleibt die zuvor gespeicherte E-Mail gültig. Ob und welche Meldung dem User in dieser Situation angezeigt wird, ist noch zu definieren, um kein Ausspionieren von anderen E-Mail-Adressen zu unterstützen. Ebenfalls noch offen ist, ob an die gefundene E-Mail-Duplette eine Info-Email geschickt wird, um den User, der diese bestätigte E-Mail-Adresse besitzt, zu informieren, dass es einen Versuch gab seine E-Mail zu verwenden. +Ist diese Prüfung fehlgeschlagen, sprich es gibt die zuspeichernde E-Mail schon in der Datenbank, dann wird das Speichern der geänderten E-Mail abgebrochen und es bleibt die zuvor gespeicherte E-Mail gültig und auch das E-Mail-Checked Flag bleibt auf dem vorherigen Status. Ob und welche Meldung dem User in dieser Situation angezeigt wird, ist noch zu definieren, um kein Ausspionieren von anderen E-Mail-Adressen zu unterstützen. Ebenfalls noch offen ist, ob an die gefundene E-Mail-Duplette eine Info-Email geschickt wird, um den User, der diese bestätigte E-Mail-Adresse besitzt, zu informieren, dass es einen Versuch gab seine E-Mail zu verwenden. -## Login mit Alias [AS-3] +## Backend-Services -In der Ausbaustufe 3 wird der Login-Prozess so umgebaut, dass der User statt nur seiner E-Mail-Adresse zukünftig seinen Alias oder seine GradidoID oder seine E-Mail-Adresse verwenden kann. +### UserResolver.createUser -![img](./image/LoginWithAlias.png) +Der Service *createUser* wird um den Pflicht-Parameter *alias: String* erweitert. Der Wert wurde, wie oben beschrieben, im Dialog Register erfasst und gemäß den Konventionen für das Feld *alias* auch validiert - Länge und erlaubte Zeichen. -Hat der User seine Eingaben im Login-Dialog getätigt und klick auf den "Anmeldung"-Button erfolgt eine Verifzierung welchen Wert er verwendet hat: +Es wird vor jeder anderen Aktion die Eindeutigkeitsprüfung des übergebenen alias-Wertes geprüft. Dazu wird der neue Service verifyUniqueAlias() im UserResolver aufgerufen, der auch direkt vom Frontend aufgerufen werden kann. -* enthält der erste Parameter ein @-Zeichen wird von einer E-Mail-Adresse ausgegangen -* ist der erste Parameter eine valide UUID der Version 4, dann wird von der GradidoID ausgegangen -* ansonsten wird unterstellt, dass der erste Parameter als Alias zu interpretieren ist +Liefert diese Prüfung den Wert FALSE, dann wird das Anlegen und Speichern des neuen Users abgebrochen und mit entsprechend aussagekräftiger Fehlermeldung, dass der Alias nicht eindeutig ist, an das Frontend zurückgegeben. -Je nach Typ des ersten Parameters wird in der Users-Tabelle nach dem User mit der E-Mail, der GradidoID oder dem Alias gesucht. Wird dieser User gefunden, dann erfolgt die Prüfung gegenüber dem zweiten Parameter als Passwort. +Ist die Eindeutigkeitsprüfung hingegen erfolgreich, dann wird die existierende Logik zur Anlage eines neuen Users weiter ausgeführt. Dabei ist der neue Parameter alias in den neu angelegten User zu übertragen und in der Datenbank zu speichern. -Die interne Passwort-Verschlüsselung muss vorher neu überarbeitet werden. +Alle weiteren Ausgabe-Kanäle wie Logging, EventProtokoll und Emails sind ggf. um das neue Attribut alias zu ergänzen. + +### UserResolver.verifyUniqueAlias + +Dieser neue Service bekommt als Parameter das Attribut alias: String übergeben und liefert im Ergebnis TRUE, wenn der übergebene alias noch nicht in der Datenbank von einem anderen User verwendet wird, andernfalls FALSE. + +Dabei wird ein einfaches Datenbank-Statement auf die Users Tabelle abgesetzt mit einem + + SELECT count(*) FROM users where users.alias = {alias} From d5fa9fcdc4a923249743e7c888595904b2b51a65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Wed, 24 Aug 2022 02:51:29 +0200 Subject: [PATCH 044/304] description of backend service changes --- .../BusinessRequirements/UC_Set_UserAlias.md | 56 ++++++++++++++++--- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md b/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md index 4dd39a50a..7fdea43ea 100644 --- a/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md +++ b/docu/Concepts/BusinessRequirements/UC_Set_UserAlias.md @@ -49,6 +49,8 @@ Die Email wird weiterhin für einen Kommunikationskanal ausserhalb der Gradido-A Die Erfassung des Alias erfolgt als zusätzliche Eingabe direkt bei der Registrierung eines neuen Users oder als weiterer Schritt direkt nach dem Login. +Dieser UseCase ist in die Ausbaustufe-1 und Ausbaustufe-x unterteilt. Alle beschriebenen Anforderungen der Ausbaustufe-1 können sofort mit Zuordnung der zugehörigen Tickets umgesetzt werden. Die beschriebenen Anforderungen der Ausbaustufe-x müssen solange verschoben werden, bis der UseCase "changeLoginProzess" konzeptioniert und umgesetzt ist. Erst dann kann auf der Profil-Seite die Email zur Bearbeitung durch den User freigegeben werden. Diese Abhängigkeit muss über die entsprechenden Abhängigkeiten der Tickets abgebildet werden. + ### Registrierung #### Ausbaustufe-1 @@ -69,7 +71,7 @@ Wurde vom User nun eine konfliktfreie *Alias*-Eingabe und alle Angaben der Regis #### Ausbaustufe-1 -Meldet sich ein schon registrierter User erfolgreich an - das passiert wie bisher noch mit seiner Email-Adresse - dann wird geprüft, ob für diesen User schon ein Alias gespeichert ist. Wenn nicht dann erfolgt direkt nach der Anzeige des Login-Dialoges die Anzeige der User-Profilseite. +Meldet sich ein schon registrierter User erfolgreich an - das passiert wie bisher noch mit seiner Email-Adresse - dann wird geprüft, ob für diesen User schon ein Alias gespeichert, sprich im aktuellen Context nach dem Login im User-Objekt das Attribut *alias* initialisiert ist. Wenn nicht dann erfolgt direkt nach dem Schließen des Login-Dialoges die Anzeige der User-Profilseite. ![img](./image/LoginProfileWithAlias.png) @@ -101,7 +103,7 @@ Im Eingabe-Modus des Alias hat das Eingabefeld den Fokus und darin wird: * die Aliase *Nicko* und *Nickodemus* werden nicht mit gezählt, da diese länger als 5 Zeichen sind und sich von *Nick* unterscheiden * wenn schon ein Alias für den User in der Datenbank vorhanden ist, dann wird dieser unverändert aus der Datenbank und ohne Systemvorschlag einfach angezeigt. -Der User kann nun den im Eingabefeld angezeigten Alias verändern, wobei die Alias-Konventionen, wie oben beschrieben einzuhalten und zu validieren sind. +Der User kann nun den im Eingabefeld angezeigten Alias verändern, wobei die Alias-Konventionen, wie oben im ersten Kapitel beschrieben einzuhalten und zu validieren sind. Mit dem Button "Eindeutigkeit prüfen" kann der im Eingabefeld stehende Alias auf Eindeutigkeit verifziert werden. Dabei wird dieser als Parameter einem Datenbank-Statement übergeben, das auf das Feld *Alias* in der *Users*-Tabelle ein Count mit dem übergebenen Parameter durchführt. Kommt als Ergebnis =0 zurück, ist der eingegebene Alias noch nicht vorhanden und kann genutzt werden. Liefert das Count-Statement einen Wert >0, dann ist dieser Alias schon von einem anderen User in Gebrauch und darf nicht gespeichert werden. Der User muss also seinen Alias erneut ändern. @@ -128,7 +130,9 @@ Ist diese Prüfung fehlgeschlagen, sprich es gibt die zuspeichernde E-Mail schon ## Backend-Services -### UserResolver.createUser +### UserResolver.createUser - erweitern + +#### Ausbaustufe-1 Der Service *createUser* wird um den Pflicht-Parameter *alias: String* erweitert. Der Wert wurde, wie oben beschrieben, im Dialog Register erfasst und gemäß den Konventionen für das Feld *alias* auch validiert - Länge und erlaubte Zeichen. @@ -140,10 +144,48 @@ Ist die Eindeutigkeitsprüfung hingegen erfolgreich, dann wird die existierende Alle weiteren Ausgabe-Kanäle wie Logging, EventProtokoll und Emails sind ggf. um das neue Attribut alias zu ergänzen. -### UserResolver.verifyUniqueAlias +### UserResolver.verifyUniqueAlias - neu -Dieser neue Service bekommt als Parameter das Attribut alias: String übergeben und liefert im Ergebnis TRUE, wenn der übergebene alias noch nicht in der Datenbank von einem anderen User verwendet wird, andernfalls FALSE. +#### Ausbaustufe-1 -Dabei wird ein einfaches Datenbank-Statement auf die Users Tabelle abgesetzt mit einem +Dieser neue Service bekommt als Parameter das Attribut *alias: String* übergeben und liefert im Ergebnis TRUE, wenn der übergebene *alias* noch nicht in der Datenbank von einem anderen User verwendet wird, andernfalls FALSE. - SELECT count(*) FROM users where users.alias = {alias} +Dabei wird ein einfaches Datenbank-Statement auf die *Users* Tabelle abgesetzt mit einem casesensitiven Vergleich auf den Parameter mit den Werten aus der Spalte *alias* + + `SELECT count(*) FROM users where BINARY users.alias = {alias}` + + +### UserResolver.updateUserInfos - erweitern + +#### Ausbaustufe-1 + +Der schon existierende Service *updateUserInfos()* wird erweitert um den Parameter *alias: String*. Sobald der User nach dem Login automatisch oder selbst interaktiv auf die Profil-Seite navigiert und dort sein Profil, insbesonderen neu das Attribut *alias* erfasst oder ändert, wird dieser Service aufgerufen. + +Die Parameter *firstName, lastName, language, password, passwordNew, alias* werden alle als optional definiert, da der User auf der Profil-Seite auswählen kann, welche Profil-Parameter er verändern möchte und somit meist nie alle Parameter gleichzeitig dieses Service initialisiert sind. + +Sobald der *alias*-Parameter gesetzt ist, wird für diesen der Service *verifyUniqueAlias()* zur Eindeutigekeitsprüfung aufgerufen, um sicherzustellen, dass der übergebene *alias* wirklich nicht schon in der Datenbank existiert. Liefert das Ergebnis von *verifyUniqueAlias()* den Wert TRUE, dann kann der übergebene *alias* in der Datenbank gespeichert werden. Anderfalls muss mit einer aussagekräftigen Fehlermeldung abgebrochen werden und es wird keiner der übergebenen Parameter in die Datenbank geschrieben. + +#### Ausbaustufe-x + +Sobald in einer weiteren Ausbaustufe die Email auf der Profil-Seite vom User verändert werden kann, dann wird dieser Service um den optionalen Parameter *email: String* erweitert. + +Sobald der *email*-Parameter gesetzt ist, wird für diesen der Service *verifyUniqueEmail()* zur Eindeutigekeitsprüfung aufgerufen, um sicherzustellen, dass die übergebene *email* wirklich nicht schon für einen anderen User in der Datenbank existiert. Liefert das Ergebnis von *verifyUniqueEmail()* den Wert TRUE, dann kann die übergebene *email* in der Datenbank gespeichert werden. Anderfalls muss mit einer aussagekräftigen Fehlermeldung abgebrochen werden und es wird keiner der übergebenen Parameter in die Datenbank geschrieben. + +Mit dem Speichern der geänderten Email muss auch das Flag *emailChecked* auf FALSE gesetzt und gespeichert werden. Damit wird sichergestellt, dass die veränderte Email-Adresse erst noch vom User bestätigt werden muss. Dies wird direkt nach dem Speichern der Email-Adresse mit dem Versenden einer *confirmChangedEmail* an die neue Email-Adresse initiiert. Der darin enthaltene Bestätigungs-Link wird analog dem Aktivierungs-Link bei der Registrierung der Email gehandhabt. Die *confirmChangedEmail* muss nur inhaltlich vom Text anders formuliert werden als die *AccountActivation*-Email, aber bzgl. der Parameter und des enthaltenen Bestätigungslinks unterscheiden sich beide nicht. + +Sobald der User in seiner erhaltenen *confirmChangedEmail* den Link aktiviert, erfolgt der Aufruf des Service *UserResolver.queryOptIn*, um zu prüfen, ob der in dem Link enthaltene OptInCode valide und gültig ist. Falls ja, dann wird das Flag emailChecked auf TRUE gesetzt, anderfalls bleibt es auf FALSE und es wird mit einer aussagekräftigen Fehlermeldung abgebrochen. + +### UserResolver.verifyUniqueEmail - neu + +#### Ausbaustufe-x + +Dieser neue Service bekommt als Parameter das Attribut *email: String* übergeben und liefert im Ergebnis TRUE, wenn die übergebene *email* noch nicht in der Datenbank von einem anderen User verwendet wird, andernfalls FALSE. + +Dabei wird ein einfaches Datenbank-Statement auf die *Users* Tabelle abgesetzt mit einem casesensitiven Vergleich auf den Parameter mit den Werten aus der Spalte *email* + + `SELECT count(*) FROM users where BINARY users.email = {email}` + + +## Datenbank-Migration + +Es ist für diesen UseCase keine Datenbank-Migration notwendig, da im Rahmen der Einführung der GradidoID die Spalte *alias* schon in die *Users*-Tabelle mit aufgenommen wurde. From 3c91c597efe852c72cdc391b1154f2436c88dce6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Wed, 24 Aug 2022 13:57:59 +0200 Subject: [PATCH 045/304] separate mocks in usecase specific balsamic-file --- .../graphics/UC_Set_UserAlias.bmpr | Bin 0 -> 838656 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docu/Concepts/BusinessRequirements/graphics/UC_Set_UserAlias.bmpr diff --git a/docu/Concepts/BusinessRequirements/graphics/UC_Set_UserAlias.bmpr b/docu/Concepts/BusinessRequirements/graphics/UC_Set_UserAlias.bmpr new file mode 100644 index 0000000000000000000000000000000000000000..f06dc22c82be9d44f8f5a07247621b30ba44acea GIT binary patch literal 838656 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