diff --git a/Appium_CrossPlatform/Login/dummy.txt b/Appium_CrossPlatform/Login/dummy.txt
deleted file mode 100644
index d57d09f..0000000
--- a/Appium_CrossPlatform/Login/dummy.txt
+++ /dev/null
@@ -1 +0,0 @@
-as
\ No newline at end of file
diff --git a/Appium_CrossPlatform/SignUp/dummy.txt b/Appium_CrossPlatform/SignUp/dummy.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/Cypress_FE_BE/Login/dummy.txt b/Cypress_FE_BE/Login/dummy.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/Cypress_FE_BE/SignUp/dummy.txt b/Cypress_FE_BE/SignUp/dummy.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..c1081c5
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,13 @@
+FROM cypress/base:latest
+
+WORKDIR /home/node/app
+
+COPY cypress.config.js package.json package-lock.json ./
+
+COPY cypress ./cypress
+
+ENV CI=1
+
+RUN npm i
+
+RUN npx cypress verify
\ No newline at end of file
diff --git a/JMeter_StressTesting/dummy.txt b/JMeter_StressTesting/dummy.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/Jenkinsfile b/Jenkinsfile
new file mode 100644
index 0000000..dfd6729
--- /dev/null
+++ b/Jenkinsfile
@@ -0,0 +1,42 @@
+pipeline {
+ agent any
+ triggers {
+ githubPush()
+ }
+
+ environment {
+ DOCKERHUB_CREDENTIALS=credentials('Dockerhub')
+ }
+
+ stages{
+
+ stage('Login') {
+
+ steps {
+ sh 'echo $DOCKERHUB_CREDENTIALS_PSW | docker login -u $DOCKERHUB_CREDENTIALS_USR --password-stdin'
+ }
+ }
+
+ stage('Build') {
+
+ steps {
+ echo "hello"
+ sh 'docker build -t waer/web_testing:latest .'
+ }
+ }
+
+ stage('Push') {
+ steps {
+ sh 'docker push waer/web_testing:latest'
+ }
+ }
+
+}
+
+ post {
+ always {
+ sh 'docker logout'
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index 870ae5c..324fd84 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,2 @@
-# SW-Testing
-repositry hold all testing file for Reddit-El8alaba Project
+# Deployment-Testing
+This branch for deployment only.
diff --git a/Screenshot from 2022-11-09 04-38-48.png b/Screenshot from 2022-11-09 04-38-48.png
new file mode 100644
index 0000000..01fa69d
Binary files /dev/null and b/Screenshot from 2022-11-09 04-38-48.png differ
diff --git a/Screenshot from 2022-11-09 04-38-58.png b/Screenshot from 2022-11-09 04-38-58.png
new file mode 100644
index 0000000..27e4179
Binary files /dev/null and b/Screenshot from 2022-11-09 04-38-58.png differ
diff --git a/cypress.config.js b/cypress.config.js
new file mode 100644
index 0000000..91fa394
--- /dev/null
+++ b/cypress.config.js
@@ -0,0 +1,18 @@
+const { defineConfig } = require("cypress");
+
+module.exports = defineConfig({
+ screenshotOnRunFailure: false,
+ video: false,
+ watchForFileChanges:false,
+ numTestsKeptInMemory:2,
+ projectId: 'hp3ona',
+ "env":{
+ // CYPRESSBASEURL:"http://frontend_test"
+ CYPRESSBASEURL:"http://www.read-it.live"
+ },
+ e2e: {
+ setupNodeEvents(on, config) {
+ // implement node event listeners here
+ },
+ },
+});
\ No newline at end of file
diff --git a/cypress/CodeStyle/ForgetUserNameActions.cy.js b/cypress/CodeStyle/ForgetUserNameActions.cy.js
new file mode 100644
index 0000000..a6c1ef6
--- /dev/null
+++ b/cypress/CodeStyle/ForgetUserNameActions.cy.js
@@ -0,0 +1,453 @@
+///
+import ForgetUserNameObjects from "./cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetUserNameObjects.cy"
+
+describe('Reset UserName Page Tests', function () {
+
+ //Test Case 1
+ //NOTE: CHECK THE EFFECT OF IT
+ it('Forget UserName', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('karimmahmoud2210@gmail.com')
+ forgetUserName.ClickOnEmailButton()
+
+ })
+
+ //Test Case 2
+ it('Forget UserName - then click login - go back to show the email is still written ', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('karimmahmoud2210@gmail.com')
+ forgetUserName.CLickOnLoginButton()
+ forgetUserName.UrlEqualChecker('http://localhost/login')
+ forgetUserName.GoBack()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.ContainsChecker('karimmahmoud2210@gmail.com')
+
+ })
+
+
+ //Test Case 3
+ it('Forget UserName - then click sign up - go back to show the email is still written', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('karimmahmoud2210@gmail.com')
+ forgetUserName.ClickOnSignUpButton()
+ forgetUserName.UrlEqualChecker('http://localhost:8085/signup')
+ forgetUserName.GoBack()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.ContainsChecker('karimmahmoud2210@gmail.com')
+
+ })
+
+ //Test Case 4
+ //TODO : REVIEW IT
+ it('Forget username then click on help', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('karimmahmoud2210@gmail.com')
+ forgetUserName.UrlNotEqualChecker('http://localhost/forgetUsernamepage')
+ })
+
+ //Test Case 5
+ //email is : 1231565456@gmail.com which is invalid one
+ it('Write Invalid Email - should appear error message', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('1231565456@gmail.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 6
+ //email is : 1231565456a@gmail.com which is Valid one
+ it('Write Valid Email - should not appear error message', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('1231565456a@gmail.com')
+ forgetUserName.NotInValidMessage()
+
+ })
+
+ //Test Case 7
+ //email is : as1231565456a which is InValid one
+ it('Write Invalid Email - should appear error message', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('as1231565456a')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //----------------------------------------Valid Test Cases----------------------------------------//
+
+ //Test Case 8
+ it('The email contains a dot with a subdomain', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@subdomain.domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 9
+ it('Plus sign is considered a valid character', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('firstname+lastname@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 10
+ it('The domain is a valid IP address', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@123.123.123.123')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 11
+ it('A square bracket around IP address is considered valid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@[123.123.123.123]')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 12
+ it('Quotes around email are considered valid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('“email”@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 13
+ it('Digits with at least one char in the address are valid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('1234567890a@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 14
+ it('Dash in the domain name is valid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@domain-one.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 15
+ it('Underscore in the address field is valid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('_______@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 16
+ it('.name is a valid Top Level Domain name', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@domain.name')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 17
+ it('Dot in Top Level Domain name also considered valid (use co.jp as an example here)', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@domain.co.jp')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 18
+ it('Dash in the address field is valid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('firstname-lastname@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //----------------------------------------InValid Test Cases----------------------------------------//
+
+ //Test Case 19
+ it('Garbage', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('#@%^%#$@#$@#.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 20
+ it('Missing username', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 21
+ it('Encoded HTML within an email is invalid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('Joe Smith ')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 22
+ it('Missing @', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email.domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 23
+ it('Two @ sign', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@domain@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 24
+ it('Leading dot in address is not allowed', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('.email@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 25
+ it('Trailing dot in address is not allowed', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email.@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 26
+ it('Multiple dots', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email..email@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 27
+ it('Unicode char as address', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('あいうえお@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 28
+ it('Text followed email is not allowed', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@domain.com (Joe Smith)')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 29
+ it('Missing top-level domain (.com/.net/.org/etc)', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@domain')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 30
+ it('The leading dash in front of the domain is invalid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@-domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 31
+ it('.web is not a valid top-level domain', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@domain.web')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 32
+ it('Invalid IP format', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@111.222.333.44444')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 33
+ it('Multiple dots in the domain portion is invalid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@domain..com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+
+})
\ No newline at end of file
diff --git a/cypress/CodeStyle/ForgetUserNameObjects.cy.js b/cypress/CodeStyle/ForgetUserNameObjects.cy.js
new file mode 100644
index 0000000..30d33e3
--- /dev/null
+++ b/cypress/CodeStyle/ForgetUserNameObjects.cy.js
@@ -0,0 +1,104 @@
+
+class ForgetUserNameObjects {
+ navigate() {
+ cy.visit('http://localhost/login')
+ }
+
+ //----------------------------------------Test #1----------------------------------------//
+
+ ForgetUserNameHyperLink(){
+ //click on the hyperlink of username
+ cy.get('#app > div > div > div.sec-largest-div > form > div.forgot-usr-pass > a:nth-child(2)')
+ .should('be.visible')
+ .click()
+ return this
+ }
+
+ /*
+ ReCAPTCHA(){
+ cy.get('iframe')
+ .first()
+ .then((recaptchaIframe) => {
+ const body = recaptchaIframe.contents()
+ cy.get('[id=recaptcha-anchor]')
+ .click()
+ })
+
+ }
+ */
+
+ UrlEqualChecker(url){
+ cy.url()
+ .should('eq', url)
+ }
+
+ UrlNotEqualChecker(url){
+ cy.url()
+ .should('not.eq' , url )
+
+ }
+
+
+ EnterEmail(username) {
+ cy.get('[id=emailAddress]')
+ .should('be.visible')
+ .clear()
+ .type(username)
+ return this
+ }
+
+ ClickOnEmailButton(){
+ cy.get('[id=emailme]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #2----------------------------------------//
+ CLickOnLoginButton(){
+ cy.get('[id=login]')
+ .should('be.visible')
+ .click()
+ }
+
+ GoBack(){
+ cy.go('back')
+ }
+
+ ContainsChecker(checkingContent){
+ cy.get('[id=emailAddress]')
+ .should('be.visible')
+ .contains()
+ }
+
+ //----------------------------------------Test #3----------------------------------------//
+ ClickOnSignUpButton(){
+ cy.get('[id=signup]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #4----------------------------------------//
+ ClickOnHelpButton(){
+ cy.get('[id=help]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #5----------------------------------------//
+ InvalidMessage(){
+ cy.get('[class=invalid]')
+ .should('be.visible')
+ .contains('Please enter an email address to continue')
+ }
+
+ //----------------------------------------Test #6----------------------------------------//
+ NotInValidMessage(){
+ cy.get('[class=invalid]')
+ .should('be.visible')
+ .should('not.eq' , 'Please enter an email address to continue')
+ }
+
+
+
+}
+export default ForgetUserNameObjects
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/CreateCommunity/CreateCommunity.cy.js b/cypress/e2e/SWE_PROJECT/CreateCommunity/CreateCommunity.cy.js
new file mode 100644
index 0000000..951b4dd
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/CreateCommunity/CreateCommunity.cy.js
@@ -0,0 +1,207 @@
+////////////////////later: Community category, Community type,Adult content
+
+
+import CreateCommObjects from '../PageObjects/CreateCommunityObjects/CreateCommObjects'
+describe('Test Create Community form', () => {
+
+ //test visiting the sign_up page
+ beforeEach(() => {
+ // Since we want to visit the same URL at the start of all our tests,
+ // we include it in our beforeEach function so that it runs before each test
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.Navigate()
+ creatCommObj.HomeCreateComm()
+ })
+
+//------------------------------------------------------- first form --------------------------------------------------------///
+ it('test damy', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.CommName('samasemo')
+ // creatCommObj.CancelCreateComByX()
+ // creatCommObj.CommFormNotExist()
+ })
+
+ it('Clicking on "Create Community" button with empty Community name', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.CreateCommunitySub()
+ creatCommObj.NoCommNameErrMsg('A community name is required')
+ //?: creatCommObj.ErrFormVisible()
+ })
+
+//?:Community names must be between 3–21 characters, and can only contain letters, numbers, or underscores.
+//?OR : Community names must be between 3–21 characters, and can only contain letters,.. ?
+ //?:-
+ it('Clicking on "Create Community" button with very short Community name', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.CommName('ab')
+ creatCommObj.CreateCommunitySub()
+ creatCommObj.InvalidCommNameErrMsg('Community names must be between 3–21 characters, and can only contain letters, numbers, or underscores.')
+ })
+
+ //pass
+ //later
+ it('Clicking on "Create Community" button with community name with numbers only', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.CommName('hihii8908')
+ creatCommObj.CommCategory('TV')
+ creatCommObj.CreateCommunitySub()
+ })
+
+ //pass -m.s-
+ //later
+ it('Clicking on "Create Community" button with community name start with numbers only', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.CommName('8908party')
+ creatCommObj.CommCategory('TV')
+ creatCommObj.CreateCommunitySub()
+ })
+
+ it('Clicking on "Create Community" button with community name with numbers and space', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.CommName('hibjhii 8908')
+ creatCommObj.CreateCommunitySub()
+ creatCommObj.InvalidCommNameErrMsg('Community names must be between 3–21 characters, and can only contain letters, numbers, or underscores.')
+ })
+
+ it('Clicking on "Create Community" button with community name with numbers and space', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.CommName('hibjhii 8908')
+ creatCommObj.CreateCommunitySub()
+ creatCommObj.InvalidCommNameErrMsg('Community names must be between 3–21 characters, and can only contain letters, numbers, or underscores.')
+ })
+
+ //not pass
+ it('Clicking on "Create Community" button with community name with special character only', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.CommName('hibjhii##')
+ creatCommObj.CreateCommunitySub()
+ creatCommObj.InvalidCommNameErrMsg('Community names must be between 3–21 characters, and can only contain letters, numbers, or underscores.')
+ })
+
+ //repeated?:-
+ it('Clicking on "Create Community" button with community name with special character and space', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.CommName('hibjhii ##')
+ creatCommObj.CreateCommunitySub()
+ creatCommObj.InvalidCommNameErrMsg('Community names must be between 3–21 characters, and can only contain letters, numbers, or underscores.')
+ })
+
+// //later: responce?
+// it('Clicking on "Create Community" button with lowercase community name', () => {
+// const creatCommObj = new CreateCommObjects()
+// // creatCommObj.CommName('lowlow')
+
+// })
+
+//later: responce?
+// it('Clicking on "Create Community" button with upercase community name', () => {
+// const creatCommObj = new CreateCommObjects()
+// // creatCommObj.CommName('HIGHHIGH')
+
+// })
+
+ //useless?:-
+// it('Without clicking on "Create Community" button with very short Community name', () => {
+// const creatCommObj = new CreateCommObjects()
+// creatCommObj.CommName('ab')
+// creatCommObj.InvalidCommNameErrMsg('Community names must be between 3–21 characters, and can only contain letters, numbers, or underscores.')
+// })
+
+ it('Clicking on "More" in the error message of very short Community name ', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.CommName('ab')
+ creatCommObj.CreateCommunitySub()
+ creatCommObj.MoreErrMsgUrl()
+ creatCommObj.ErrFormVisible()
+ })
+
+ it('Error form message synatx', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.CommName('ab')
+ creatCommObj.CreateCommunitySub()
+ creatCommObj.MoreErrMsgUrl()
+ creatCommObj.ErrFormText('Community names must be between 3–21 characters, and can only contain letters, numbers, or underscores.')
+ })
+
+ it('Close by (x) in error form message synatx', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.CommName('ab')
+ creatCommObj.CreateCommunitySub()
+ creatCommObj.MoreErrMsgUrl()
+ creatCommObj.ErrFormX()
+ creatCommObj.ErrFormNotExist()
+ })
+
+ it('Close by (OK) in error form message synatx', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.CommName('ab')
+ creatCommObj.CreateCommunitySub()
+ creatCommObj.MoreErrMsgUrl()
+ creatCommObj.ErrFormOk()
+ creatCommObj.ErrFormNotExist()
+ })
+
+ it('Check Max community name lenght', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.CommNameMax()
+ })
+
+ // it('Enter existing community name and submit', () => {
+ // const creatCommObj = new CreateCommObjects()
+ // //later commName:-
+ // const commName = 'footbally'
+ // creatCommObj.CommName(commName)
+ // creatCommObj.CreateCommunitySub()
+ // creatCommObj.CommNameErrMsg('Sorry, r/'+commName+' is taken. Try another.')
+ // //Sorry, r/footbally is taken. Try another.
+ // })
+
+ it('Enter existing community name and submit', () => {
+ const creatCommObj = new CreateCommObjects()
+ //later commName:-
+ const commName = 'footbally'
+ creatCommObj.CommName(commName)
+ creatCommObj.CreateCommunitySub()
+ // creatCommObj.CommNameErrMsg('Sorry, r/'+commName+' is taken. Try another.')
+ //Sorry, r/footbally is taken. Try another.
+ })
+
+ //filtered
+ // it('Submit without community category', () => {
+ // const creatCommObj = new CreateCommObjects()
+ // creatCommObj.CommName('NOCATEGORY')
+ // creatCommObj.CreateCommunitySub()
+ // creatCommObj.CommCategoryErrMsg('A community category is required')
+ // })
+
+// //later
+// // it('Enter valid community name and submit', () => {
+// // const creatCommObj = new CreateCommObjects()
+// // creatCommObj.CommName('Samaa_Comm_fero')
+// // creatCommObj.CreateCommunitySub()
+// // creatCommObj.xx
+// // })
+
+ it('Closeing the form of "Create Community" by (Cancel) button', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.CancelCreateCom ()
+ //creatCommObj.GoHome()
+ creatCommObj.CommFormNotExist()
+ })
+
+ it('Closeing the form of "Create Community" by (X) button', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.CancelCreateComByX()
+ //creatCommObj.GoHome()
+ creatCommObj.CommFormNotExist()
+ })
+
+ //Bug
+ it('Closeing the form of "Create Community" by Clicking out of the "Create Community" form', () => {
+ const creatCommObj = new CreateCommObjects()
+ creatCommObj.ClickOutForm()
+ //creatCommObj.GoHome()
+ creatCommObj.CommFormNotExist()
+ })
+
+})
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/ForgetActions/ForgetPasswordActions.cy.js b/cypress/e2e/SWE_PROJECT/ForgetActions/ForgetPasswordActions.cy.js
new file mode 100644
index 0000000..2213c5a
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/ForgetActions/ForgetPasswordActions.cy.js
@@ -0,0 +1,142 @@
+///
+import ForgetPasswordObjects from "./cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetPasswordObjects.cy"
+
+describe('Reset Password Page Tests', function () {
+
+//Test Case 1
+ //NOTE: CHECK THE EFFECT OF IT
+ it('Forget Password', () => {
+ console.log("\n\nwaer" ,Cypress.env("CYPRESSBASEURL"), "waer\n\n")
+ const forgetPassword = new ForgetPasswordObjects()
+ forgetPassword.navigate()
+
+ forgetPassword.ForgetPasswordHyperLink()
+ forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage')
+ forgetPassword.EnterEmail('karimmahmoud2210@gmail.com')
+ forgetPassword.EnterUserName('adasdwdx')
+ forgetPassword.ClickOnResetPasswordButton()
+
+ })
+
+ //Test Case 2
+ //TODO : REVIEW IT
+ it('Forget Password then click on help', () => {
+
+ const forgetPassword = new ForgetPasswordObjects()
+ forgetPassword.navigate()
+
+ forgetPassword.ForgetPasswordHyperLink()
+ forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage')
+ forgetPassword.EnterEmail('karimmahmoud2210@gmail.com')
+ forgetPassword.EnterUserName('adasdwdx')
+ forgetPassword.UrlNotEqualChecker('http://localhost/forgetPasswordpage')
+ })
+
+ //Test Case 3
+ //email is : 1231565456@gmail.com which is invalid one
+ it('Write Invalid Email - should appear error message', () => {
+
+ const forgetPassword = new ForgetPasswordObjects()
+ forgetPassword.navigate()
+
+ forgetPassword.ForgetPasswordHyperLink()
+ forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage')
+ forgetPassword.EnterEmail('1231565456@gmail.com')
+ forgetPassword.EnterUserName('adasdwdx')
+ forgetPassword.InvalidMessage()
+
+ })
+
+ //Test Case 6
+ //email is : 1231565456a@gmail.com which is Valid one
+ it('Write Valid Email - should not appear error message', () => {
+
+ const forgetPassword = new ForgetPasswordObjects()
+ forgetPassword.navigate()
+
+ forgetPassword.ForgetPasswordHyperLink()
+ forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage')
+ forgetPassword.EnterEmail('1231565456a@gmail.com')
+ forgetPassword.EnterUserName('adasdwdx')
+ forgetPassword.NotInValidMessage()
+
+ })
+
+ //Test Case 7
+ //email is : as1231565456a which is InValid one
+ it('Write Invalid Email - should appear error message', () => {
+
+ const forgetPassword = new ForgetPasswordObjects()
+ forgetPassword.navigate()
+
+ forgetPassword.ForgetPasswordHyperLink()
+ forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage')
+ forgetPassword.EnterEmail('as1231565456a')
+ forgetPassword.EnterUserName('adasdwdx')
+ forgetPassword.InvalidMessage()
+
+ })
+
+ //Test Case 8
+ //email is : which is InValid one
+ it('Write Invalid Email - should appear error message', () => {
+
+ const forgetPassword = new ForgetPasswordObjects()
+ forgetPassword.navigate()
+
+ forgetPassword.ForgetPasswordHyperLink()
+ forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage')
+ forgetPassword.EnterEmail('as1231565456a')
+ forgetPassword.EnterUserName('')
+ forgetPassword.InvalidMessage()
+
+ })
+
+ //Test Case 9
+ //email is : #$%#$^$%#^ which is InValid one
+ it('Write Invalid Email - should appear error message', () => {
+
+ const forgetPassword = new ForgetPasswordObjects()
+ forgetPassword.navigate()
+
+ forgetPassword.ForgetPasswordHyperLink()
+ forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage')
+ forgetPassword.EnterEmail('as1231565456a')
+ forgetPassword.EnterUserName('#$%#$^$%#^')
+ forgetPassword.InvalidMessage()
+
+ })
+
+ //Test Case 10
+ //email is : @@@@@@@ which is InValid one
+ it('Write Invalid Email - should appear error message', () => {
+
+ const forgetPassword = new ForgetPasswordObjects()
+ forgetPassword.navigate()
+
+ forgetPassword.ForgetPasswordHyperLink()
+ forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage')
+ forgetPassword.EnterEmail('as1231565456a')
+ forgetPassword.EnterUserName('@@@@@@@')
+ forgetPassword.InvalidMessage()
+
+ })
+
+
+ //Test Case 11
+ //email is : 127.0.0.1 which is InValid one
+ it('Write Invalid Email - should appear error message', () => {
+
+ const forgetPassword = new ForgetPasswordObjects()
+ forgetPassword.navigate()
+
+ forgetPassword.ForgetPasswordHyperLink()
+ forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage')
+ forgetPassword.EnterEmail('as1231565456a')
+ forgetPassword.EnterUserName('127.0.0.1')
+ forgetPassword.InvalidMessage()
+
+ })
+
+
+})
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/ForgetActions/ForgetUserNameActions.cy.js b/cypress/e2e/SWE_PROJECT/ForgetActions/ForgetUserNameActions.cy.js
new file mode 100644
index 0000000..22e489f
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/ForgetActions/ForgetUserNameActions.cy.js
@@ -0,0 +1,453 @@
+///
+import ForgetUserNameObjects from "./cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetUserNameObjects.cy"
+
+describe('Reset UserName Page Tests', function () {
+
+ //Test Case 1
+ //NOTE: CHECK THE EFFECT OF IT
+ it('Forget UserName', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('karimmahmoud2210@gmail.com')
+ forgetUserName.ClickOnEmailButton()
+
+ })
+
+ //Test Case 2
+ it('Forget UserName - then click login - go back to show the email is still written ', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('karimmahmoud2210@gmail.com')
+ forgetUserName.CLickOnLoginButton()
+ forgetUserName.UrlEqualChecker('http://localhost/login')
+ forgetUserName.GoBack()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.ContainsChecker('karimmahmoud2210@gmail.com')
+
+ })
+
+
+ //Test Case 3
+ it('Forget UserName - then click sign up - go back to show the email is still written', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('karimmahmoud2210@gmail.com')
+ forgetUserName.ClickOnSignUpButton()
+ forgetUserName.UrlEqualChecker('http://localhost:8085/signup')
+ forgetUserName.GoBack()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.ContainsChecker('karimmahmoud2210@gmail.com')
+
+ })
+
+ //Test Case 4
+ //TODO : REVIEW IT
+ it('Forget username then click on help', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('karimmahmoud2210@gmail.com')
+ forgetUserName.UrlNotEqualChecker('http://localhost/forgetUsernamepage')
+ })
+
+ //Test Case 5
+ //email is : 1231565456@gmail.com which is invalid one
+ it('Write Invalid Email - should appear error message', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('1231565456@gmail.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 6
+ //email is : 1231565456a@gmail.com which is Valid one
+ it('Write Valid Email - should not appear error message', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('1231565456a@gmail.com')
+ forgetUserName.NotInValidMessage()
+
+ })
+
+ //Test Case 7
+ //email is : as1231565456a which is InValid one
+ it('Write Invalid Email - should appear error message', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('as1231565456a')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //----------------------------------------Valid Test Cases----------------------------------------//
+
+ //Test Case 8
+ it('The email contains a dot with a subdomain', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@subdomain.domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 9
+ it('Plus sign is considered a valid character', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('firstname+lastname@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 10
+ it('The domain is a valid IP address', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@123.123.123.123')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 11
+ it('A square bracket around IP address is considered valid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@[123.123.123.123]')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 12
+ it('Quotes around email are considered valid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email”@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 13
+ it('Digits with at least one char in the address are valid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('1234567890a@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 14
+ it('Dash in the domain name is valid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@domain-one.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 15
+ it('Underscore in the address field is valid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('_______@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 16
+ it('.name is a valid Top Level Domain name', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@domain.name')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 17
+ it('Dot in Top Level Domain name also considered valid (use co.jp as an example here)', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@domain.co.jp')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 18
+ it('Dash in the address field is valid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('firstname-lastname@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //----------------------------------------InValid Test Cases----------------------------------------//
+
+ //Test Case 19
+ it('Garbage', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('#@%^%#$@#$@#.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 20
+ it('Missing username', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 21
+ it('Encoded HTML within an email is invalid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('Joe Smith ')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 22
+ it('Missing @', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email.domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 23
+ it('Two @ sign', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@domain@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 24
+ it('Leading dot in address is not allowed', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('.email@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 25
+ it('Trailing dot in address is not allowed', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email.@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 26
+ it('Multiple dots', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email..email@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 27
+ it('Unicode char as address', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('あいうえお@domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 28
+ it('Text followed email is not allowed', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@domain.com (Joe Smith)')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 29
+ it('Missing top-level domain (.com/.net/.org/etc)', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@domain')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 30
+ it('The leading dash in front of the domain is invalid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@-domain.com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 31
+ it('.web is not a valid top-level domain', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@domain.web')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 32
+ it('Invalid IP format', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@111.222.333.44444')
+ forgetUserName.InvalidMessage()
+
+ })
+
+ //Test Case 33
+ it('Multiple dots in the domain portion is invalid', () => {
+
+ const forgetUserName = new ForgetUserNameObjects()
+ forgetUserName.navigate()
+
+ forgetUserName.ForgetUserNameHyperLink()
+ forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage')
+ forgetUserName.EnterEmail('email@domain..com')
+ forgetUserName.InvalidMessage()
+
+ })
+
+
+})
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/ForgetActions/ResetPasswordActions.cy.js b/cypress/e2e/SWE_PROJECT/ForgetActions/ResetPasswordActions.cy.js
new file mode 100644
index 0000000..16403cf
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/ForgetActions/ResetPasswordActions.cy.js
@@ -0,0 +1,123 @@
+///
+
+import ResetPasswordObjects from "../PageObjects/ForgetObjects/ResetPasswordObjects.cy"
+describe('Reset Password Page Tests', function () {
+
+ //Test Case 1
+ it('Verify the title of the page', () => {
+
+ const ResetPassword = new ResetPasswordObjects()
+ ResetPassword.navigate()
+
+ ResetPassword.TitleChecker()
+ })
+
+ //Test Case 2
+ it('Reset pasword with same length and same content', () => {
+
+ const ResetPassword = new ResetPasswordObjects()
+ ResetPassword.navigate()
+
+ ResetPassword.NewPassword('123456789')
+ ResetPassword.VerifyPassword('123456789')
+ ResetPassword.NotInValidMessageNewPassword()
+ ResetPassword.NotInValidMessageVerifyPassword()
+ ResetPassword.ClickOnSetPasswordButton()
+ ResetPassword.UrlEqualChecker('http://localhost:8085/reset-password/:id/:token')
+
+ })
+
+ //Test Case 3
+ it('Reset pasword with same length and different content', () => {
+
+ const ResetPassword = new ResetPasswordObjects()
+ ResetPassword.navigate()
+
+ ResetPassword.NewPassword('123456789')
+ ResetPassword.VerifyPassword('123456788')
+ ResetPassword.NotInValidMessageNewPassword()
+ ResetPassword.InvalidMessageVerifyPassword()
+ ResetPassword.ClickOnSetPasswordButton()
+ ResetPassword.UrlEqualChecker('http://localhost:8085/reset-password/:id/:token')
+
+ })
+
+ //Test Case 4
+ it('Reset pasword with different length', () => {
+
+ const ResetPassword = new ResetPasswordObjects()
+ ResetPassword.navigate()
+
+ ResetPassword.NewPassword('123456789')
+ ResetPassword.VerifyPassword('123456788a')
+ ResetPassword.NotInValidMessageNewPassword()
+ ResetPassword.InvalidMessageVerifyPassword()
+ ResetPassword.ClickOnSetPasswordButton()
+ ResetPassword.UrlEqualChecker('http://localhost:8085/reset-password/:id/:token')
+
+ })
+
+ //Test Case 6
+ it('Click on Reset Button With empty passwords', () => {
+
+ const ResetPassword = new ResetPasswordObjects()
+ ResetPassword.navigate()
+
+ ResetPassword.ClickOnSetPasswordButton()
+ ResetPassword.UrlEqualChecker('http://localhost:8085/reset-password/:id/:token')
+ ResetPassword.InvalidMessageNewPassword()
+
+ })
+
+ //Test Case 7
+ it('Enter Password then go Back then return to Reset Password Page', () => {
+
+ const ResetPassword = new ResetPasswordObjects()
+ ResetPassword.navigate()
+
+ ResetPassword.NewPassword('123456789')
+ ResetPassword.VerifyPassword('123456789')
+ ResetPassword.NotInValidMessageNewPassword()
+ ResetPassword.NotInValidMessageVerifyPassword()
+ ResetPassword.GoBack()
+ ResetPassword.GoForward()
+ ResetPassword.EmptyCheckerNewPassword()
+ ResetPassword.EmptyCheckerVerifyPassword()
+
+ })
+
+ //Test Case 8
+ it('Enter Password then click on Sign In then return to Reset Password Page', () => {
+
+ const ResetPassword = new ResetPasswordObjects()
+ ResetPassword.navigate()
+
+ ResetPassword.NewPassword('123456789')
+ ResetPassword.VerifyPassword('123456789')
+ ResetPassword.NotInValidMessageNewPassword()
+ ResetPassword.NotInValidMessageVerifyPassword()
+ ResetPassword.ClickOnSignUpButton()
+ ResetPassword.GoBack()
+ ResetPassword.EmptyCheckerNewPassword()
+ ResetPassword.EmptyCheckerVerifyPassword()
+ })
+
+ //Test Case 9
+ it('Enter Password then click on Sign Up then return to Reset Password Page', () => {
+
+ const ResetPassword = new ResetPasswordObjects()
+ ResetPassword.navigate()
+
+ ResetPassword.NewPassword('123456789')
+ ResetPassword.VerifyPassword('123456789')
+ ResetPassword.NotInValidMessageNewPassword()
+ ResetPassword.NotInValidMessageVerifyPassword()
+ ResetPassword.CLickOnLoginButton()
+ ResetPassword.GoBack()
+ ResetPassword.EmptyCheckerNewPassword()
+ ResetPassword.EmptyCheckerVerifyPassword()
+
+ })
+
+
+})
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/HomePageActions/BackToTopButton.cy.js b/cypress/e2e/SWE_PROJECT/HomePageActions/BackToTopButton.cy.js
new file mode 100644
index 0000000..dfb3402
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/HomePageActions/BackToTopButton.cy.js
@@ -0,0 +1,38 @@
+///
+
+import BackToTopButtonObjects from "./cypress/e2e/SWE_PROJECT/PageObjects/HomeObjects/BackToTopButtonObjects.cy.js"
+
+describe('Back to Top Button Test Cases', function () {
+
+ beforeEach(() => {
+ //visit the URL before each test
+ //backToTopButton.navigate()
+ })
+
+ // Test case 1 ==> scroll down then click on the button to get the top of the page
+ it('Back To Top Button After Scrolling', function () {
+
+ const backToTopButton = new BackToTopButtonObjects()
+ backToTopButton.navigate()
+
+ backToTopButton.ScrolDown()
+
+ //just for me to see what have happened
+ cy.wait(2000)
+ backToTopButton.BackToTopButtonAfterScrolling()
+
+ })
+
+
+ // Test case 2 ==> don't scroll down then click on the button to get the top of the page ==> the button must not appear if i don't scroll down
+ it('Back To Top Button Before Scrolling', function () {
+ const backToTopButton = new BackToTopButtonObjects()
+ backToTopButton.navigate()
+
+ //just for me to see what have happened
+ cy.wait(2000)
+ backToTopButton.BackToTopButtonBeforeScrolling()
+
+ })
+
+ })
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/LoginActions/login.cy.js b/cypress/e2e/SWE_PROJECT/LoginActions/login.cy.js
new file mode 100644
index 0000000..3da5ac3
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/LoginActions/login.cy.js
@@ -0,0 +1,148 @@
+
+import loginObjects from '../PageObjects/LoginObjects/loginObjects'
+
+describe('Test Login', () => {
+
+ //test visiting the login page
+ beforeEach(() => {
+ // Since we want to visit the same URL at the start of all our tests,
+ // we include it in our beforeEach function so that it runs before each test
+ const login = new loginObjects()
+ login.navigate()
+ })
+
+
+ it('empty username with empty password', () => {
+ const login = new loginObjects()
+ login.submit()
+ login.doNotLog()
+ })
+
+//Later:if we have to check the enter , then theck it for all test cases bellow
+ it('Invalid username with empty password', () => {
+ const login = new loginObjects()
+ login.enterUsername('Samaa_Hazem_semo')
+ login.submit()
+ login.doNotLog()
+ })
+
+ it('Invalid password with empty username', () => {
+ const login = new loginObjects()
+ login.enterPassword('12345ghhj')
+ login.submit()
+ login.doNotLog()
+ })
+
+ it('Valid username with empty password', () => {
+ const login = new loginObjects()
+ login.enterUsername('Samaa_Hazem')
+ login.submit()
+ login.doNotLog()
+ })
+
+ it('Valid password with empty username', () => {
+ const login = new loginObjects()
+ login.enterPassword('12345')
+ login.submit()
+ login.doNotLog()
+ })
+
+ it('Valid username with invalid password', () => {
+ const login = new loginObjects()
+ login.enterUsername('Samaa_Hazem')
+ login.enterPassword('12345')
+ login.submit()
+ login.userNameErrMsg("Incorrect username or password")
+ login.doNotLog()
+
+ })
+
+ it('Valid password with invalid username', () => {
+ const login = new loginObjects()
+ login.enterUsername('Samaa_Ha')
+ login.enterPassword('cmp123456')
+ login.submit()
+ login.doNotLog()
+
+ login.userNameErrMsg("Incorrect username or password")
+ })
+
+ it('Invalid password with Invalid username', () => {
+ const login = new loginObjects()
+ login.enterUsername('Samaa_Ha')
+ login.enterPassword('1231hgrjgn')
+ login.submit()
+ login.doNotLog()
+
+ login.userNameErrMsg("Incorrect username or password")
+
+ })
+
+ it('Valid password with valid username', () => {
+ const login = new loginObjects()
+ login.enterUsername('Samaa_Hazem')
+ login.enterPassword('cmp123456')
+ login.submit()
+ //blue msg for success login
+ //cy.get(':nth-child(8) > .AnimatedForm__submitStatus > .AnimatedForm__submitStatusMessage').should('have.text',"You are now logged in. You will soon be redirected")
+ login.userNameErrMsg('You are now logged in. You will soon be redirected')
+ login.doLog()
+ })
+
+ //weird case:
+ it('Check the message after:writing username then writing password the deleting user name then submit', () => {
+ const login = new loginObjects()
+ login.enterUsername('Samaa_Hazem')
+ login.enterPassword('cmp123456')
+ //NOTE:enterUsername is already make clearing the text inside it
+ login.clearUsername()
+ login.submit()
+ login.userNameErrMsg("Username must be between 3 and 20 characters")
+ login.doNotLog()
+ })
+
+ //weird case:
+ //?later : check the validation of this in original cypress
+ it('Check the message after:writing username then writing password the deleting user name then press any where', () => {
+ const login = new loginObjects()
+ login.enterUsername('Samaa_Hazem')
+ login.enterPassword('cmp123456')
+ login.clearUsername()
+ login.body()
+ login.userNameErrMsg("Username must be between 3 and 20 characters")
+ login.doNotLog()
+ })
+ //########################################### linking with other pages #######################################
+ it('Clicking on the "SIGN UP" will load the Login page', () => {
+ const login = new loginObjects()
+ login.signUpPage()
+ login.urlChecker(Cypress.env('CYPRESSBASEURL') +'/signup')
+ //cy.url().should('include','/register')
+ //?or:cy.url().should('include','/account/register')
+ })
+
+ it('Clicking on the "username" will load the(forget username page)', () => {
+ const login = new loginObjects()
+ login.forgetUserName()
+ login.urlChecker(Cypress.env('CYPRESSBASEURL') +'/forgetUsernamepage')
+ })
+
+ it('Clicking on the "password" will load the (forget password page)', () => {
+ const login = new loginObjects()
+ login.forgetPassword()
+ login.urlChecker(Cypress.env('CYPRESSBASEURL') +'/forgetPasswordpage')
+ })
+
+ it('Clicking on the "User Agreement" will load the (User Agreement page)', () => {
+ const login = new loginObjects()
+ login.userAgreementPage()
+ login.urlChecker('https://www.redditinc.com/policies/user-agreement')
+ })
+
+ it('Clicking on the "Privacy Policy" will load the (Privacy Policy)', () => {
+ const login = new loginObjects()
+ login.privacyPolicyPage()
+ login.urlChecker('https://www.reddit.com/policies/privacy-policy')
+ })
+
+})
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/CreateCommunityObjects/CreateCommObjects.js b/cypress/e2e/SWE_PROJECT/PageObjects/CreateCommunityObjects/CreateCommObjects.js
new file mode 100644
index 0000000..d795478
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PageObjects/CreateCommunityObjects/CreateCommObjects.js
@@ -0,0 +1,143 @@
+class CreateCommObjects{
+
+ Navigate() {
+ cy.visit(Cypress.env('CYPRESSBASEURL') +'/main')
+
+ }
+
+ UrlChecker(url) {
+ cy.url()
+ .should('equal',url);
+ }
+
+ HomeCreateComm() {
+ cy.get('#create-community-sidebar')
+ .click()
+ }
+
+ // urlInclude(tag) {
+ // cy.url()
+ // .should('include',tag);
+ // }
+
+ // urlNotInclude(tag) {
+ // cy.url()
+ // .should('not.include',tag);
+ // }
+
+ CreateCommunitySub() {
+ //click on create community button
+ cy.get('#create-button')
+ .click()
+ }
+
+ NoCommNameErrMsg(msg) {
+ //filtered
+ // cy.get('#required-name')
+ // .should('have.text',msg)
+ cy.get('#required-name')
+ .should('contain.text',msg)
+ }
+
+ //filtered : each error msg has different ids
+ InvalidCommNameErrMsg(msg) {
+ //filtered
+ // cy.get('#name-symbols')
+ // .should('have.text',msg)
+ cy.get('#name-symbols')
+ .should('contain.text',msg)
+ }
+
+ MoreErrMsgUrl() {
+ cy.get('#more')
+ .click()
+ }
+
+ ErrFormVisible() {
+ cy.get('.transparent-background > dialog')
+ // cy.get('#more-dialog')
+ .should('be.exist')
+ }
+
+ ErrFormNotExist() {
+ cy.get('.transparent-background > dialog')
+ // cy.get('#more-dialog')
+ .should('not.exist')
+ }
+
+ ErrFormText(msg) {
+ //filtered
+ // cy.get('.error-text')
+ // .should('have.text',msg)
+ cy.get('.error-text')
+ .should('contain.text',msg)
+ }
+
+ ErrFormOk() {
+ cy.get('#ok')
+ .click()
+ }
+
+ ErrFormX() {
+ //NOTE: not '#exit-dialog' as this is the id for (x) of th Create Community form itself
+ cy.get('.transparent-background > dialog > header > #exit-dialog')
+ .click()
+ }
+
+ CommName(commName) {
+ cy.get('#name-input')
+ .clear()
+ .type(commName)
+ }
+
+ CommNameMax() {
+ cy.get('#name-input')
+ .invoke('attr', 'maxlength')
+ .should('equal','21')
+ }
+
+ CancelCreateCom() {
+ cy.get('#cancel-button')
+ .click()
+ }
+
+ CancelCreateComByX() {
+ cy.get('#exit-dialog')
+ .click()
+ }
+
+ CommFormVisible() {
+ cy.get('#create-community-form')
+ .should('be.exist')
+ }
+
+ CommFormNotExist() {
+ //later:m.s of not exist
+ cy.get('#create-community-form')
+ .should('not.exist')
+ }
+ // GoHome() {
+ // this.UrlChecker(Cypress.env('CYPRESSBASEURL') +'/main')
+ // }
+
+ ClickOutForm() {
+ cy.get('.backdrop')
+ .click('left')
+ }
+
+ CommCategory(major) {
+ cy.get('#category-input')
+ .select(major)
+ }
+
+ CommCategoryErrMsg(msg) {
+ //filteres
+ // cy.get('#required-category')
+ // .should('have.text',msg)
+ cy.get('#required-category')
+ .should('contain.text',msg)
+ }
+
+
+}
+export default CreateCommObjects
diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/CreatePostObjects/createPostObjects.js b/cypress/e2e/SWE_PROJECT/PageObjects/CreatePostObjects/createPostObjects.js
new file mode 100644
index 0000000..5bd1505
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PageObjects/CreatePostObjects/createPostObjects.js
@@ -0,0 +1,236 @@
+class createPostObjects{
+
+ navigate() {
+ cy.visit(Cypress.env('CYPRESSBASEURL') +'/submit')
+ }
+
+ urlChecker(url) {
+ cy.url()
+ .should('equal',url);
+ }
+
+ urlInclude(tag) {
+ cy.url()
+ .should('include',tag);
+ }
+
+ urlNotInclude(tag) {
+ cy.url()
+ .should('not.include',tag);
+ }
+
+ post() {
+ //"Post" button
+ //cy.contains('Post')
+ cy.get('.post-button')
+ .click()
+ }
+
+ //?later:change the condition of
+ //later:update the link
+ //?what is (2) here? how to determine this num
+ // cy.url()
+ // .should('equal',Cypress.env('CYPRESSBASEURL') +'/r/sub-com/comments/2/look_at_this/')
+ postDone() {
+ this.urlInclude('comments')
+ }
+
+ postNotDone() {
+ //later:change the url
+ //NOTE:we check that we still in th create post page
+ cy.url()
+ .should('equal',Cypress.env('CYPRESSBASEURL') +'/submit')
+ // urlNotInclude('comments')
+ }
+
+ // chooseCommunity() {
+ // //" " button
+ // cy.get(' ')
+ // .click()
+ // }
+
+ mainPostTap() {
+ //" " button
+ cy.get('#0')
+ .click()
+ }
+
+ imageAndVideoTap() {
+ //" " button
+ cy.get('#1')
+ .click()
+ }
+
+ linkTap() {
+ //" " button
+ cy.get('#2')
+ .click()
+ }
+
+ //later:the following should not be implemented as excel sheet said
+ // pollTap() {
+ // //" " button
+ // cy.get(' ')
+ // .click()
+ // }
+
+ // talkTap() {
+ // //" " button
+ // cy.get(' ')
+ // .click()
+ // }
+
+ // oc() {
+ // //" " button
+ // cy.get(' ')
+ // .click()
+ // }
+
+ // markdown() {
+ // //" " button
+ // cy.get(' ')
+ // .click()
+ // }
+
+ spoiler() {
+ //" " button
+ cy.get('#footer-button-spoiler')
+ .click()
+ }
+
+ nsfw() {
+ //" " button
+ cy.get('#footer-button-nsfw')
+ .click()
+ }
+
+ //later:
+ flair() {
+ //" " button
+ cy.get('#footer-button-flair')
+ .click()
+ }
+
+ dragDropImg(img) {
+ cy.get("input[type=file]")
+ .attachFile(img, { subjectType: 'drag-n-drop' })
+
+ }
+
+ uploadImgOrVideo() {
+ //" " button
+ cy.get('label.blue-button')
+ .click()
+ }
+
+ //?later:how to that?(selecting img after pressing (upload) button
+ selectImg(img) {
+
+ }
+
+ //?later:how to check that:-
+ checkUploadImgOrVideo(imoog) {
+ // cy.get("input[type=file]")
+ // cy.get('.one-image')
+ // .contains(img)
+ cy.get('.one-image')
+ .should('be.visible')
+ .and(($img) => {
+ // "naturalWidth" and "naturalHeight" are set when the image loads
+ expect($img[0].naturalWidth).to.be.greaterThan(0)
+ })
+ }
+
+ sendNotification() {
+ //" " checkbox
+ cy.get('#reply')
+ .check()
+ }
+
+ title(text) {
+ cy.get('.title-input')
+ .clear()
+ .type(text);
+ return this
+ }
+
+ checkMaxTitle() {
+ //change this id :[maxlength] :-
+ cy.get('[maxlength]').invoke('attr', 'maxlength')
+ .should('equal','300')
+ }
+
+ checkTitle(text) {
+ cy.get('.title-input')
+ .should('equal',text)
+ }
+
+ postText(text) {
+ //cy.get('[data-v-2464a639=""][data-v-a41bc47a=""]')
+ cy.get('.ql-editor')
+ .clear()
+ .type(text);
+ return this
+ }
+
+ typeUrl(url) {
+ //cy.get('.url-placeholder')
+ cy.get('#title')
+ .clear()
+ .type(url);
+ return this
+ }
+
+ showMyCommunities() {
+ cy.get('.choose-post-community-3 > .bi')
+ .click()
+ }
+
+ //later:update this id:-
+ chooseMyprofile() {
+ cy.get('.choose-post-community-3')
+ .children().first()
+ }
+
+ //later:update this function:-
+ clearCommunity() {
+ //" " button
+ cy.get('.choose-post-community-3')
+ .clear
+ }
+
+ // chooseACommunity(pswd) {
+ // cy.get('')
+ // .children().last()
+ // }
+
+ buttonDisabled(button) {
+ cy.get(button)
+ .should('be.disabled')
+ }
+
+ buttonEnabled(button) {
+ cy.get(button)
+ .should('be.enabled')
+ }
+
+ postDisabled() {
+ //later and important : update the id of (post) button when norhan add it
+ this.buttonDisabled('.post-button')
+ }
+
+ spoilerDisabled() {
+ this.buttonDisabled('#footer-button-spoiler')
+ }
+
+ //later
+ FlairDisabled() {
+ this.buttonDisabled('#footer-button-flair')
+ }
+
+ nsfwEnable() {
+ this.buttonEnabled('#footer-button-nsfw')
+ }
+
+}
+export default createPostObjects
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/CreatePostObjects/postActionObjects.js b/cypress/e2e/SWE_PROJECT/PageObjects/CreatePostObjects/postActionObjects.js
new file mode 100644
index 0000000..14c47b3
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PageObjects/CreatePostObjects/postActionObjects.js
@@ -0,0 +1,214 @@
+//1)Later: important : most of these ids is for the first post which is child(3)
+//so, later we have to edit it (when it becomes child (1)
+//NOTES:if ypu want to upvote any post rather than the first post , most of thses functions may not help
+
+//2))Later: important : the class names of any msg or any (Undo) in msg or (X) in msg , need to be updated later
+
+class postActionObjects {
+ navigate() {
+ cy.visit(Cypress.env('CYPRESSBASEURL') +'/main')
+ }
+
+
+ urlChecker(url) {
+ cy.url()
+ .should('equal',url);
+ }
+
+ postOptions(){
+ return cy.get('.sub-menu')
+ }
+
+ //################################################### save and unsave posts#################################################
+
+ savePost() {
+ //"save" button
+ cy.get('#sub-save')
+ .click()
+ }
+
+ unsavePost() {
+ //"unsave" button
+ cy.get('#sub-unsave')
+ .click()
+ }
+
+ saveMsgSyntax() {
+ cy.get('._7JH6kQpO-bx66b9ajIZrz')
+ .should('have.text','Post saved successfully');
+ }
+
+ unsaveMsgSyntax() {
+ cy.get('._7JH6kQpO-bx66b9ajIZrz')
+ .should('have.text','Post unsaved successfully');
+ }
+
+ saveUndoByMsg() {
+ //"undo" button
+ cy.get('._2iuoyPiKHN3kfOoeIQalDT _3zbhtNO0bdck0oYbYRhjMC HNozj_dKjQZ59ZsfEegz8')
+ .click()
+
+ }
+
+ unsaveUndoByMsg() {
+ //"undo" button
+ cy.get('._2iuoyPiKHN3kfOoeIQalDT _3zbhtNO0bdck0oYbYRhjMC HNozj_dKjQZ59ZsfEegz8')
+ .click()
+
+ }
+
+ //################################################## Hide and UnHide posts###################################################
+
+ hidePost() {
+ //"hide" button
+ cy.get('#hide')
+ .click()
+ }
+
+ //later:m.s of this function
+ unhidePostDisappearance() {
+ //"unhide" button
+ cy.get('.sub-menu')
+ .should('not.exist')
+ //.should('not.contain','Unhide').and('not.contain','unhide').and('not.contain','UnHide')
+ }
+
+
+ hideMsgSyntax() {
+ cy.get('_7JH6kQpO-bx66b9ajIZrz ')
+ .should('have.text','Post hidden successfully.')
+ }
+
+ //later:important: what if there are more than one post have the same title of hidden post?
+ disappHiddenfPost(postTitle) {
+ cy.contains(postTitle)
+ .should('not.exist')
+ }
+
+ // //###################################################Edit posts#################################################
+ //later:m.s of this function
+ editPostDisappearance() {
+ //"edit" button
+ cy.get('.sub-menu')
+ .should('not.contain','Edit').and('not.contain','edit')
+ }
+
+ // ################################################# vote posts #################################################
+
+ upvotePost() {
+ //"upvote" button
+ //Later:child (3) need to changed to (1) i think?
+ //? what ydmn that there is at least three posts in home page?
+ cy.get(':nth-child(3) > .d-flex > #upvote')
+ .click()
+ }
+
+ downvotePost() {
+ //"downvote" button
+ //Later:child (3) need to changed to (1) i think?
+ //? what ydmn that there is at least three posts in home page?
+ cy.get(':nth-child(3) > .d-flex > #downvote')
+ .click()
+ }
+
+ //?:-return?the concept?
+ votesNum(){
+ //get number ov votes
+ return cy.get(':nth-child(3) > .d-flex > .p-2') .invoke('text')
+ }
+
+ //?should the number be '32' or integer(32)?
+ checkVotesNum(num){
+ //get number ov votes
+ cy.get(':nth-child(3) > .d-flex > .p-2').invoke('text')
+ .should('equal',num);
+ }
+
+// // cypress test code
+// cy.get('[data-testid="num"]').then(($span) => {
+// // capture what num is right now
+// const num1 = parseFloat($span.text())
+
+// cy.get('button')
+// .click()
+// .then(() => {
+// // now capture it again
+// const num2 = parseFloat($span.text())
+
+// // make sure it's what we expected
+// expect(num2).to.eq(num1 + 1)
+// })
+// })
+
+
+ // ################################################# delete posts #################################################
+
+ deleteDisappearance() {
+ //Disappearance of delete option in any posts rather than those of the users
+ //"delete" button
+ cy.get('.sub-menu')
+ .should('not.contain','Delete').and('not.contain','delete')
+ }
+
+ //Later: ################################################# share posts #################################################
+
+ //generl check , if all have the sme id:
+ // checkMsgSyntax(msg) {
+ // cy.get('_7JH6kQpO-bx66b9ajIZrz')
+ // .should('have.text',msg);
+
+ // }
+
+ // undoByMsg() {
+ // //"undo" button
+ // cy.get('._2iuoyPiKHN3kfOoeIQalDT _3zbhtNO0bdck0oYbYRhjMC HNozj_dKjQZ59ZsfEegz8')
+ // .click()
+ // }
+
+ //?later : check if the msg diappeared or not after click on (x)
+ msgCancelbyX() {
+ //"X" button which appeare when we pass over the msg
+ cy.get('.CloseIcon')
+ .click()
+ }
+
+ // ################################################# linking between posts and comments #################################################
+
+ comments() {
+ //"Comments" button of the post first post
+ cy.get(':nth-child(3) > .post-content > .post-services > .services > :nth-child(1)')
+ .click()
+ }
+
+ //?Later: get the link of the post , then get the link of the comment page of this post
+ checkCommmentPage() {
+ this.urlChecker('http://localhost/r/sub-com/comments/1/Hello%20World/')
+ }
+
+ // ################################################# linking between posts and user profile #################################################
+
+ goUserProfile() {
+ cy.get('#go-to-user-page')
+ .click()
+ }
+
+ getFirstPostTitle() {
+ return cy.get(':nth-child(3) > .post-content > #post-router > .post-title > h3').invoke('text')//.as('posttext')
+ }
+
+ showSettingsSubmenu() {
+ cy.get('#show-settings-submenu')
+ .click()
+ }
+
+ //?Later: important: we have a serious problem in find saving in cypress!
+ //?at the full window , saved appeare without the need to click on (...)
+ //?but in cypress window , it has to click on (...) !!
+ //?which is totally different id !!
+ firstPostActionsList() {
+ cy.get(':nth-child(3) > .post-content > .post-services > .services > #submenu')
+ .click()
+ }
+
+}
+export default postActionObjects
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetPasswordObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetPasswordObjects.cy.js
new file mode 100644
index 0000000..5d0875a
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetPasswordObjects.cy.js
@@ -0,0 +1,103 @@
+
+class ForgetPasswordObjects {
+ navigate() {
+ cy.visit(Cypress.env("CYPRESSBASEURL")+'/login')
+ console.log("\n\nwaer" ,Cypress.env("CYPRESSBASEURL"), "waer\n\n")
+ cy.log( "\n\nwaerlog" ,Cypress.env("CYPRESSBASEURL"), "waerlogg\n\n")
+ }
+
+ //----------------------------------------Test #1----------------------------------------//
+
+ ForgetPasswordHyperLink(){
+ //click on the hyperlink of Password
+ cy.get('#app > div > div > div.sec-largest-div > div > form > div.forgot-usr-pass > a:nth-child(4)')
+ .should('be.visible')
+ .click()
+ return this
+ }
+
+ UrlEqualChecker(url){
+ cy.url()
+ .should('eq', url)
+ }
+
+ UrlNotEqualChecker(url){
+ cy.url()
+ .should('not.eq' , url )
+
+ }
+
+
+ EnterEmail(Password) {
+ cy.get('[id=emailAddress]')
+ .should('be.visible')
+ .clear()
+ .type(Password)
+ return this
+ }
+
+ EnterUserName(password) {
+ cy.get('[id=userName]')
+ .should('be.visible')
+ .clear()
+ .type(password)
+ return this
+ }
+
+
+ ClickOnResetPasswordButton(){
+ cy.get('[id=reset-btn]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #2----------------------------------------//
+ CLickOnLoginButton(){
+ cy.get('[id=login]')
+ .should('be.visible')
+ .click()
+ }
+
+
+ GoBack(){
+ cy.go('back')
+ }
+
+ ContainsChecker(checkingContent){
+ cy.get('[id=emailAddress]')
+ .should('be.visible')
+ .contains()
+ }
+
+ //----------------------------------------Test #3----------------------------------------//
+ ClickOnSignUpButton(){
+ cy.get('[id=signup]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #4----------------------------------------//
+ ClickOnHelpButton(){
+ cy.get('[id=help]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #5----------------------------------------//
+ InvalidMessage(){
+ cy.get('[class=invalid]')
+ .should('be.visible')
+ .contains('Please enter an email address to continue')
+ }
+
+ //----------------------------------------Test #6----------------------------------------//
+ NotInValidMessage(){
+ cy.get('[class=invalid]')
+ .should('be.visible')
+ .should('not.eq' , 'Please enter an email address to continue')
+ }
+
+
+
+}
+export default ForgetPasswordObjects
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetUserNameObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetUserNameObjects.cy.js
new file mode 100644
index 0000000..b372cba
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetUserNameObjects.cy.js
@@ -0,0 +1,104 @@
+
+class ForgetUserNameObjects {
+ navigate() {
+ cy.visit(Cypress.env('CYPRESSBASEURL') +'/login')
+ }
+
+ //----------------------------------------Test #1----------------------------------------//
+
+ ForgetUserNameHyperLink(){
+ //click on the hyperlink of username
+ cy.get('#app > div > div > div.sec-largest-div > form > div.forgot-usr-pass > a:nth-child(2)')
+ .should('be.visible')
+ .click()
+ return this
+ }
+
+ /*
+ ReCAPTCHA(){
+ cy.get('iframe')
+ .first()
+ .then((recaptchaIframe) => {
+ const body = recaptchaIframe.contents()
+ cy.get('[id=recaptcha-anchor]')
+ .click()
+ })
+
+ }
+ */
+
+ UrlEqualChecker(url){
+ cy.url()
+ .should('eq', url)
+ }
+
+ UrlNotEqualChecker(url){
+ cy.url()
+ .should('not.eq' , url )
+
+ }
+
+
+ EnterEmail(username) {
+ cy.get('[id=emailAddress]')
+ .should('be.visible')
+ .clear()
+ .type(username)
+ return this
+ }
+
+ ClickOnEmailButton(){
+ cy.get('[id=emailme]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #2----------------------------------------//
+ CLickOnLoginButton(){
+ cy.get('[id=login]')
+ .should('be.visible')
+ .click()
+ }
+
+ GoBack(){
+ cy.go('back')
+ }
+
+ ContainsChecker(checkingContent){
+ cy.get('[id=emailAddress]')
+ .should('be.visible')
+ .contains()
+ }
+
+ //----------------------------------------Test #3----------------------------------------//
+ ClickOnSignUpButton(){
+ cy.get('[id=signup]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #4----------------------------------------//
+ ClickOnHelpButton(){
+ cy.get('[id=help]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #5----------------------------------------//
+ InvalidMessage(){
+ cy.get('[class=invalid]')
+ .should('be.visible')
+ .contains('Please enter an email address to continue')
+ }
+
+ //----------------------------------------Test #6----------------------------------------//
+ NotInValidMessage(){
+ cy.get('[class=invalid]')
+ .should('be.visible')
+ .should('not.eq' , 'Please enter an email address to continue')
+ }
+
+
+
+}
+export default ForgetUserNameObjects
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ResetPasswordObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ResetPasswordObjects.cy.js
new file mode 100644
index 0000000..98eda22
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ResetPasswordObjects.cy.js
@@ -0,0 +1,91 @@
+
+class ResetPasswordObjects {
+ navigate() {
+ cy.visit(Cypress.env('CYPRESSBASEURL') +'/reset-password/:id/:token')
+ }
+
+ TitleChecker(){
+ cy.title()
+ .should('eq' , 'reddit.com: Reset your password')
+ }
+
+ NewPassword(password){
+ cy.get('[id=password]')
+ .should('be.visible')
+ .type(password)
+
+ return this
+ }
+
+ VerifyPassword(verifyPassword){
+ cy.get('[id=password-verify]')
+ .should('be.visible')
+ .type(verifyPassword)
+
+ return this
+ }
+
+ UrlEqualChecker(url){
+ cy.url()
+ .should('eq', url)
+ }
+
+ ClickOnSetPasswordButton(){
+ cy.get('[class=AnimatedForm__submitButton]')
+ .should('be.visible')
+ .click()
+ }
+
+ CLickOnLoginButton(){
+ cy.get('[id=login]')
+ .should('be.visible')
+ .click()
+ }
+
+ GoBack(){
+ cy.go('back')
+ }
+
+ GoForward(){
+ cy.go('forward')
+ }
+
+
+ ClickOnSignUpButton(){
+ cy.get('[id=signup]')
+ .should('be.visible')
+ .click()
+ }
+
+ InvalidMessageNewPassword(){
+ cy.get('[class=invalid]')
+ .contains('Password must be at least 8 characters long')
+ }
+
+ NotInValidMessageNewPassword(){
+ cy.get('[class=invalid]')
+ .should('not.eq' , 'Password must be at least 8 characters long')
+ }
+
+ InvalidMessageVerifyPassword(){
+ cy.get('[class=invalid]')
+ .contains('Password must match')
+ }
+
+ NotInValidMessageVerifyPassword(){
+ cy.get('[class=invalid]')
+ .should('not.eq' , 'Password must match')
+ }
+
+ EmptyCheckerNewPassword(){
+ cy.get('[id=password]')
+ .should('be.empty')
+ }
+
+ EmptyCheckerVerifyPassword(){
+ cy.get('[id=password]')
+ .should('be.empty')
+ }
+
+}
+export default ResetPasswordObjects
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/HomeObjects/BackToTopButtonObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/HomeObjects/BackToTopButtonObjects.cy.js
new file mode 100644
index 0000000..ed2aaba
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PageObjects/HomeObjects/BackToTopButtonObjects.cy.js
@@ -0,0 +1,25 @@
+class BackToTopButtonObjects{
+
+ navigate() {
+ cy.visit(Cypress.env('CYPRESSBASEURL') +'/main')
+ }
+
+ //----------------------------------------Test #1----------------------------------------//
+ ScrolDown(){
+ cy.scrollTo(0,300)
+ }
+
+ BackToTopButtonAfterScrolling(){
+ cy.get('[class=back-button]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #2----------------------------------------//
+ BackToTopButtonBeforeScrolling(){
+ cy.get('[class=back-button]')
+ .should('not.be.visible')
+ }
+
+}
+export default BackToTopButtonObjects
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/LoginObjects/loginObjects.js b/cypress/e2e/SWE_PROJECT/PageObjects/LoginObjects/loginObjects.js
new file mode 100644
index 0000000..f557614
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PageObjects/LoginObjects/loginObjects.js
@@ -0,0 +1,91 @@
+class loginObjects{
+ navigate() {
+ cy.visit(Cypress.env('CYPRESSBASEURL') +'/login/')
+ }
+
+ enterUsername(username) {
+ cy.get('#user-name')
+ .clear()
+ .type(username)
+ return this
+ }
+
+ clearUsername() {
+ cy.get('#user-name')
+ .clear()
+ return this
+ }
+
+ enterPassword(pswd) {
+ cy.get('#password')
+ .clear()
+ .type(pswd)
+ return this
+ }
+
+ submit() {
+ //"LOG IN" button
+ cy.get('.submit-login')
+ .click()
+ }
+
+ urlChecker(url) {
+ cy.url()
+ .should('equal',url)
+ }
+
+ doNotLog() {
+ cy.url()
+ .should('not.equal',Cypress.env('CYPRESSBASEURL') +'/main')
+ }
+
+ doLog() {
+ cy.url()
+ .should('equal',Cypress.env('CYPRESSBASEURL') +'/main')
+ }
+
+ userNameErrMsg(msg){
+ //error msg of username box
+ cy.get('.username-error-message')
+ .should('have.text',msg)
+
+ }
+
+ // loginpassmsg() {
+ // }
+ forgetPassword(){
+ //password blue word , will lead to forget password page
+ cy.get('[href="/forgetPasswordpage"]')
+ .click()
+ }
+
+ forgetUserName(){
+ //UserName blue word , will lead to forget UserName page
+ cy.get('[href="/forgetUsernamepage"]')
+ .click()
+ }
+
+ signUpPage(){
+ //SIGN UP blue word , will lead to SIGN UP page
+ cy.get('[href="/signup"]')
+ .click()
+ }
+
+ userAgreementPage(){
+ //User Agreement blue word , will lead to SIGN UP page
+ cy.get('[href="https://www.redditinc.com/policies/user-agreement"]')
+ .click()
+ }
+
+ privacyPolicyPage(){
+ //Privacy Policy blue word , will lead to SIGN UP page
+ cy.get('[href="https://www.redditinc.com/policies/privacy-policy"]')
+ .click()
+ }
+
+ body() {
+ cy.get('.sec-largest-div')
+ .click()
+ }
+}
+export default loginObjects
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/AccountObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/AccountObjects.cy.js
new file mode 100644
index 0000000..3d80e20
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/AccountObjects.cy.js
@@ -0,0 +1,83 @@
+class AccountObjects {
+
+ navigate(){
+ cy.visit(Cypress.env('CYPRESSBASEURL') +'/settings/account')
+ }
+
+ //----------------------------------------ACCOUNT PREFERENCES----------------------------------------//
+ EmailAddress(){
+ cy.get('[id=change]')
+ .should('be.visible')
+ .click()
+ }
+
+ //TODO: CHECK THE ID OF IT LATER
+ Gender() {
+ cy.get('[id=gender-menu]')
+ .should('be.visible')
+ .click()
+ }
+
+ DisplayLanguageBeta() {
+ cy.get('[id=language]')
+ .should('be.visible')
+ .click()
+ }
+
+ Country() {
+ cy.get('[id=scountry]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------CONNECTED ACCOUNTS----------------------------------------//
+
+ ConnectToTwitter(){
+ cy.get('[id=twitter]')
+ .should('be.visible')
+ .click()
+ }
+
+ ConnectToApple() {
+ cy.get('[id=apple]')
+ .should('be.visible')
+ .click()
+ }
+
+ ConnectedToGoogle() {
+ cy.get('[id=google]')
+ .should('be.visible')
+ .click()
+ }
+
+ NoBodyPrivateMessages() {
+ cy.get('[id=sum-menuNobody]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------BETA TESTS----------------------------------------//
+
+ OptIntoBetaTests(){
+ cy.get('[id=sb-2]')
+ .should('not.be.visible')
+ .click()
+ }
+
+ OptOutOfTheRedesign(){
+ //TODO: [class=title] ==>need to be changed later
+ cy.get('[id=sb-1]')
+ .should('not.be.visible')
+ .click()
+ }
+
+ //----------------------------------------DELETE ACCOUNT----------------------------------------//
+ InviteSomeoneToChat(){
+ cy.get('[id=delete-account]')
+ .should('be.visible')
+ .click()
+ }
+
+}
+
+export default AccountObjects
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/ChatAndMessagingObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/ChatAndMessagingObjects.cy.js
new file mode 100644
index 0000000..ea76a00
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/ChatAndMessagingObjects.cy.js
@@ -0,0 +1,94 @@
+class ChatAndMessagingObjects {
+
+ navigate(){
+ cy.visit(Cypress.env('CYPRESSBASEURL') + '/settings/messaging')
+ }
+
+ //----------------------------------------Test #1----------------------------------------//
+ WhoCanSendYouChatRequests(){
+ //TODO: [class=title] ==>need to be changed later
+ cy.get('[class=title]')
+ .should('be.visible')
+ .click()
+ }
+
+ AccountsOlderThan30DaysChatRequests() {
+ cy.get('[id=sum-menu-titleAccounts Older Than 30 Days]')
+ .should('be.visible')
+ .click()
+ }
+
+ EveryOneChatRequests() {
+ cy.get('[id=sum-menu-titleEveryone]')
+ .should('be.visible')
+ .click()
+ }
+
+ NoBodyChatRequests() {
+ cy.get('[id=sum-menuNobody]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #2----------------------------------------//
+
+ WhoCanSendYouPrivateMessages(){
+ //TODO: [class=title] ==>need to be changed later
+ cy.get('[class=title]')
+ .should('be.visible')
+ .click()
+ }
+
+ AccountsOlderThan30DaysPrivateMessages() {
+ cy.get('[id=sum-menu-titleAccounts Older Than 30 Days]')
+ .should('be.visible')
+ .click()
+ }
+
+ EveryOnePrivateMessages() {
+ cy.get('[id=sum-menu-titleEveryone]')
+ .should('be.visible')
+ .click()
+ }
+
+ NoBodyPrivateMessages() {
+ cy.get('[id=sum-menuNobody]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #3----------------------------------------//
+
+ InvisbleWhoCanSendYouPrivateMessages(){
+ //TODO: [class=title] ==>need to be changed later
+ cy.get('[class=title]')
+ .should('not.be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #4----------------------------------------//
+ InvisbleWhoCanSendYouChatRequests(){
+ //TODO: [class=title] ==>need to be changed later
+ cy.get('[class=title]')
+ .should('not.be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #6----------------------------------------//
+ InviteSomeoneToChat(){
+ cy.get('[id=copy-link]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #7----------------------------------------//
+ MarkAllAsread(){
+ cy.get('[id=mark-as-read]')
+ .should('be.visible')
+ .click()
+ }
+
+
+}
+
+export default ChatAndMessagingObjects
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/EmailsObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/EmailsObjects.cy.js
new file mode 100644
index 0000000..8435619
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/EmailsObjects.cy.js
@@ -0,0 +1,99 @@
+class EmailsObjects{
+
+ navigate() {
+ cy.visit(Cypress.env('CYPRESSBASEURL') + '/settings/emails')
+ }
+
+ //----------------------------------------Test #1----------------------------------------//
+ InboxMessages(){
+ cy.get('[id=btn1]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #2----------------------------------------//
+ ChatRequests(){
+ cy.get('[id=btn2]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #3----------------------------------------//
+ NewUserWelcome(){
+ cy.get('[id=btn3]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #4----------------------------------------//
+ CommentsOnYourPosts(){
+ cy.get('[id=btn4]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #5----------------------------------------//
+ RepliesToYourComments(){
+ cy.get('[id=btn5]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #6----------------------------------------//
+ UpvotesOnYourPosts(){
+ cy.get('[id=btn6]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #7----------------------------------------//
+ UpvotesOnYourComments(){
+ cy.get('[id=btn7]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #8----------------------------------------//
+ UsernameMentions(){
+ cy.get('[id=btn8]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #9----------------------------------------//
+ NewFollowers(){
+ cy.get('[id=btn9]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #10----------------------------------------//
+ DailyDigest(){
+ cy.get('[id=btn10]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #11----------------------------------------//
+ WeeklyRecap(){
+ cy.get('[id=btn11]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #12----------------------------------------//
+ CommunityDiscovery(){
+ cy.get('[id=btn12]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #13----------------------------------------//
+ UnsubscribeFromAllEmails(){
+ cy.get('[id=btn13]')
+ .should('be.visible')
+ .click()
+ }
+
+}
+export default EmailsObjects
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/FeedSettingsObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/FeedSettingsObjects.cy.js
new file mode 100644
index 0000000..817fb89
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/FeedSettingsObjects.cy.js
@@ -0,0 +1,88 @@
+class FeedSettingsObjects{
+
+ navigate() {
+ cy.visit(Cypress.env('CYPRESSBASEURL') +'/settings/feed')
+ }
+ //----------------------------CONTENT PREFERENCES Section--------------------------------//
+
+ //----------------------------------------Test #1----------------------------------------//
+ AdultContent(){
+ cy.get('[id=button-one]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #2----------------------------------------//
+ SafeBrowsingMode(){
+ cy.get('[id=button-two]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #3----------------------------------------//
+ EnableHomeFeedRecommendations(){
+ cy.get('[id=button-three]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #4----------------------------------------//
+ EnableLiveRecommendations(){
+ cy.get('[id=button-four]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #5----------------------------------------//
+ AutoplayMedia(){
+ cy.get('[id=button-five]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #6----------------------------------------//
+ ReduceAnimations(){
+ cy.get('[id=button-six]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #7----------------------------------------//
+ CommunityThemes(){
+ cy.get('[id=button-seven]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #8----------------------------------------//
+ CommunityContentSort(){
+ cy.get('[class=items-span]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #9----------------------------------------//
+ RememberPerCommunity(){
+ cy.get('[id=button-eight]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #10----------------------------------------//
+ OpenPostsInNewTab(){
+ cy.get('[id=button-nine]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------CONTENT PREFERENCES Section--------------------------------//
+
+ //----------------------------------------Test #11----------------------------------------//
+ DefaultToMarkdown(){
+ cy.get('[id=button-ten]')
+ .should('be.visible')
+ .click()
+ }
+
+}
+export default FeedSettingsObjects
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/ProfileObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/ProfileObjects.cy.js
new file mode 100644
index 0000000..5400e99
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/ProfileObjects.cy.js
@@ -0,0 +1,87 @@
+class ProfileObjects {
+
+ navigate(){
+ cy.visit( Cypress.env('CYPRESSBASEURL') + '/settings/profile')
+ }
+
+ //--------------------------------PROFILE INFORMATION------------------------------------//
+
+ //----------------------------------------Test #1----------------------------------------//
+
+ DisplayNameOptional(displayName){
+ cy.get('[id=dispalyname]')
+ .should('be.visible')
+ .type(displayName)
+ }
+
+ //----------------------------------------Test #2----------------------------------------//
+ AboutOptional(about) {
+ cy.get('[id=about]')
+ .should('be.visible')
+ .type(about)
+ }
+
+ //----------------------------------------Test #3----------------------------------------//
+ SocialLinks5Max() {
+ cy.get('[id=links-profile-settings]')
+ .should('be.visible')
+ .click()
+ }
+
+
+ //----------------------------------------IMAGES----------------------------------------//
+ //----------------------------------------Test #4----------------------------------------//
+
+ //TODO: CHECK THE ID HERE
+ ProfilePicture() {
+ cy.get('[id=sum-menuNobody]')
+ .should('be.visible')
+ .click()
+ }
+
+
+ //TODO: CHECK THE ID HERE
+ BannerImage(){
+ cy.get('[class=title]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------PROFILE CATEGORY----------------------------------------//
+
+ NSFW() {
+ cy.get('[id=nsfw-profile-settings]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------ADVANCED----------------------------------------//
+
+ AllowPeopletoFollowYou() {
+ cy.get('[id=allow-profile-settings]')
+ .should('be.visible')
+ .click()
+ }
+
+ ContentVisibility() {
+ cy.get('[id=visibility-profile-settings]')
+ .should('be.visible')
+ .click()
+ }
+
+
+ ActiveInCommunitiesVisibility(){
+ cy.get('[id=active-profile-settings]')
+ .should('be.visible')
+ .click()
+ }
+
+ ProfileModerationPage(){
+ cy.get('[id=moderation-profile-settings]')
+ .should('be.visible')
+ .click()
+ }
+
+}
+
+export default ProfileObjects
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/SafetyAndPrivacyObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/SafetyAndPrivacyObjects.cy.js
new file mode 100644
index 0000000..8d871f7
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/SafetyAndPrivacyObjects.cy.js
@@ -0,0 +1,91 @@
+class SafetyAndPrivacyObjects{
+
+ //TODO: CHECK ALL IDS OF THIS PAGE OBJECTS
+ navigate() {
+ cy.visit(Cypress.env('CYPRESSBASEURL') +'/settings/privacy')
+ }
+ //----------------------------------------Safety Section----------------------------------------//
+
+ //----------------------------------------Test #1----------------------------------------//
+ PrivacyAndSecurityFAQs(){
+ cy.get('#app > div > div > div > div:nth-child(2) > div > div > div > p > span > a')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #2----------------------------------------//
+ PeopleYouHaveBlocked(){
+ cy.get('[id=button-two]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #3----------------------------------------//
+ RemoveABlockedUser(){
+ cy.get('[id=button-three]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------Privacy Section--------------------------------------//
+
+ //----------------------------------------Test #4----------------------------------------//
+ ShowUpInSearchResults(){
+ cy.get('[id=button-four]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #5----------------------------------------//
+ PersonalizeAllOfRedditBasedOnTheOutboundLinksYouClickOn(){
+ cy.get('[id=button-five]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #6----------------------------------------//
+ PersonalizeAdsBasedOnInformationFromOurPartners(){
+ cy.get('[id=button-six]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #7----------------------------------------//
+ PersonalizeAdsBasedOnYourActivityWithOurPartners(){
+ cy.get('[id=button-seven]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #8----------------------------------------//
+ PersonalizeRecommendationsBasedOnYourGeneralLocation(){
+ cy.get('[class=items-span]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #9----------------------------------------//
+ PersonalizeRecommendationsBasedOnYourActivityWithOurPartners(){
+ cy.get('[id=button-eight]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------------------Test #10----------------------------------------//
+ BlockNewUserAddButton(){
+ cy.get('[id=button-nine]')
+ .should('be.visible')
+ .click()
+ }
+
+ //----------------------------ADVANCED SECURITY Section--------------------------------//
+
+ //----------------------------------------Test #11----------------------------------------//
+ UseTwoFactorAuthentication(){
+ cy.get('[id=button-ten]')
+ .should('be.visible')
+ .click()
+ }
+
+}
+export default SafetyAndPrivacyObjects
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/SignUpObjects/signUpObjects.js b/cypress/e2e/SWE_PROJECT/PageObjects/SignUpObjects/signUpObjects.js
new file mode 100644
index 0000000..d79403a
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PageObjects/SignUpObjects/signUpObjects.js
@@ -0,0 +1,184 @@
+class signUpObjects{
+ navigate() {
+ //?which one?
+ cy.visit(Cypress.env('CYPRESSBASEURL') +'/signup')
+ //cy.visit('https://www.reddit.com/register/')
+ }
+
+ enterEmail(username) {
+ cy.get('#email-input')
+ .clear()
+ .type(username);
+ return this
+ }
+
+ continue() {
+ //"CONTINUE" button
+ cy.get('.submit-signup')
+ .click();
+ //cy.wait(5000)
+ }
+
+ urlChecker(url) {
+ cy.url()
+ .should('equal',url);
+ }
+
+ urlCheckerNot(url) {
+ cy.url()
+ .should('not.equal',url);
+ }
+
+ emailErrMsg(msg){
+ //error msg of Email box
+ cy.get('.username-error-message')
+ .should('have.text',msg);
+ }
+
+ //########################################### linking with other pages #######################################
+ loginPage(){
+ //LOG IN blue word , will lead to login page
+ cy.get('[href="/login"]')
+ .click();
+ }
+ userAgreementPage(){
+ //User Agreement blue word , will lead to SIGN UP page
+ cy.get('[href="https://www.redditinc.com/policies/user-agreement"]')
+ .click();
+ }
+
+ privacyPolicyPage(){
+ //Privacy Policy blue word , will lead to SIGN UP page
+ cy.get('[href="https://www.redditinc.com/policies/privacy-policy"]')
+ .click();
+ }
+
+ goSecondForm() {
+ cy.get('.all-div')
+ .should('be.visible')
+ }
+
+ goNotSecondForm() {
+ cy.get('.all-div')
+ .should('not.exist')
+ }
+ //###########################for the second form ##################
+
+ enterUserName(username) {
+ cy.get('#regUsername')
+ .clear()
+ .type(username);
+ return this
+ }
+
+ enterPassword(pswd) {
+ cy.get('#reg-password')
+ .clear()
+ .type(pswd);
+ return this
+ }
+
+ signUpButton(){
+ //SIGN UP button
+ cy.get('#signup-button')
+ .click();
+ }
+
+ backButton(){
+ //Back button
+ cy.get('#back-button')
+ .click();
+ }
+
+ //later:important to update this function
+ notRobot() {
+ //?:-
+ // cy.get('.all-div')
+ // .click()
+ cy.get('#repatcha')
+ .check()
+ }
+ //NOTE:userNameErrMsg and passwordErrMsg have the same id !!
+ //?what if both appears at the same time?
+ userNameErrMsg(msg){
+ //error msg of username box
+ cy.get('.username-error-message')
+ .should('have.text',msg);
+ }
+
+ passwordErrMsg(msg){
+ //error msg of password box
+ cy.get('.username-error-message')
+ .should('have.text',msg);
+ }
+
+ noUserNameErrMsg() {
+ //error msg of username box
+ cy.get('.username-error-message')
+ .should('not.exist')
+ }
+
+ noPasswordErrMsg() {
+ //error msg of password box
+ cy.get('.username-error-message')
+ .should('not.exist')
+ }
+
+ signUpEnable() {
+ cy.get('#signup-button')
+ .should('be.enabled')
+ }
+
+ //############# later ########
+ //?i do not know what is going on, i have to click twice on conyinuw with a delay between them!!:-
+ contiuneTemporary() {
+ //"CONTINUE" button
+ cy.get('.submit-signup')
+ .click();
+ cy.wait(1000)
+ //"CONTINUE" button
+ cy.get('.submit-signup')
+ .click();
+ }
+
+ goFirstForm() {
+ cy.get('.largest-div')
+ .should('be.visible')
+ }
+
+ goNotFirstForm() {
+ cy.get('.largest-div')
+ .should('not.exist')
+ }
+
+ firstUsernameSugg() {
+ cy.get('.suggestions')
+ .children()
+ .last()
+ //.first()
+ .click()
+ }
+
+ //later:update 'should' condition
+ checkUsername() {
+ cy.get('#regUsername')
+ .should('not.be.empty')
+ //later:you can use this later:-
+ // cy.get('[data-username="Unlucky_Read_4488"]').click()
+ // cy.get('[data-username="Unlucky_Read_4488"]').invoke('text').then(_arbitaty_username => {
+ // cy.get('#regUsername').should('have.text',_arbitaty_username)
+ // })
+ }
+
+ signUpDone() {
+ cy.url()
+ .should('equal',Cypress.env('CYPRESSBASEURL') +'/main')
+ }
+
+ signUpNotDone() {
+ cy.url()
+ .should('not.equal',Cypress.env('CYPRESSBASEURL') +'/main')
+ }
+
+}
+export default signUpObjects
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/UserProfileObjects/userProfileObject.js b/cypress/e2e/SWE_PROJECT/PageObjects/UserProfileObjects/userProfileObject.js
new file mode 100644
index 0000000..4d3945b
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PageObjects/UserProfileObjects/userProfileObject.js
@@ -0,0 +1,295 @@
+class userProfileObject{
+ navigate() {
+ //NOTE:edited later
+ cy.visit( Cypress.env('CYPRESSBASEURL') + '/user/asmaa0')
+ }
+
+ overview() {
+ //"OVERVIEW" button
+ cy.get('#viewed-profile-link-overview')
+ .click()
+ }
+
+
+ posts() {
+ //"POSTS" button
+ cy.get('#viewed-profile-link-Posts')
+ .click()
+ }
+
+ comments() {
+ //"COMMENTS" button
+ cy.get('#viewed-profile-link-Comments')
+ .click()
+ }
+
+ history() {
+ //"HISTORY" button
+ cy.get('#viewed-profile-link-history')
+ .click()
+ }
+
+ hidden() {
+ //"HIDDEN" button
+ cy.get('#viewed-profile-link-hidden')
+ .click()
+ }
+
+ saved() {
+ //"SAVED" button
+ cy.get('#viewed-profile-link-saved')
+ .click()
+ }
+
+ upvoted() {
+ //"UPvoted" button
+ cy.get('#viewed-profile-link-upvoted')
+ .click()
+ }
+
+ downvoted() {
+ //"DOWNVOTED" button
+ cy.get('#viewed-profile-link-Down\ voted')
+ .click()
+ }
+
+ awardsReceived() {
+ //"AWARDS Received" button
+ cy.get('#viewed-profile-link-awards\ received')
+ .click()
+ }
+
+ awardsGiven() {
+ //"AWARDS GIVEN" button
+ cy.get('#viewed-profile-link-awards\ given')
+ .click()
+ }
+
+ ///////////////
+ urlChecker(url) {
+ cy.url()
+ .should('equal',url);
+ }
+
+ overviewPage() {
+ cy.url()
+ .should('equal','http://localhost/user/asmaaadel0/')
+ }
+
+ postsPage() {
+ cy.url()
+ .should('equal','http://localhost/user/asmaaadel0/submitted')
+ }
+
+ commentsPage() {
+ cy.url()
+ .should('equal','http://localhost/user/asmaaadel0/comments')
+ }
+
+ historyPage() {
+ cy.url()
+ .should('equal','http://localhost/user/asmaaadel0/history')
+ }
+
+ hiddenPage() {
+ cy.url()
+ .should('equal','http://localhost/user/asmaaadel0/hidden')
+ }
+
+ savedPage() {
+ cy.url()
+ .should('equal','http://localhost/user/asmaaadel0/saved')
+ }
+
+
+ upvotedPage() {
+ cy.url()
+ .should('equal','http://localhost/user/asmaaadel0/upvoted')
+ }
+
+ downvotedPage() {
+ cy.url()
+ .should('equal','http://localhost/user/asmaaadel0/downvoted')
+ }
+
+ awardsReceivedPage() {
+ cy.url()
+ .should('equal','http://localhost/user/asmaaadel0/gilded')
+ }
+
+ awardsGivenPage() {
+ cy.url()
+ .should('equal','http://localhost/user/asmaaadel0/gilded/given/')
+ }
+
+ // ################################################# linking between user profile and create post #################################################
+ newPost() {
+ cy.get('#profile-new-post')
+ .click()
+ }
+
+ createPostPage() {
+ cy.url()
+ .should('equal','http://localhost/user/asmaaadel0/submitted')
+ }
+
+ // ################################################# linking between user profile and settings #################################################
+ goSettings() {
+ cy.get('#profile-settings-icon-card')
+ .click()
+ }
+
+ settingsPage() {
+ cy.url()
+ .should('equal','http://localhost/settings/profile')
+ }
+ // ################################################# linking between user profile and home #################################################
+ goHome() {
+ cy.get('#logo-img')
+ .click()
+ }
+
+ HomePage() {
+ cy.url()
+ .should('equal','http://localhost/main')
+ }
+
+ // ################################################# pictures and links #################################################
+ //?later : how to select
+ // addProfileImg() {
+ // cy.get('#add-profile-image-button')
+ // .click().selectFile('C:\Users\samaa\Downloads\test1.jpeg')
+ // cy.get('#add-profile-image-button')
+ // .click()
+ // }
+
+ // addCoverImg() {
+ // cy.get('#cover-picture > :nth-child(1)')
+ // .click()
+ // }
+
+ //?m.s of the following logic:
+ checkProfileImg() {
+ //upload img
+ cy.get('#profile-picture')// yields the element
+ .should('have.attr', 'src') // yields the "src" attribute
+ //.and('equal', '/img/R.2bc79f6f.png') // checks the "src" value
+ .and('not.eq', '/img/R.2bc79f6f.png') // checks the "src" value
+ //check that another picture has been added rather than the defult one
+ //NOTE:--
+ //later: if the defult img change , then change the should condition
+ }
+
+ usernameUrl() {
+ cy.get('#profile-pic-user-name')
+ .click()
+ }
+
+ //userpage() {}
+ //NOTE:use overviewPage() function
+ // ################################################# profile options #################################################
+
+ moreOptions() {
+ cy.get('#more-options-button')
+ .click()
+ }
+
+ fewerOptions() {
+ cy.get('#fewer-options-button')
+ .click()
+ }
+
+ //later: using (get) with any of the three options gives error ,why?
+ profileModeration() {
+ //cy.get('#profile-option-Profile\ to\ Moderation')
+ cy.contains('Profile to Moderation')
+ .click()
+ }
+
+ addCustomFeed() {
+ // cy.get('#profile-option-Add\ to\ Custom\ Feed')
+ cy.contains('Add to Custom Feed')
+ .click()
+ }
+
+ inviteSomeoneToChat() {
+ //cy.get('#profile-option-Invite\ someone\ to\ chat')
+ cy.contains('Invite someone to chat')
+ .click()
+ }
+
+ inviteSomeoneMsgSyntax() {
+ //return cy.get('')
+ cy.get('')
+ .should('have.text','Copied link!');
+ }
+
+ //?later : check if the msg diappeared or not after click on (x)
+ msgCancelbyX() {
+ //"X" button which appeare when we pass over the msg
+ cy.get('')
+ .click()
+ }
+
+ profileModerationPage() {
+ cy.url()
+ .should('equal','http://localhost/user/asmaaadel0/about/edit/moderation')
+ }
+
+ //?later: check the responce after click on addToCustomFeed
+ profileModerationSyntax() {
+ //cy.get('#profile-option-Profile\ to\ Moderation')
+ cy.contains('Profile to Moderation')
+ .should('have.text','Profile Moderation');
+ }
+
+ addCustomFeedSyntax() {
+ //cy.get('#profile-option-Add\ to\ Custom\ Feed')
+ cy.contains('Add to Custom Feed')
+ .should('have.text','Add to Custom Feed');
+ }
+
+ inviteSomeoneToChatSyntax() {
+ //cy.get('#profile-option-Invite\ someone\ to\ chat')
+ cy.contains('Invite someone to chat')
+ .should('have.text','Invite someone to chat');
+ }
+
+ // ################################################# last part of Right side bar #################################################
+ //? is the last part is for moderating?
+
+ //?is join and unjoin have the same id?
+ //?are there the same buttom aslan?
+ joinAndUnjoin() {
+ cy.get('#moderator-join-button-')
+ .click()
+ }
+
+ goToCommunity() {
+ cy.get('#moderator-name-')
+ .click()
+ }
+
+ //? later: same problem as (comment as) mena
+ // communityPage() {
+ // cy.url()
+ // .should('equal','http://localhost/r//')
+ // }
+
+ //later : test hover of the join commiunty button
+
+ // ################################################# find a post in a cerain page #################################################
+
+ findPost(postTitle) {
+ cy.contains(postTitle)
+ }
+
+ disappearanceOfPost(postTitle) {
+ cy.contains(postTitle)
+ .should('not.exist')
+ }
+
+}
+export default userProfileObject
+
+
diff --git a/cypress/e2e/SWE_PROJECT/PostActions/createPost.cy.js b/cypress/e2e/SWE_PROJECT/PostActions/createPost.cy.js
new file mode 100644
index 0000000..e056d49
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PostActions/createPost.cy.js
@@ -0,0 +1,358 @@
+
+import createPostObjects from '../PageObjects/CreatePostObjects/createPostObjects'
+
+describe('Test Craete Post', () => {
+
+ //test visiting the submit page
+ beforeEach(() => {
+ // Since we want to visit the same URL at the start of all our tests,
+ // we include it in our beforeEach function so that it runs before each test
+ const createPost = new createPostObjects();
+ createPost.navigate()
+ })
+
+ //################################################ test chosing the community with title and post body ###############################################
+ it('Enable to choose the community or not ', () => {
+ const createPost = new createPostObjects();
+ createPost.showMyCommunities()
+ createPost.chooseMyprofile()
+ })
+
+ it('Try to click on (post) with choosing the community and without writing any thing', () => {
+ const createPost = new createPostObjects();
+ createPost.showMyCommunities()
+ createPost.chooseMyprofile()
+ //createPost.postNotDone()
+ createPost.postDisabled()
+ })
+
+ it('Try to click on (post) without choosing the community and without writing any thing', () => {
+ const createPost = new createPostObjects();
+ createPost.postNotDone()
+ //createPost.postDisabled()
+ })
+
+ it('Try to click on (post) without choosing the community and with writing title and text', () => {
+ const createPost = new createPostObjects();
+ createPost.title('hi for all')
+ createPost.postText('this is my first post')
+ createPost.postNotDone()
+ //createPost.postDisabled()
+ })
+
+ it('Try to click on (post) without choosing the community and with writing the title only', () => {
+ const createPost = new createPostObjects();
+ createPost.title('hi for all')
+ createPost.postNotDone()
+ //createPost.postDisabled()
+ })
+
+ it('Try to click on (post) without choosing the community and with writing the text only', () => {
+ const createPost = new createPostObjects();
+ createPost.postText('this is my first post')
+ createPost.postNotDone()
+ //createPost.postDisabled()
+ })
+
+ it('Click (post) with choosing the community and with writing the title only', () => {
+ const createPost = new createPostObjects();
+ createPost.showMyCommunities()
+ createPost.chooseMyprofile()
+ createPost.title('hi for all')
+ createPost.post()
+ createPost.postDone()
+ //should pass
+ })
+
+ it('Try to click on (post) with choosing the community and with writing the text only', () => {
+ const createPost = new createPostObjects();
+ createPost.showMyCommunities()
+ createPost.chooseMyprofile()
+ createPost.postText('this is my first post')
+ createPost.postNotDone()
+ //createPost.postDisabled()
+ //should NOT pass
+ })
+
+ // it('Delete the chosen community and choose another', () => {
+ // const createPost = new createPostObjects();
+ // createPost.showMyCommunities()
+ // createPost.chooseMyprofile()
+ // createPost.clearCommunity()
+ // createPost.chooseACommunity()
+
+ // })
+
+ it('Try to click on (post) after deleting the chosen community and without choosing another', () => {
+ const createPost = new createPostObjects();
+ createPost.showMyCommunities()
+ createPost.chooseMyprofile()
+ createPost.clearCommunity()
+ createPost.postNotDone()
+ //createPost.postDisabled()
+ })
+
+ it('Try to click on (post) after deleting the chosen community and without choosing another and with writing the title only', () => {
+ const createPost = new createPostObjects();
+ createPost.showMyCommunities()
+ createPost.chooseMyprofile()
+ createPost.clearCommunity()
+ createPost.title('hi for all')
+ createPost.postNotDone()
+ //createPost.postDisabled()
+ //should NOT pass
+ })
+
+ it('Try to click on (post) after deleting the chosen community and without choosing another and with writing the text only', () => {
+ const createPost = new createPostObjects();
+ createPost.showMyCommunities()
+ createPost.chooseMyprofile()
+ createPost.clearCommunity()
+ createPost.postText('this is my first post')
+ createPost.postNotDone()
+ //createPost.postDisabled()
+ })
+
+ //Later;i think the 2 tests here are repeated:--
+ // it('Click (post) after deleting the chosen community and with choosing another and with writing the title only', () => {
+ // const createPost = new createPostObjects();
+ // createPost.showMyCommunities()
+ // createPost.chooseMyprofile()
+ // createPost.clearCommunity()
+ // createPost.chooseACommunity()
+ // createPost.title('hi for all')
+ // createPost.post()
+ // createPost.postDone()
+ // //should pass
+
+ // })
+
+ // it('Click (post) after deleting the chosen community and with choosing another and with writing the text only', () => {
+ // const createPost = new createPostObjects();
+ // createPost.showMyCommunities()
+ // createPost.chooseMyprofile()
+ // createPost.clearCommunity()
+ // createPost.chooseACommunity()
+ // createPost.postText('this is my first post')
+ // createPost.postDisabled()
+ // //should NOT pass
+
+ // })
+
+ //-------------------------------------------------------- another tests about the title ###############################################
+ it('Check max length of Title', () => {
+ const createPost = new createPostObjects();
+ createPost.checkMaxTitle()
+ //should the text box of the title disaalowed
+ //createPost.title('ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggSS')
+ })
+
+ //-------------------------------------------------------- Image & Videos --------------------------------------------------------
+ //later:check this test case:(check ->checkTitle<-)
+ it('Title is the same after switching to Image & Videos', () => {
+ const createPost = new createPostObjects();
+ createPost.title('hi for all')
+ createPost.imageAndVideoTap()
+ createPost.checkTitle('hi for all')
+ })
+
+ //later:check "checkUploadImgOrVideo"
+ // it('Uploading an image using drag and drop', () => {
+ // const createPost = new createPostObjects();
+ // createPost.imageAndVideoTap()
+ // createPost.dragDropImg('test1.jpeg')
+ // createPost.checkUploadImgOrVideo('test1')
+ // })
+
+ // it('Uploading an image using (upload) button', () => {
+ // const createPost = new createPostObjects();
+ // createPost.imageAndVideoTap()
+ // createPost.uploadImgOrVideo()
+ // createPost.selectImg('test1.jpeg')
+ // createPost.checkUploadImgOrVideo('test1')
+ // })
+
+ // //later:13-12
+ // it.only('Try to click on (post) with uploading an image and with writing title and without choosing the community', () => {
+ // const createPost = new createPostObjects();
+ // createPost.imageAndVideoTap()
+ // createPost.dragDropImg('test1.jpeg')
+ // createPost.checkUploadImgOrVideo('test1')
+ // // createPost.title('hi for all')
+ // // createPost.postNotDone()
+ // //createPost.postDisabled()
+ // })
+
+ //this test is repeated:-
+ // it('Click (post) without uploading an image without writing title and without choosing the community', () => {
+ // const createPost = new createPostObjects();
+ // createPost.postDisabled()
+ // })
+
+ it('Try to click on (post) without uploading an image with writing title and with choosing the community', () => {
+ const createPost = new createPostObjects();
+ createPost.showMyCommunities()
+ createPost.chooseMyprofile()
+ createPost.title('hi for all')
+ createPost.postNotDone()
+ //createPost.postDisabled()
+ //should NOT pass
+ })
+
+ it('Try to click on (post) with uploading an image without writing title and with choosing the community', () => {
+ const createPost = new createPostObjects();
+ createPost.showMyCommunities()
+ createPost.chooseMyprofile()
+ createPost.imageAndVideoTap()
+ createPost.dragDropImg('test1.jpeg')
+ createPost.postNotDone()
+ //createPost.postDisabled()
+ //should NOT pass
+ })
+
+ //filtered
+ // it('Click (post) with uploading an image with writing title and with choosing the community', () => {
+ // const createPost = new createPostObjects();
+ // createPost.imageAndVideoTap()
+ // createPost.dragDropImg('test1.jpeg')
+ // createPost.showMyCommunities()
+ // createPost.chooseMyprofile()
+ // createPost.title('hi for all')
+ // createPost.post()
+ // createPost.postDone()
+ // //should pass
+ // })
+
+
+ it('Click (post) with uploading an image with writing title and with choosing the community', () => {
+ const createPost = new createPostObjects();
+ createPost.showMyCommunities()
+ createPost.chooseMyprofile()
+ createPost.title('hi for all')
+ createPost.imageAndVideoTap()
+ createPost.dragDropImg('test1.jpeg')
+ createPost.post()
+ createPost.postDone()
+ //should pass
+ })
+ //-------------------------------------------------------- Link --------------------------------------------------------
+
+ //filtered
+ // it('Try to click on (post) with writing a link and with writing title and without choosing the community', () => {
+ // const createPost = new createPostObjects();
+ // createPost.linkTap()
+ // createPost.typeUrl('https://testup.io/how-to-implement-drag-and-drop-in-cypress/')
+ // createPost.title('hi for all')
+ // createPost.postNotDone()
+ // //createPost.postDisabled()
+ // })
+
+
+ it('Try to click on (post) with writing a link and with writing title and without choosing the community', () => {
+ const createPost = new createPostObjects();
+ createPost.title('hi for all')
+ createPost.linkTap()
+ createPost.typeUrl('https://testup.io/how-to-implement-drag-and-drop-in-cypress/')
+ createPost.postNotDone()
+ //createPost.postDisabled()
+ })
+
+
+ //this test is repeated:-
+ // it('Click (post) without writing a link without writing title and without choosing the community', () => {
+ // const createPost = new createPostObjects();
+ // createPost.postDisabled()
+ // })
+
+ it('Try to click on (post) without writing a link with writing title and with choosing the community', () => {
+ const createPost = new createPostObjects();
+ createPost.showMyCommunities()
+ createPost.chooseMyprofile()
+ createPost.title('hi for all')
+ createPost.postNotDone()
+ //createPost.postDisabled()
+ //should NOT pass
+ })
+
+ it('Try to click on (post) with writing a link without writing title and with choosing the community', () => {
+ const createPost = new createPostObjects();
+ createPost.showMyCommunities()
+ createPost.chooseMyprofile()
+ createPost.linkTap()
+ createPost.typeUrl('https://testup.io/how-to-implement-drag-and-drop-in-cypress/')
+ createPost.postNotDone()
+ //createPost.postDisabled()
+ //should NOT pass
+ })
+
+ //filtered
+ // it('Click (post) with writing a link with writing title and with choosing the community', () => {
+ // const createPost = new createPostObjects();
+ // createPost.linkTap()
+ // createPost.typeUrl('https://testup.io/how-to-implement-drag-and-drop-in-cypress/')
+ // createPost.showMyCommunities()
+ // createPost.chooseMyprofile()
+ // createPost.title('hi for all')
+ // createPost.post()
+ // createPost.postDone()
+ // //should pass
+ // })
+
+ it('Click (post) with writing a link with writing title and with choosing the community', () => {
+ const createPost = new createPostObjects();
+ createPost.showMyCommunities()
+ createPost.chooseMyprofile()
+ createPost.title('hi for all')
+ createPost.linkTap()
+ createPost.typeUrl('https://testup.io/how-to-implement-drag-and-drop-in-cypress/')
+ createPost.post()
+ createPost.postDone()
+ //should pass
+ })
+ //-------------------------------------------------------- other buttons --------------------------------------------------------
+
+ it('Try to click on (Spoiler) Without choosing the community', () => {
+ const createPost = new createPostObjects();
+ //createPost.spoiler()
+ createPost.spoilerDisabled()
+ })
+
+ //later:check the flair later
+ it('Try to click on (Flair) Without choosing the community', () => {
+ const createPost = new createPostObjects();
+ // createPost.flair()
+ createPost.FlairDisabled()
+ })
+
+ it('Try to click on (nsfw) Without choosing the community', () => {
+ const createPost = new createPostObjects();
+ createPost.nsfw()
+ createPost.nsfwEnable()
+ //NOTE:enable not diabled
+})
+ //-------------------------------------------------------- Later --------------------------------------------------------
+
+ //later:-
+ // it('Try to click on (Spoiler) Without choosing the community that enable spoiler', () => {
+ // const createPost = new createPostObjects();
+ // createPost.
+ // createPost.
+ // createPost.
+ // })
+
+ // //later:-
+ // it('Try to click on (flair) Without choosing the community that enable spoiler', () => {
+ // const createPost = new createPostObjects();
+ // createPost.
+ // createPost.
+ // createPost.
+ // })
+
+ //test NSFW button
+
+ //test Event button
+
+ //test Live chat button
+
+ //check all styles
+})
diff --git a/cypress/e2e/SWE_PROJECT/PostActions/postAction.cy.js b/cypress/e2e/SWE_PROJECT/PostActions/postAction.cy.js
new file mode 100644
index 0000000..b807c68
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/PostActions/postAction.cy.js
@@ -0,0 +1,366 @@
+import postActionObjects from '../PageObjects/CreatePostObjects/postActionObjects'
+import userProfileObject from '../PageObjects/UserProfileObjects/userProfileObject'
+
+describe('Test some actions on post', () => {
+
+ //test visiting the home page
+ beforeEach(() => {
+ // Since we want to visit the same URL at the start of all our tests,
+ // we include it in our beforeEach function so that it runs before each test
+ const postAct = new postActionObjects();
+ postAct.navigate()
+ })
+
+
+ //################################################### save posts#################################################
+
+ it('Check saving arbitrary post in (SAVED) page in user profile', () => {
+ const postAct = new postActionObjects()
+ const userProfile = new userProfileObject()
+
+ postAct.firstPostActionsList()
+ postAct.savePost()
+ postAct.getFirstPostTitle().then((title)=>{
+ postAct.showSettingsSubmenu()
+ postAct.goUserProfile()
+ userProfile.saved()
+ userProfile.findPost(title)
+ })
+
+ })
+
+ it('Appearance of saving post message and its syntax', () => {
+ const postAct = new postActionObjects()
+ postAct.firstPostActionsList()
+ postAct.savePost()
+ postAct.saveMsgSyntax()
+
+ })
+
+ it('Check message after clicking on (Undo) in saving post message', () => {
+ const postAct = new postActionObjects()
+ postAct.firstPostActionsList()
+ postAct.savePost()
+ postAct.unsaveMsgSyntax()
+
+ })
+
+ it('Check unsaving post in (SAVED) page in user profile after click on (Undo) in save message', () => {
+ const postAct = new postActionObjects()
+ const userProfile = new userProfileObject()
+ postAct.firstPostActionsList()
+ postAct.savePost()
+ postAct.saveUndoByMsg()
+ postAct.getFirstPostTitle().then((title)=>{
+ postAct.showSettingsSubmenu()
+ postAct.goUserProfile()
+ userProfile.saved()
+ userProfile.disappearanceOfPost(title)
+ })
+ //save a post go to SAVED in your profile and chrck if it is unsaved or not
+ //?Later:how to check for the post that i unsaved right now not another post?
+ })
+
+ //################################################### unsave posts#################################################
+
+ it('Check unsaving arbitrary saved post in (SAVED) page in user profile', () => {
+ const postAct = new postActionObjects()
+ const userProfile = new userProfileObject()
+ postAct.firstPostActionsList()
+ postAct.savePost()
+ //NOTE: wait some time until the message of saving post diappeare
+ cy.wait(8000)
+
+ postAct.firstPostActionsList()
+ postAct.unsavePost()
+ postAct.getFirstPostTitle().then((title)=>{
+ postAct.showSettingsSubmenu()
+ postAct.goUserProfile()
+ userProfile.saved()
+ userProfile.disappearanceOfPost(title)
+ })
+ //save a post go to SAVED in your profile and chrck if it is saved or not
+ //?Later:how to check for the post that i saved right now not another post?
+ })
+
+ it('Appearance of unsaving post message and its syntax', () => {
+ const postAct = new postActionObjects()
+ postAct.firstPostActionsList()
+ postAct.savePost()
+ //NOTE: wait some time until the message of saving post diappeare
+ cy.wait(8000)
+
+ postAct.firstPostActionsList()
+ postAct.unsavePost()
+ postAct.unsaveMsgSyntax()
+ })
+
+ it('Check message after clicking on (Undo) in unsaving post message', () => {
+ const postAct = new postActionObjects()
+ postAct.firstPostActionsList()
+ postAct.savePost()
+ //NOTE: wait some time until the message of saving post diappeare
+ cy.wait(8000)
+
+ postAct.firstPostActionsList()
+ postAct.unsavePost()
+ postAct.unsaveUndoByMsg()
+ postAct.saveMsgSyntax()
+
+ })
+
+ it('Check saving post in (SAVED) page in user profile after click on (Undo) in unsave message', () => {
+ const postAct = new postActionObjects()
+ postAct.firstPostActionsList()
+ postAct.savePost()
+ //NOTE: wait some time until the message of saving post diappeare
+ cy.wait(8000)
+ postAct.firstPostActionsList()
+ postAct.unsavePost()
+ postAct.unsaveUndoByMsg()
+ postAct.getFirstPostTitle().then((title)=>{
+ postAct.showSettingsSubmenu()
+ postAct.goUserProfile()
+ userProfile.saved()
+ userProfile.findPost(title)
+ })
+ })
+
+ // it('Check messages for multiple saving and unsaving for the same post one after the other at the same minute', () => {
+ // const postAct = new postActionObjects()
+ // postAct.xx
+ // postAct.xx
+ // //check it will keep up with the speed or not
+ // //check the messages are not overlaped or not
+ // //check the last responce (saved or unsaved)
+
+ // })
+
+ //################################################## Hide and UnHide posts###################################################
+
+ it('Check hiding arbitrary post in (HIDDEN) page in user profile', () => {
+ const postAct = new postActionObjects()
+ const userProfile = new userProfileObject()
+ postAct.firstPostActionsList()
+ postAct.hidePost()
+
+ postAct.getFirstPostTitle().then((title)=>{
+ postAct.showSettingsSubmenu()
+ postAct.goUserProfile()
+ userProfile.hidden()
+ userProfile.findPost(title)
+ })
+ //check : Disappearance for the arbitrary hidden post
+ //hide a post go to HIDDEN in your profile and chrck if it is hide or not
+ //?Later:how to check for the post that i hide right now not another post?
+ })
+
+ it('Appearance of hiding post message and its syntax', () => {
+ const postAct = new postActionObjects()
+ postAct.firstPostActionsList()
+ postAct.hidePost()
+ postAct.hideMsgSyntax()
+ })
+
+ it('Check message after clicking on (Undo) in hiding post message ', () => {
+ const postAct = new postActionObjects()
+ postAct.firstPostActionsList()
+ postAct.hidePost()
+ postAct.hideUndoByMsg();
+ postAct.unhideMsgDisappearance()
+ //NOTE: unlike undo of save and save , there is no message appeare after pree undo in hidden msg
+
+ })
+
+ it("Disappearance of a hidden home post in home page", () => {
+ const postAct = new postActionObjects()
+ postAct.getFirstPostTitle().then((title)=>{
+ postAct.firstPostActionsList()
+ postAct.hidePost()
+ postAct.disappHiddenfPost(title)
+ })
+ })
+
+ it("Disappearance of (Unhide) option in the hiddden home post", () => {
+ const postAct = new postActionObjects()
+ postAct.firstPostActionsList()
+ postAct.hidePost()
+ postAct.unhidePostDisappearance()
+ //you can not unhide any post from its option, it is just done from (HIDDEN) page in the user page
+ })
+
+
+ //###################################################Edit posts#################################################
+
+ it('Disappearance of edit option of a post that dose not belong to the user', () => {
+ const postAct = new postActionObjects()
+ postAct.firstPostActionsList()
+ postAct.editPostDisappearance()
+ //?:check the ability to edit a post which is not mine (even if i share it in my profile <= m.s )
+ })
+ // ################################################# vote posts #################################################
+
+ it('Check numbers of votes after upvote', () => {
+ const postAct = new postActionObjects()
+
+ //?later: how to check thousand vote numbers?
+ postAct.votesNum().then((num_str)=>{
+ let num = parseInt(num_str)
+ postAct.upvotePost()
+ num= num+1
+ let string = `${num}`;
+ postAct.checkVotesNum(string)
+ })
+ })
+
+ //later:
+ // it('Check numbers of votes after downvote for at least votes = 2', () => {
+ // const postAct = new postActionObjects()
+ // postAct.votesNum()
+ // postAct.downvotePost()
+ // postAct.checkVotesNum(num)
+ // })
+
+ // it('Check numbers of votes after downvote for at least votes = 1', () => {
+ // const postAct = new postActionObjects()
+ // //check zero votes ability
+ // })
+
+ // it('Check numbers of votes after downvote for at least votes = 0', () => {
+ // const postAct = new postActionObjects()
+ // //check -ve votes
+ // })
+
+ it('Downvoting after upvoting the same post', () => {
+ const postAct = new postActionObjects()
+ postAct.votesNum().then((num_str)=>{
+ let num = parseInt(num_str)
+ postAct.upvotePost()
+ postAct.downvotePost()
+ num= num-1
+ let string = `${num}`;
+ postAct.checkVotesNum(string)
+ })
+ })
+
+ it('Upvoting after downvoting the same post', () => {
+ const postAct = new postActionObjects()
+ postAct.votesNum().then((num_str)=>{
+ let num = parseInt(num_str)
+ postAct.downvotePost()
+ postAct.upvotePost()
+ num= num+1
+ let string = `${num}`;
+ postAct.checkVotesNum(string)
+ })
+ })
+
+ it('Cancel upvoting by clicking on upvote button even numbers of time', () => {
+ const postAct = new postActionObjects()
+ postAct.votesNum().then((num_str)=>{
+ postAct.upvotePost()
+ postAct.upvotePost()
+ postAct.checkVotesNum(num_str)
+ //same old number num_str not num_str+2
+ })
+ })
+
+ it('Click on upvote button odd numbers of time', () => {
+ const postAct = new postActionObjects()
+ postAct.votesNum().then((num_str)=>{
+ let num = parseInt(num_str)
+ postAct.upvotePost()
+ postAct.upvotePost()
+ postAct.upvotePost()
+ num= num+1
+ let string = `${num}`;
+ postAct.checkVotesNum(string)
+ //num_str+1 not num_str+3
+ })
+ //it should be counted as one upvote
+
+ })
+
+ it('Click on downvote button odd numbers of time', () => {
+ const postAct = new postActionObjects()
+ postAct.votesNum().then((num_str)=>{
+ let num = parseInt(num_str)
+ postAct.downvotePost()
+ postAct.downvotePost()
+ postAct.downvotePost()
+ num= num-1
+ let string = `${num}`;
+ postAct.checkVotesNum(string)
+ //num_str-1 not num_str-3
+ })
+
+ })
+
+ it('Cancel downvoting by clicking on downvote button even numbers of time', () => {
+ const postAct = new postActionObjects()
+ postAct.votesNum().then((num_str)=>{
+ postAct.downvotePost()
+ postAct.downvotePost()
+ postAct.checkVotesNum(num_str)
+ //same old number num_str not num_str-2
+ })
+ })
+
+ it('Check upvoted post in UPVOTE page in user profile', () => {
+ const postAct = new postActionObjects()
+ const userProfile = new userProfileObject()
+ postAct.upvotePost()
+ postAct.getFirstPostTitle().then((title)=>{
+ postAct.showSettingsSubmenu()
+ postAct.goUserProfile()
+ userProfile.upvoted()
+ userProfile.findPost(title)
+ })
+ })
+
+ it('Check downvoted post in DOWNVOTE page in user profile', () => {
+ const postAct = new postActionObjects()
+ const userProfile = new userProfileObject()
+ postAct.downvotePost()
+ postAct.getFirstPostTitle().then((title)=>{
+ postAct.showSettingsSubmenu()
+ postAct.goUserProfile()
+ userProfile.downvoted()
+ userProfile.findPost(title)
+ })
+ })
+
+ // ################################################# delete posts #################################################
+ it('Disappearance of delete option of a post that dose not belong to the user', () => {
+ const postAct = new postActionObjects()
+ postAct.firstPostActionsList()
+ postAct.deleteDisappearance()
+ })
+
+ ////////////////////////////////////////////Later//////////////////////////////////////////////
+
+ it('Exsitance of any post', () => {
+ const postAct = new postActionObjects()
+ postAct.getFirstPostTitle()
+ })
+
+ //Later : check all posts option gain , but from each tab in the users top tapa ( SAVED , UPVOTE , .... )
+
+ //Later: ################################################# share posts #################################################
+ // it('', () => {
+ // const postAct = new postActionObjects()
+ // postAct.xx
+ // postAct.xx
+
+ // })
+
+ // ################################################# linking between posts and comments #################################################
+ it('check if (Comments)button will go to the comments page of the post', () => {
+ const postAct = new postActionObjects()
+ postAct.comments();
+ postAct.checkCommmentPage();
+ })
+
+ //Later:check when click on the (my post or a hom post) post all the buttons that appeare , ex: (New Post) at the right
+
+})
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/SettingsActions/AccountActions.cy.js b/cypress/e2e/SWE_PROJECT/SettingsActions/AccountActions.cy.js
new file mode 100644
index 0000000..7cd32c4
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/SettingsActions/AccountActions.cy.js
@@ -0,0 +1,93 @@
+///
+
+import AccountObjects from "../PageObjects/SettingsObjects/AccountObjects.cy"
+
+describe('Feed Settings Tab Tests', function () {
+
+ //----------------------------------------ACCOUNT PREFERENCES Section----------------------------------------//
+ //Test Case 1
+ it('Email address', () => {
+
+ const Account = new AccountObjects()
+ Account.navigate()
+
+ })
+
+ //Test Case 2
+ it('Gender', () => {
+
+ const Account = new AccountObjects()
+ Account.navigate()
+
+
+ })
+
+ //Test Case 3
+ it('Display language (beta)', () => {
+
+ const Account = new AccountObjects()
+ Account.navigate()
+
+ })
+
+ //Test Case 4
+ it('Country', () => {
+
+ const Account = new AccountObjects()
+ Account.navigate()
+
+ })
+
+ //----------------------------------------CONNECTED ACCOUNTS Section----------------------------------------//
+ //Test Case 5
+ it('Connect to Twitter', () => {
+
+ const Account = new AccountObjects()
+ Account.navigate()
+
+ })
+
+ //Test Case 6
+ it('Connect to Apple', () => {
+
+ const Account = new AccountObjects()
+ Account.navigate()
+
+ })
+
+
+ //Test Case 7
+ it('Connected to Google', () => {
+
+ const Account = new AccountObjects()
+ Account.navigate()
+
+ })
+
+ //----------------------------------------BETA TESTS Section----------------------------------------//
+ //Test Case 8
+ it('Opt into beta tests', () => {
+
+ const Account = new AccountObjects()
+ Account.navigate()
+
+ })
+
+ //Test Case 9
+ it('Opt out of the redesign', () => {
+
+ const Account = new AccountObjects()
+ Account.navigate()
+
+ })
+
+ //----------------------------------------DELETE ACCOUNT Section----------------------------------------//
+ //Test Case 10
+ it('DELETE ACCOUNT', () => {
+
+ const Account = new AccountObjects()
+ Account.navigate()
+
+ })
+
+})
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/SettingsActions/ChatAndMessagingActions.cy.js b/cypress/e2e/SWE_PROJECT/SettingsActions/ChatAndMessagingActions.cy.js
new file mode 100644
index 0000000..56ebc57
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/SettingsActions/ChatAndMessagingActions.cy.js
@@ -0,0 +1,101 @@
+///
+
+import ChatAndMessagingObjects from "./cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/ChatAndMessagingObjects.cy"
+
+describe('Chat And Messaging Tab Tests', function () {
+
+
+
+ //Test Case 1
+ //TODO : NEED TO CHECK THE EFFECT OF EACH CHOICE LATER
+ it('Who can send you chat requests', () => {
+
+ const ChatAndMessaging = new ChatAndMessagingObjects()
+ ChatAndMessaging.navigate()
+
+ ChatAndMessaging.WhoCanSendYouChatRequests()
+ ChatAndMessaging.AccountsOlderThan30DaysChatRequests()
+ ChatAndMessaging.EveryOneChatRequests()
+ ChatAndMessaging.NoBodyChatRequests()
+
+ })
+
+ //Test Case 2
+ //TODO : NEED TO CHECK THE EFFECT OF EACH CHOICE LATER
+ it('Who can send you private messages', () => {
+
+ const ChatAndMessaging = new ChatAndMessagingObjects()
+ ChatAndMessaging.navigate()
+
+ ChatAndMessaging.WhoCanSendYouPrivateMessages()
+ ChatAndMessaging.EveryOnePrivateMessages()
+ ChatAndMessaging.NoBodyPrivateMessages()
+
+ })
+
+ //Test Case 3
+ //Click on Who can send you private messages and keep it open, then click on Who can send you chat requests ==> Who can send you private messages should be closed, otherwise bug
+ it('Who can send you private messages opened, THEN click on Who can send you chat requests', () => {
+
+ const ChatAndMessaging = new ChatAndMessagingObjects()
+ ChatAndMessaging.navigate()
+
+ ChatAndMessaging.WhoCanSendYouPrivateMessages()
+ ChatAndMessaging.WhoCanSendYouChatRequests()
+ ChatAndMessaging.InvisbleWhoCanSendYouPrivateMessages()
+
+ })
+
+ //Test Case 4
+ //Click on Who can send you chat requests and keep it open, then click on Who can send you private messages ==> Who can send you private messages should be closed, otherwise bug
+ it('Who can send you chat requests opened, THEN Who can send you private messages', () => {
+
+ const ChatAndMessaging = new ChatAndMessagingObjects()
+ ChatAndMessaging.navigate()
+
+ //TODO: [class=title] ==>need to be changed later ==> Who can send you chat requests
+ ChatAndMessaging.WhoCanSendYouChatRequests()
+ ChatAndMessaging.WhoCanSendYouPrivateMessages()
+ ChatAndMessaging.InvisbleWhoCanSendYouChatRequests()
+
+ })
+
+ //Test Case 5
+ // I choose nobody from Who can send you private messages, then i open Who can send you chat requests and keep it open
+ //Now I need to get the combo box of the Who can send you private messages ==> but it is invesible
+ it('choice nobody from Who can send you private messages,THEN open Who can send you chat requests and keep it open , THEN open Who can send you private messages', () => {
+
+ const ChatAndMessaging = new ChatAndMessagingObjects()
+ ChatAndMessaging.navigate()
+
+ ChatAndMessaging.WhoCanSendYouPrivateMessages()
+ ChatAndMessaging.NoBodyPrivateMessages()
+ ChatAndMessaging.WhoCanSendYouChatRequests()
+ ChatAndMessaging.WhoCanSendYouPrivateMessages()
+
+ })
+
+ //Test Case 6
+ //TODO: NEED TO CHECK THE EFFECT OF THE INVITATION TO A PERSON
+ it('Invite someone to chat', () => {
+
+ const ChatAndMessaging = new ChatAndMessagingObjects()
+ ChatAndMessaging.navigate()
+
+ ChatAndMessaging.InviteSomeoneToChat()
+
+ })
+
+ //Test Case 7
+ //TODO: NEED TO CHECK THE EFFECT OF THE MARK AS READ
+ it('Mark all as read', () => {
+
+ const ChatAndMessaging = new ChatAndMessagingObjects()
+ ChatAndMessaging.navigate()
+
+ ChatAndMessaging.MarkAllAsread()
+
+ })
+
+
+})
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/SettingsActions/EmailsActions.cy.js b/cypress/e2e/SWE_PROJECT/SettingsActions/EmailsActions.cy.js
new file mode 100644
index 0000000..7a21d58
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/SettingsActions/EmailsActions.cy.js
@@ -0,0 +1,129 @@
+///
+
+import EmailsObjects from "./cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/EmailsObjects.cy"
+
+//TODO: CHECK THE EFFECT OF ALL TEST CASES LATER
+
+describe('Emails Tab Tests', function () {
+
+ //----------------------------------------Messages Section----------------------------------------//
+ //Test Case 1
+ it('Inbox messages', () => {
+ const Emails = new EmailsObjects()
+ Emails.navigate()
+
+ Emails.InboxMessages()
+
+ })
+
+ //Test Case 2
+ it('Chat requests', () => {
+ const Emails = new EmailsObjects()
+ Emails.navigate()
+
+ Emails.ChatRequests()
+
+ })
+
+ //----------------------------------------Activity Section----------------------------------------//
+ //Test Case 3
+ it('New user welcome', () => {
+ const Emails = new EmailsObjects()
+ Emails.navigate()
+
+ Emails.NewUserWelcome()
+
+ })
+
+ //Test Case 4
+ it('Comments on your posts', () => {
+ const Emails = new EmailsObjects()
+ Emails.navigate()
+
+ Emails.CommentsOnYourPosts()
+
+ })
+
+ //Test Case 5
+ it('Replies to your comments', () => {
+ const Emails = new EmailsObjects()
+ Emails.navigate()
+
+ Emails.RepliesToYourComments()
+
+ })
+
+ //Test Case 6
+ it('Upvotes on your posts', () => {
+ const Emails = new EmailsObjects()
+ Emails.navigate()
+
+ Emails.UpvotesOnYourPosts()
+
+ })
+
+ //Test Case 7
+ it('Upvotes on your comments', () => {
+ const Emails = new EmailsObjects()
+ Emails.navigate()
+
+ Emails.UpvotesOnYourComments()
+
+ })
+
+ //Test Case 8
+ it('Username mentions', () => {
+ const Emails = new EmailsObjects()
+ Emails.navigate()
+
+ Emails.UsernameMentions()
+
+ })
+
+ //Test Case 9
+ it('New followers', () => {
+ const Emails = new EmailsObjects()
+ Emails.navigate()
+
+ Emails.NewFollowers()
+
+ })
+
+ //----------------------------------------NEWSLETTERS Section----------------------------------------//
+ //Test Case 10
+ it('Daily Digest', () => {
+ const Emails = new EmailsObjects()
+ Emails.navigate()
+
+ Emails.DailyDigest()
+
+ })
+
+ //Test Case 11
+ it('Weekly Recap', () => {
+ const Emails = new EmailsObjects()
+ Emails.navigate()
+
+ Emails.WeeklyRecap()
+
+ })
+
+ //Test Case 12
+ it('Community Discovery', () => {
+ const Emails = new EmailsObjects()
+ Emails.navigate()
+
+ Emails.CommunityDiscovery()
+
+ })
+
+ //Test Case 13
+ it('Unsubscribe from all emails', () => {
+ const Emails = new EmailsObjects()
+ Emails.navigate()
+
+ Emails.UnsubscribeFromAllEmails()
+
+ })
+
+})
diff --git a/cypress/e2e/SWE_PROJECT/SettingsActions/FeedSettingsActions.cy.js b/cypress/e2e/SWE_PROJECT/SettingsActions/FeedSettingsActions.cy.js
new file mode 100644
index 0000000..79fcbd2
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/SettingsActions/FeedSettingsActions.cy.js
@@ -0,0 +1,108 @@
+///
+
+import FeedSettingsObjects from "../PageObjects/SettingsObjects/FeedSettingsObjects.cy"
+
+describe('Feed Settings Tab Tests', function () {
+
+ //Test Case 1
+ it('Adult content', () => {
+
+ const FeedSettings = new FeedSettingsObjects()
+ FeedSettings.navigate()
+
+ FeedSettings.AdultContent()
+
+
+ })
+
+ //Test Case 2
+ it('Safe browsing mode', () => {
+
+ const FeedSettings = new FeedSettingsObjects()
+ FeedSettings.navigate()
+
+ FeedSettings.SafeBrowsingMode()
+ })
+
+ //Test Case 3
+ it('Enable home feed recommendations', () => {
+
+ const FeedSettings = new FeedSettingsObjects()
+ FeedSettings.navigate()
+
+ FeedSettings.EnableHomeFeedRecommendations()
+ })
+
+ //Test Case 4
+ it('Enable live recommendations', () => {
+
+ const FeedSettings = new FeedSettingsObjects()
+ FeedSettings.navigate()
+
+ FeedSettings.EnableLiveRecommendations()
+ })
+
+ //Test Case 5
+ it('Autoplay media', () => {
+
+ const FeedSettings = new FeedSettingsObjects()
+ FeedSettings.navigate()
+
+ FeedSettings.AutoplayMedia()
+ })
+
+ //Test Case 6
+ it('Reduce Animations', () => {
+
+ const FeedSettings = new FeedSettingsObjects()
+ FeedSettings.navigate()
+
+ FeedSettings.ReduceAnimations()
+ })
+
+ //Test Case 7
+ it('Community themes', () => {
+
+ const FeedSettings = new FeedSettingsObjects()
+ FeedSettings.navigate()
+
+ FeedSettings.CommunityThemes()
+ })
+
+ //Test Case 8
+ it('Community content sort', () => {
+
+ const FeedSettings = new FeedSettingsObjects()
+ FeedSettings.navigate()
+
+ FeedSettings.CommunityContentSort()
+ })
+
+ //Test Case 9
+ it('Remember per community', () => {
+
+ const FeedSettings = new FeedSettingsObjects()
+ FeedSettings.navigate()
+
+ FeedSettings.RememberPerCommunity()
+ })
+
+ //Test Case 10
+ it('Open posts in new tab', () => {
+
+ const FeedSettings = new FeedSettingsObjects()
+ FeedSettings.navigate()
+
+ FeedSettings.OpenPostsInNewTab()
+ })
+
+ //Test Case 11
+ it('Default to markdown', () => {
+
+ const FeedSettings = new FeedSettingsObjects()
+ FeedSettings.navigate()
+
+ FeedSettings.DefaultToMarkdown()
+ })
+
+})
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/SettingsActions/ProfileActions.cy.js b/cypress/e2e/SWE_PROJECT/SettingsActions/ProfileActions.cy.js
new file mode 100644
index 0000000..95ff086
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/SettingsActions/ProfileActions.cy.js
@@ -0,0 +1,113 @@
+///
+
+import ProfileObjects from "../PageObjects/SettingsObjects/ProfileObjects.cy"
+describe('Feed Settings Tab Tests', function () {
+
+ //----------------------------------------PROFILE INFORMATION Section----------------------------------------//
+ //Test Case 1
+ //NOTE: it will have effect without clicking on any button
+ it('Display name (optional)', () => {
+
+ const Profile = new ProfileObjects()
+ Profile.navigate()
+
+
+ })
+
+ //Test Case 2
+ it('About (optional)', () => {
+
+ const Profile = new ProfileObjects()
+ Profile.navigate()
+
+
+ })
+
+ //Test Case 3
+ it('Social links (5 max)', () => {
+
+ const Profile = new ProfileObjects()
+ Profile.navigate()
+
+
+ })
+
+ //----------------------------------------IMAGES Section----------------------------------------//
+
+ //Test Case 4
+ it('Profile picture', () => {
+
+ const Profile = new ProfileObjects()
+ Profile.navigate()
+
+
+ })
+
+ //Test Case 5
+ it('banner image', () => {
+
+ const Profile = new ProfileObjects()
+ Profile.navigate()
+
+
+ })
+
+ //Test Case 6
+ it('Profile picture and banner image', () => {
+
+ const Profile = new ProfileObjects()
+ Profile.navigate()
+
+
+ })
+
+ //----------------------------------------PROFILE CATEGORY Section----------------------------------------//
+
+ //Test Case 7
+ it('NSFW', () => {
+
+ const Profile = new ProfileObjects()
+ Profile.navigate()
+
+
+ })
+
+ //----------------------------------------ADVANCED Section----------------------------------------//
+ //Test Case 8
+ it('Allow people to follow you', () => {
+
+ const Profile = new ProfileObjects()
+ Profile.navigate()
+
+
+ })
+
+ //Test Case 9
+ it('Content visibility', () => {
+
+ const Profile = new ProfileObjects()
+ Profile.navigate()
+
+
+ })
+
+ //Test Case 10
+ it('Active in communities visibility', () => {
+
+ const Profile = new ProfileObjects()
+ Profile.navigate()
+
+
+ })
+
+ //----------------------------------------PROFILE MODERATION Section----------------------------------------//
+ //Test Case 11
+ it('Profile Moderation page', () => {
+
+ const Profile = new ProfileObjects()
+ Profile.navigate()
+
+
+ })
+
+})
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/SettingsActions/SafetyAndPrivacyActions.cy.js b/cypress/e2e/SWE_PROJECT/SettingsActions/SafetyAndPrivacyActions.cy.js
new file mode 100644
index 0000000..565dbde
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/SettingsActions/SafetyAndPrivacyActions.cy.js
@@ -0,0 +1,92 @@
+///
+
+import SafetyAndPrivacyObjects from "../PageObjects/SettingsObjects/SafetyAndPrivacyObjects.cy"
+
+describe('Safety And Privacy Settings Tab Tests', function () {
+
+ //Test Case 1
+ it(' Privacy & Security FAQs Hyper Link', () => {
+
+ const SafetyAndPrivacy = new SafetyAndPrivacyObjects()
+ SafetyAndPrivacy.navigate()
+
+ SafetyAndPrivacy
+
+ })
+
+ //----------------------------------------Safety Section----------------------------------------//
+
+ //Test Case 2
+ it('People You’ve Blocked - Block a User', () => {
+
+ const SafetyAndPrivacy = new SafetyAndPrivacyObjects()
+ SafetyAndPrivacy.navigate()
+
+ })
+
+ //Test Case 3
+ it('People You’ve Blocked - UnBlock(Remove) a User', () => {
+
+ const SafetyAndPrivacy = new SafetyAndPrivacyObjects()
+ SafetyAndPrivacy.navigate()
+
+ })
+
+ //----------------------------------------Privacy Section----------------------------------------//
+ //Test Case 4
+ it('Personalize all of Reddit based on the outbound links you click on', () => {
+
+ const SafetyAndPrivacy = new SafetyAndPrivacyObjects()
+ SafetyAndPrivacy.navigate()
+
+ })
+
+ //Test Case 5
+ it('Personalize ads based on information from our partners', () => {
+
+ const SafetyAndPrivacy = new SafetyAndPrivacyObjects()
+ SafetyAndPrivacy.navigate()
+
+ })
+
+ //Test Case 6
+ it('Personalize ads based on your activity with our partners', () => {
+
+ const SafetyAndPrivacy = new SafetyAndPrivacyObjects()
+ SafetyAndPrivacy.navigate()
+
+ })
+
+ //Test Case 7
+ it('Personalize recommendations based on your general location', () => {
+
+ const SafetyAndPrivacy = new SafetyAndPrivacyObjects()
+ SafetyAndPrivacy.navigate()
+
+ })
+
+ //Test Case 8
+ it('Personalize recommendations based on your activity with our partners', () => {
+
+ const SafetyAndPrivacy = new SafetyAndPrivacyObjects()
+ SafetyAndPrivacy.navigate()
+
+ })
+
+ //Test Case 9
+ it('Use two-factor authentication', () => {
+
+ const SafetyAndPrivacy = new SafetyAndPrivacyObjects()
+ SafetyAndPrivacy.navigate()
+
+ })
+
+ //Test Case 10
+ it('Manage third-party app authorization', () => {
+
+ const SafetyAndPrivacy = new SafetyAndPrivacyObjects()
+ SafetyAndPrivacy.navigate()
+
+ })
+
+})
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/SignUpActions/sign_up.cy.js b/cypress/e2e/SWE_PROJECT/SignUpActions/sign_up.cy.js
new file mode 100644
index 0000000..e9be82a
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/SignUpActions/sign_up.cy.js
@@ -0,0 +1,161 @@
+
+import signUpObjects from '../PageObjects/SignUpObjects/signUpObjects'
+
+describe('Test Sign up first form', () => {
+
+ //test visiting the sign_up page
+ beforeEach(() => {
+ // Since we want to visit the same URL at the start of all our tests,
+ // we include it in our beforeEach function so that it runs before each test
+ const signUp = new signUpObjects()
+ signUp.navigate()
+ })
+
+//---------------------------------------- first form --------------------------------------- //
+//filtered
+ // it('Press "CONTINUE" button with empty email', () => {
+ // const signUp = new signUpObjects()
+ // signUp.continue()
+ // //signUp.emailErrMsg('Looks like you've been doing that a lot. Take a break for 32 minutes before trying again.')
+ // signUp.goSecondForm()
+ // })
+
+//filtered
+ // it('Press "CONTINUE" button with empty email and with valid username and strong password then submit', () => {
+ // const signUp = new signUpObjects()
+ // signUp.continue()
+ // //signUp.goSecondForm()
+ // signUp.enterUserName('Samaa_hazem22fxggf')
+ // signUp.enterPassword('asdfghje123')
+ // signUp.signUpBotton()
+
+ // })
+
+ //filtered
+ //the error in the msg syntax
+ it('Without pressing "CONTINUE" with invalid email', () => {
+ const signUp = new signUpObjects()
+ signUp.enterEmail('hello')
+ //signUp.continue()
+ //filtered
+ //the error in the msg syntax
+ //signUp.emailErrMsg('Please fix your email to continue')
+ signUp.goNotSecondForm()
+
+ })
+
+ it('Press "CONTINUE" with invalid email', () => {
+ const signUp = new signUpObjects()
+ signUp.enterEmail('hello')
+ //signUp.emailErrMsg('Please fix your email to continue')
+ signUp.continue()
+ //filtered
+ //the error in the msg syntax
+ //signUp.emailErrMsg('That email is invalid')
+ signUp.goNotSecondForm()
+
+ })
+
+ it('Press "CONTINUE" with invalid email (with .com only)', () => {
+ const signUp = new signUpObjects()
+ signUp.enterEmail('hello.com')
+ signUp.continue()
+ //filtered
+ //the error in the msg syntax
+ //signUp.emailErrMsg('That email is invalid')
+ signUp.goNotSecondForm()
+
+ })
+
+ it('Press "CONTINUE" with invalid email (with @ only)', () => {
+ const signUp = new signUpObjects()
+ signUp.enterEmail('hello.com')
+ signUp.continue()
+ //filtered
+ //the error in the msg syntax
+ //signUp.emailErrMsg('That email is invalid')
+ signUp.goNotSecondForm()
+
+ })
+
+ it('Press "CONTINUE" with invalid email (with @ and .com)', () => {
+ const signUp = new signUpObjects()
+ signUp.enterEmail('hello.com')
+ signUp.continue()
+ //filtered
+ //the error in the msg syntax
+ //signUp.emailErrMsg('That email is invalid')
+ signUp.goNotSecondForm()
+
+ })
+
+ //weird: this will pass :-
+ it('Press "CONTINUE" with valid non-existing email', () => {
+ const signUp = new signUpObjects()
+ signUp.enterEmail('hello.dfghj@gmail.com')
+ signUp.continue()
+ //.emailErrMsg('That email is invalid')
+ signUp.goSecondForm()
+
+ })
+
+ it('Entering a valid email without pressing "CONTINUE"', () => {
+ const signUp = new signUpObjects()
+
+ signUp.enterEmail('sama.hazem22@gmail.com')
+ signUp.goNotSecondForm()
+ })
+
+ it('Entering a valid email and press the "CONTINUE" ', () => {
+ const signUp = new signUpObjects()
+ signUp.enterEmail('sama.hazem22@gmail.com')
+ signUp.continue()
+ signUp.goSecondForm()
+ })
+
+ //filtered
+ // it('Entering a valid email of an existing account', () => {
+ // const signUp = new signUpObjects()
+ // signUp.enterEmail('sama.hazem22@gmail.com')
+ // signUp.continue()
+ // signUp.goSecondForm()
+ // })
+
+ //########################################### linking with other pages #######################################
+ it('Click the "LOG IN" will load the Login page', () => {
+ const signUp = new signUpObjects()
+ signUp.loginPage()
+ signUp.urlChecker(Cypress.env('CYPRESSBASEURL') +'/login')
+ })
+
+ it('Clicking on the "User Agreement" will load the (User Agreement page)', () => {
+ const signUp = new signUpObjects()
+ signUp.userAgreementPage()
+ signUp.urlChecker('https://www.redditinc.com/policies/user-agreement')
+ })
+
+ it('Clicking on the "Privacy Policy" will load the (Privacy Policy)', () => {
+ const signUp = new signUpObjects()
+ signUp.privacyPolicyPage()
+ signUp.urlChecker('https://www.reddit.com/policies/privacy-policy')
+ })
+
+
+ // it.only('Entering a valid Email after alot of Failed attempts', () => {
+ // const signUp = new signUpObjects()
+ // signUp.enterEmail('sama.hazem22@gmail.com')
+ // signUp.continue()
+ // //signUp.emailErrMsg('Looks like you've been doing that a lot. Take a break for 32 minutes before trying again.')
+
+ // })
+
+ //?is this different ftom test2?
+ //?i think it should appear a different msg!!
+
+ // it.only('Check without "enter" with invalid Email', () => {
+ //const signUp = new signUpObjects()
+ // signUp.enterEmail('hello')
+ // signUp.emailErrMsg('Please fix your email to continue')
+
+ // })
+})
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/SignUpActions/sign_up_second_form.cy.js b/cypress/e2e/SWE_PROJECT/SignUpActions/sign_up_second_form.cy.js
new file mode 100644
index 0000000..3a9bce5
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/SignUpActions/sign_up_second_form.cy.js
@@ -0,0 +1,153 @@
+
+import signUpObjects from '../PageObjects/SignUpObjects/signUpObjects'
+
+describe('Test Sign up second form', () => {
+//NOTE:important : to test the second form , we temprory make special (continue) which called (contiuneTemporary) , but actually it should not pass any of this test cases
+ beforeEach(() => {
+ // Since we want to visit the same URL at the start of all our tests,
+ // we include it in our beforeEach function so that it runs before each test
+ const signUp = new signUpObjects()
+ signUp.navigate()
+ //before all cases here , we need to enter a valid Email to go to the second form
+ signUp.enterEmail('samaa.abdellatif975@gmail.com')
+ signUp.contiuneTemporary()
+ })
+
+ //-------------------------------------- second form --------------------------------------//
+
+ it('Back to first form', () => {
+ const signUp = new signUpObjects()
+ signUp.backButton()
+ signUp.goFirstForm()
+ })
+
+ //filtered
+ //the error in the msg syntax
+ // it('Enter invalid username(with space)', () => {
+ // const signUp = new signUpObjects()
+ // signUp.enterUserName('njkh khj j jkh')
+ // signUp.userNameErrMsg("Letters, numbers, dashes, and underscores only. Please try again without symbols.")
+ // })
+
+
+ //filtered
+ //the error in the msg syntax
+ // it('Enter invalid username(with # for example)', () => {
+ // const signUp = new signUpObjects()
+ // signUp.enterUserName('njkh#khjjjkh')
+ // signUp.userNameErrMsg("Letters, numbers, dashes, and underscores only. Please try again without symbols.")
+ // })
+
+//NOTE:it is Valid to enter a user name started with numbers
+ it('Enter valid username-start with numbers-', () => {
+ const signUp = new signUpObjects()
+ signUp.enterUserName('1256ftyfjv')
+ signUp.noUserNameErrMsg()
+ })
+
+ //filtered
+ //the error in the msg syntax
+ //NOTE:change the name (Samaa_Hazem) to a name that already exist in the database of the backend
+ // it('Enter an existed username', () => {
+ // const signUp = new signUpObjects()
+ // signUp.enterUserName('Samaa_Hazem')
+ // signUp.userNameErrMsg("That username is already taken")
+ // })
+
+ it('Enter a long username', () => {
+ const signUp = new signUpObjects()
+ signUp.enterUserName('Samaa_Hazem323knjk4kkl')
+ signUp.signUpNotDone()
+ signUp.userNameErrMsg("Username must be between 3 and 20 characters")
+ })
+
+//NOTE: the msg of empty password is same as the msg of short password!!
+ it('Enter valid username and empty password', () => {
+ const signUp = new signUpObjects()
+ signUp.enterUserName('Samaa_Hazem222')
+ //signUp.signUpEnable()
+ //signUp.signUpButton()
+ signUp.signUpNotDone()
+ //filtered
+ //the error in the msg syntax
+ //signUp.passwordErrMsg("Password must be at least 8 characters long")
+ })
+
+ it('Enter valid username and invalid -short- password', () => {
+ const signUp = new signUpObjects()
+ signUp.enterUserName('Samaa_Hazem222')
+ signUp.enterPassword('12')
+ // signUp.signUpEnable()
+ // signUp.signUpButton()
+ signUp.signUpNotDone()
+ //filtered
+ //the error in the msg syntax
+ //signUp.passwordErrMsg("Password must be at least 8 characters long")
+ })
+
+ it('Enter valid username and invalid -exactly(7)- character password', () => {
+ const signUp = new signUpObjects()
+ signUp.enterUserName('Samaa_Hazem222')
+ signUp.enterPassword('asdfghj')
+ // signUp.signUpEnable()
+ // signUp.signUpButton()
+ signUp.signUpNotDone()
+ //filtered
+ //the error in the msg syntax
+ //signUp.passwordErrMsg("Password must be at least 8 characters long")
+ })
+
+
+ it('Enter valid username and valid -exactly(8)- character password', () => {
+ const signUp = new signUpObjects()
+ signUp.enterUserName('Samaa_Hazem222')
+ signUp.enterPassword('asdfghje')
+ signUp.noPasswordErrMsg()
+ })
+
+ it('Enter valid username and valid -exactly(8)- character password and do not check robot', () => {
+ const signUp = new signUpObjects()
+ signUp.enterUserName('Samaa_Hazem222')
+ signUp.enterPassword('asdfghje')
+ // signUp.signUpEnable()
+ // signUp.signUpButton()
+ signUp.signUpNotDone()
+ })
+
+ //filtered
+ // it('Ability to click on (Sign up) without writing any thing', () => {
+ // const signUp = new signUpObjects()
+ // signUp.signUpEnable()
+ // })
+
+ //later:check not robot
+ // it('Enter invalid username and valid password and check robot then sign up', () => {
+ // const signUp = new signUpObjects()
+ // signUp.enterUserName('Samaa hazem2325')
+ // signUp.enterPassword('asdfghje')
+ // signUp.notRobot()
+ // // signUp.signUpEnable()
+ // // signUp.signUpButton()
+ // signUp.signUpNotDone()
+ // signUp.userNameErrMsg("Letters, numbers, dashes, and underscores only. Please try again without symbols.")
+ // })
+
+ // //NOTE:is it a bug as after writing password the robot checker appeares in original cypress, but here , it needs to click any where first!!
+ // it('Enter valid username and valid password and check robot then sign up', () => {
+ // const signUp = new signUpObjects()
+ // signUp.enterUserName('Samaa_hazem22')
+ // signUp.enterPassword('asdfghje')
+ // signUp.notRobot()
+ // // signUp.signUpEnable()
+ // // signUp.signUpButton()
+ // signUp.signUpDone()
+ // })
+
+ //later:update username suggestions checker:
+ // it('Choose one of username suggestions', () => {
+ // const signUp = new signUpObjects()
+ // signUp.firstUsernameSugg()
+ // signUp.checkUsername()
+ // })
+
+})
\ No newline at end of file
diff --git a/cypress/e2e/SWE_PROJECT/UserProfileActions/userProfile.cy.js b/cypress/e2e/SWE_PROJECT/UserProfileActions/userProfile.cy.js
new file mode 100644
index 0000000..951fa9a
--- /dev/null
+++ b/cypress/e2e/SWE_PROJECT/UserProfileActions/userProfile.cy.js
@@ -0,0 +1,196 @@
+
+import userProfileObject from '../PageObjects/UserProfileObjects/userProfileObject'
+
+describe('Test user profile page', () => {
+
+ //test visiting the user Profile page
+ beforeEach(() => {
+ // Since we want to visit the same URL at the start of all our tests,
+ // we include it in our beforeEach function so that it runs before each test
+ const userProfile = new userProfileObject()
+ userProfile.navigate()
+ })
+
+ // ################################################# linking between user profile and other pages #################################################
+
+ it('Check opening (OVERVIEW) page', () => {
+ const userProfile = new userProfileObject()
+ userProfile.overview()
+ userProfile.overviewPage()
+ })
+
+ it('Check opening (POSTS) page', () => {
+ const userProfile = new userProfileObject()
+ userProfile.posts()
+ userProfile.postsPage()
+ })
+
+ it('Check opening (COMMENTS) page', () => {
+ const userProfile = new userProfileObject()
+ userProfile.comments()
+ userProfile.commentsPage()
+ })
+
+ it('Check opening (HISTORY) page', () => {
+ const userProfile = new userProfileObject()
+ userProfile.history()
+ userProfile.historyPage()
+ })
+
+ it('Check opening (HIDDEN) page', () => {
+ const userProfile = new userProfileObject()
+ userProfile.hidden()
+ userProfile.hiddenPage()
+ })
+
+ it('Check opening (SAVED) page', () => {
+ const userProfile = new userProfileObject()
+ userProfile.saved()
+ userProfile.savedPage()
+ })
+
+ it('Check opening (UPvoted) page', () => {
+ const userProfile = new userProfileObject()
+ userProfile.upvoted()
+ userProfile.upvotedPage()
+ })
+
+ it('Check opening (DOWNVOTED) page', () => {
+ const userProfile = new userProfileObject()
+ userProfile.downvoted()
+ userProfile.downvotedPage()
+ })
+
+ it('Check opening (AWARDS RECEIVED) page', () => {
+ const userProfile = new userProfileObject()
+ userProfile.awardsReceived()
+ userProfile.awardsReceivedPage()
+ })
+
+ it('Check opening (AWARDS GIVEN) page', () => {
+ const userProfile = new userProfileObject()
+ userProfile.awardsGiven()
+ userProfile.awardsGivenPage()
+ })
+
+ it('Check opening (create post) page', () => {
+ const userProfile = new userProfileObject()
+ userProfile.newPost()
+ userProfile.createPostPage()
+ })
+
+ it('Check opening (settings) page', () => {
+ const userProfile = new userProfileObject()
+ userProfile.goSettings()
+ userProfile.settingsPage()
+ })
+
+ it('Check opening (Home) page', () => {
+ const userProfile = new userProfileObject()
+ userProfile.goHome()
+ userProfile.HomePage()
+ })
+
+ // ################################################# profile options #################################################
+
+ it('View more options in right side bar', () => {
+ const userProfile = new userProfileObject()
+ userProfile.moreOptions()
+ //?later: how to check that the options appeared?
+ })
+
+ it('View more options in right side bar', () => {
+ const userProfile = new userProfileObject()
+ //NOTE: to test (fewer options) you have to click on more options first
+ userProfile.moreOptions()
+ //?later: how to check that the options appeared?
+ userProfile.fewerOptions()
+ })
+
+ it('Ability to find profile moderation option', () => {
+ const userProfile = new userProfileObject()
+ userProfile.moreOptions()
+ userProfile.profileModeration()
+ })
+
+ it('Ability to find add to custom feed option', () => {
+ const userProfile = new userProfileObject()
+ userProfile.moreOptions()
+ userProfile.addCustomFeed()
+ })
+
+ it('Ability to find invite someone to chat option', () => {
+ const userProfile = new userProfileObject()
+ userProfile.moreOptions()
+ userProfile.inviteSomeoneToChat()
+ })
+
+ it('Check profile moderation option', () => {
+ const userProfile = new userProfileObject()
+ userProfile.moreOptions()
+ userProfile.profileModeration()
+ userProfile.profileModerationPage()
+ })
+
+ it('Check add to custom feed option', () => {
+ const userProfile = new userProfileObject()
+ userProfile.moreOptions()
+ userProfile.addCustomFeed()
+ //?later: check the responce after click on addToCustomFeed
+ })
+
+ it('Check invite someone to chat option', () => {
+ const userProfile = new userProfileObject()
+ userProfile.moreOptions()
+ userProfile.inviteSomeoneToChat()
+ userProfile.inviteSomeoneMsgSyntax()
+ })
+
+ it('Check (x) in the message of invite someone to chat', () => {
+ const userProfile = new userProfileObject()
+ userProfile.moreOptions()
+ userProfile.inviteSomeoneToChat()
+ userProfile.inviteSomeoneMsgSyntax()
+ userProfile.msgCancelbyX()
+ })
+
+ it('Check syntax of (profile moderation) option', () => {
+ const userProfile = new userProfileObject()
+ userProfile.moreOptions()
+ userProfile.profileModerationSyntax()
+ })
+
+ it('Check syntax of (add to custom feed) option', () => {
+ const userProfile = new userProfileObject()
+ userProfile.moreOptions()
+ userProfile.addCustomFeedSyntax()
+ })
+
+ it('Check syntax of (invite someone to chat) option', () => {
+ const userProfile = new userProfileObject()
+ userProfile.moreOptions()
+ userProfile.inviteSomeoneToChatSyntax()
+ })
+
+// ################################################# Right side bar #################################################
+
+ it('Join a community by pewssing (join) button', () => {
+ const userProfile = new userProfileObject()
+ userProfile.joinAndUnjoin()
+ //?later:how to check that we are joined the community?
+ })
+
+ //later
+ // it('Check loading the community page when clicking on its url beside its (join) button', () => {
+ // const userProfile = new userProfileObject()
+ // userProfile.goToCommunity()
+ // userProfile.communityPage()
+ // })
+
+ it('Check loading the main user profile page when clicking on his url under his profile name', () => {
+ const userProfile = new userProfileObject()
+ userProfile.usernameUrl()
+ userProfile.overviewPage()
+ })
+
+})
\ No newline at end of file
diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json
new file mode 100644
index 0000000..02e4254
--- /dev/null
+++ b/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/cypress/fixtures/test1.jpeg b/cypress/fixtures/test1.jpeg
new file mode 100644
index 0000000..fc5e798
Binary files /dev/null and b/cypress/fixtures/test1.jpeg differ
diff --git a/cypress/output.html b/cypress/output.html
new file mode 100644
index 0000000..c3f5cf6
--- /dev/null
+++ b/cypress/output.html
@@ -0,0 +1,17 @@
+
+Mochawesome Report
\ No newline at end of file
diff --git a/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Forget Password (failed).png b/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Forget Password (failed).png
new file mode 100644
index 0000000..8314225
Binary files /dev/null and b/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Forget Password (failed).png differ
diff --git a/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Forget Password then click on help (failed).png b/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Forget Password then click on help (failed).png
new file mode 100644
index 0000000..dd40734
Binary files /dev/null and b/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Forget Password then click on help (failed).png differ
diff --git a/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Write Invalid Email - should appear error message (failed).png b/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Write Invalid Email - should appear error message (failed).png
new file mode 100644
index 0000000..94431f5
Binary files /dev/null and b/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Write Invalid Email - should appear error message (failed).png differ
diff --git a/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Write Valid Email - should not appear error message (failed).png b/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Write Valid Email - should not appear error message (failed).png
new file mode 100644
index 0000000..eef32f8
Binary files /dev/null and b/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Write Valid Email - should not appear error message (failed).png differ
diff --git a/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Click on Reset Button With empty passwords (failed).png b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Click on Reset Button With empty passwords (failed).png
new file mode 100644
index 0000000..85c3dd9
Binary files /dev/null and b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Click on Reset Button With empty passwords (failed).png differ
diff --git a/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Enter Password then click on Sign In then return to Reset Password Page (failed).png b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Enter Password then click on Sign In then return to Reset Password Page (failed).png
new file mode 100644
index 0000000..80cc136
Binary files /dev/null and b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Enter Password then click on Sign In then return to Reset Password Page (failed).png differ
diff --git a/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Enter Password then click on Sign Up then return to Reset Password Page (failed).png b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Enter Password then click on Sign Up then return to Reset Password Page (failed).png
new file mode 100644
index 0000000..77836b0
Binary files /dev/null and b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Enter Password then click on Sign Up then return to Reset Password Page (failed).png differ
diff --git a/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with different length (failed).png b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with different length (failed).png
new file mode 100644
index 0000000..b3ad88d
Binary files /dev/null and b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with different length (failed).png differ
diff --git a/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with same length and different content (failed).png b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with same length and different content (failed).png
new file mode 100644
index 0000000..7d42fde
Binary files /dev/null and b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with same length and different content (failed).png differ
diff --git a/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with same length and same content (failed).png b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with same length and same content (failed).png
new file mode 100644
index 0000000..08e2e9e
Binary files /dev/null and b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with same length and same content (failed).png differ
diff --git a/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Verify the title of the page (failed).png b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Verify the title of the page (failed).png
new file mode 100644
index 0000000..674f6ba
Binary files /dev/null and b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Verify the title of the page (failed).png differ
diff --git a/cypress/screenshots/LoginActions/login.cy.js/Test Login -- Clicking on the User Agreement will load the (User Agreement page) (failed).png b/cypress/screenshots/LoginActions/login.cy.js/Test Login -- Clicking on the User Agreement will load the (User Agreement page) (failed).png
new file mode 100644
index 0000000..b28b0b2
Binary files /dev/null and b/cypress/screenshots/LoginActions/login.cy.js/Test Login -- Clicking on the User Agreement will load the (User Agreement page) (failed).png differ
diff --git a/cypress/screenshots/LoginActions/login.cy.js/Test Login -- Valid password with valid username (failed).png b/cypress/screenshots/LoginActions/login.cy.js/Test Login -- Valid password with valid username (failed).png
new file mode 100644
index 0000000..7a66baf
Binary files /dev/null and b/cypress/screenshots/LoginActions/login.cy.js/Test Login -- Valid password with valid username (failed).png differ
diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of hiding post message and its syntax (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of hiding post message and its syntax (failed).png
new file mode 100644
index 0000000..0f5ee33
Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of hiding post message and its syntax (failed).png differ
diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of saving post message and its syntax (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of saving post message and its syntax (failed).png
new file mode 100644
index 0000000..8ea73e9
Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of saving post message and its syntax (failed).png differ
diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of unsaving post message and its syntax (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of unsaving post message and its syntax (failed).png
new file mode 100644
index 0000000..f7682f7
Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of unsaving post message and its syntax (failed).png differ
diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check downvoted post in DOWNVOTE page in user profile (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check downvoted post in DOWNVOTE page in user profile (failed).png
new file mode 100644
index 0000000..a16a8aa
Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check downvoted post in DOWNVOTE page in user profile (failed).png differ
diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check hiding arbitrary post in (HIDDEN) page in user profile (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check hiding arbitrary post in (HIDDEN) page in user profile (failed).png
new file mode 100644
index 0000000..0fe1564
Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check hiding arbitrary post in (HIDDEN) page in user profile (failed).png differ
diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in hiding post message (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in hiding post message (failed).png
new file mode 100644
index 0000000..aac8064
Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in hiding post message (failed).png differ
diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in saving post message (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in saving post message (failed).png
new file mode 100644
index 0000000..21ac8a5
Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in saving post message (failed).png differ
diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in unsaving post message (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in unsaving post message (failed).png
new file mode 100644
index 0000000..a186d72
Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in unsaving post message (failed).png differ
diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check saving arbitrary post in (SAVED) page in user profile (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check saving arbitrary post in (SAVED) page in user profile (failed).png
new file mode 100644
index 0000000..bedcaec
Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check saving arbitrary post in (SAVED) page in user profile (failed).png differ
diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check saving post in (SAVED) page in user profile after click on (Undo) in unsave message (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check saving post in (SAVED) page in user profile after click on (Undo) in unsave message (failed).png
new file mode 100644
index 0000000..755c6b2
Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check saving post in (SAVED) page in user profile after click on (Undo) in unsave message (failed).png differ
diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check unsaving post in (SAVED) page in user profile after click on (Undo) in save message (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check unsaving post in (SAVED) page in user profile after click on (Undo) in save message (failed).png
new file mode 100644
index 0000000..e2d07c6
Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check unsaving post in (SAVED) page in user profile after click on (Undo) in save message (failed).png differ
diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check upvoted post in UPVOTE page in user profile (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check upvoted post in UPVOTE page in user profile (failed).png
new file mode 100644
index 0000000..5c168be
Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check upvoted post in UPVOTE page in user profile (failed).png differ
diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Disappearance of a hidden home post in home page (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Disappearance of a hidden home post in home page (failed).png
new file mode 100644
index 0000000..330496a
Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Disappearance of a hidden home post in home page (failed).png differ
diff --git a/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you chat requests (failed).png b/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you chat requests (failed).png
new file mode 100644
index 0000000..717f8e2
Binary files /dev/null and b/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you chat requests (failed).png differ
diff --git a/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you chat requests opened, THEN Who can send you private messages (failed).png b/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you chat requests opened, THEN Who can send you private messages (failed).png
new file mode 100644
index 0000000..17e457f
Binary files /dev/null and b/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you chat requests opened, THEN Who can send you private messages (failed).png differ
diff --git a/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you private messages (failed).png b/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you private messages (failed).png
new file mode 100644
index 0000000..1199f50
Binary files /dev/null and b/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you private messages (failed).png differ
diff --git a/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you private messages opened, THEN click on Who can send you chat requests (failed).png b/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you private messages opened, THEN click on Who can send you chat requests (failed).png
new file mode 100644
index 0000000..dcbf563
Binary files /dev/null and b/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you private messages opened, THEN click on Who can send you chat requests (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Entering a valid email and press the CONTINUE (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Entering a valid email and press the CONTINUE (failed).png
new file mode 100644
index 0000000..15219bd
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Entering a valid email and press the CONTINUE (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Entering a valid email of an existing account (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Entering a valid email of an existing account (failed).png
new file mode 100644
index 0000000..8019439
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Entering a valid email of an existing account (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE button with empty email (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE button with empty email (failed).png
new file mode 100644
index 0000000..e48e204
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE button with empty email (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE button with empty email and with valid username and strong password then submit (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE button with empty email and with valid username and strong password then submit (failed).png
new file mode 100644
index 0000000..b0715e8
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE button with empty email and with valid username and strong password then submit (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (failed).png
new file mode 100644
index 0000000..90728de
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with .com only) (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with .com only) (failed).png
new file mode 100644
index 0000000..62ed44f
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with .com only) (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with @ and .com) (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with @ and .com) (failed).png
new file mode 100644
index 0000000..33d29d7
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with @ and .com) (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with @ only) (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with @ only) (failed).png
new file mode 100644
index 0000000..0605c6c
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with @ only) (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with valid non-existing email (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with valid non-existing email (failed).png
new file mode 100644
index 0000000..87e448a
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with valid non-existing email (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Ability to click on (Sign up) without writing any thing (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Ability to click on (Sign up) without writing any thing (failed).png
new file mode 100644
index 0000000..37eb864
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Ability to click on (Sign up) without writing any thing (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Choose one of username suggestions (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Choose one of username suggestions (failed).png
new file mode 100644
index 0000000..5262e5e
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Choose one of username suggestions (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter an existed username (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter an existed username (failed).png
new file mode 100644
index 0000000..4a1a547
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter an existed username (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username and valid password and check robot then sign up (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username and valid password and check robot then sign up (failed).png
new file mode 100644
index 0000000..acd1b0f
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username and valid password and check robot then sign up (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username(with # for example) (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username(with # for example) (failed).png
new file mode 100644
index 0000000..832c9d7
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username(with # for example) (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username(with space) (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username(with space) (failed).png
new file mode 100644
index 0000000..965a30f
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username(with space) (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and invalid -short- password (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and invalid -short- password (failed).png
new file mode 100644
index 0000000..db8d8e3
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and invalid -short- password (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and empty password (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and empty password (failed).png
new file mode 100644
index 0000000..56ac88d
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and empty password (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and invalid -exactly(7)- character password (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and invalid -exactly(7)- character password (failed).png
new file mode 100644
index 0000000..604c0c0
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and invalid -exactly(7)- character password (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and valid -exactly(8)- character password and do not check robot (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and valid -exactly(8)- character password and do not check robot (failed).png
new file mode 100644
index 0000000..9f2d42b
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and valid -exactly(8)- character password and do not check robot (failed).png differ
diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and valid password and immeditly check robot then sign up (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and valid password and immeditly check robot then sign up (failed).png
new file mode 100644
index 0000000..882f470
Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and valid password and immeditly check robot then sign up (failed).png differ
diff --git a/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check (x) in the message of invite someone to chat (failed).png b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check (x) in the message of invite someone to chat (failed).png
new file mode 100644
index 0000000..91b5181
Binary files /dev/null and b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check (x) in the message of invite someone to chat (failed).png differ
diff --git a/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check invite someone to chat option (failed).png b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check invite someone to chat option (failed).png
new file mode 100644
index 0000000..5cdec90
Binary files /dev/null and b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check invite someone to chat option (failed).png differ
diff --git a/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (AWARDS GIVEN) page (failed).png b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (AWARDS GIVEN) page (failed).png
new file mode 100644
index 0000000..c82177a
Binary files /dev/null and b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (AWARDS GIVEN) page (failed).png differ
diff --git a/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (AWARDS RECEIVED) page (failed).png b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (AWARDS RECEIVED) page (failed).png
new file mode 100644
index 0000000..937e072
Binary files /dev/null and b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (AWARDS RECEIVED) page (failed).png differ
diff --git a/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (DOWNVOTED) page (failed).png b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (DOWNVOTED) page (failed).png
new file mode 100644
index 0000000..4f99447
Binary files /dev/null and b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (DOWNVOTED) page (failed).png differ
diff --git a/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (Home) page (failed).png b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (Home) page (failed).png
new file mode 100644
index 0000000..51c2293
Binary files /dev/null and b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (Home) page (failed).png differ
diff --git a/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (create post) page (failed).png b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (create post) page (failed).png
new file mode 100644
index 0000000..4b21171
Binary files /dev/null and b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (create post) page (failed).png differ
diff --git a/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check syntax of (profile moderation) option (failed).png b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check syntax of (profile moderation) option (failed).png
new file mode 100644
index 0000000..d205a25
Binary files /dev/null and b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check syntax of (profile moderation) option (failed).png differ
diff --git a/cypress/support/commands.js b/cypress/support/commands.js
new file mode 100644
index 0000000..66ea16e
--- /dev/null
+++ b/cypress/support/commands.js
@@ -0,0 +1,25 @@
+// ***********************************************
+// This example commands.js shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
\ No newline at end of file
diff --git a/cypress/support/e2e.js b/cypress/support/e2e.js
new file mode 100644
index 0000000..0e7290a
--- /dev/null
+++ b/cypress/support/e2e.js
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/e2e.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
\ No newline at end of file
diff --git a/cypress/videos/ForgetActions/ForgetPasswordActions.cy.js.mp4 b/cypress/videos/ForgetActions/ForgetPasswordActions.cy.js.mp4
new file mode 100644
index 0000000..bd02d3f
Binary files /dev/null and b/cypress/videos/ForgetActions/ForgetPasswordActions.cy.js.mp4 differ
diff --git a/cypress/videos/ForgetActions/ResetPasswordActions.cy.js.mp4 b/cypress/videos/ForgetActions/ResetPasswordActions.cy.js.mp4
new file mode 100644
index 0000000..2fc5ccd
Binary files /dev/null and b/cypress/videos/ForgetActions/ResetPasswordActions.cy.js.mp4 differ
diff --git a/cypress/videos/HomePageActions/BackToTopButton.cy.js.mp4 b/cypress/videos/HomePageActions/BackToTopButton.cy.js.mp4
new file mode 100644
index 0000000..5e288d6
Binary files /dev/null and b/cypress/videos/HomePageActions/BackToTopButton.cy.js.mp4 differ
diff --git a/cypress/videos/LoginActions/login.cy.js.mp4 b/cypress/videos/LoginActions/login.cy.js.mp4
new file mode 100644
index 0000000..12e34ea
Binary files /dev/null and b/cypress/videos/LoginActions/login.cy.js.mp4 differ
diff --git a/cypress/videos/PageObjects/ForgetObjects/ForgetUserNameObjects.cy.js.mp4 b/cypress/videos/PageObjects/ForgetObjects/ForgetUserNameObjects.cy.js.mp4
new file mode 100644
index 0000000..f68babe
Binary files /dev/null and b/cypress/videos/PageObjects/ForgetObjects/ForgetUserNameObjects.cy.js.mp4 differ
diff --git a/cypress/videos/PageObjects/ForgetObjects/ResetPasswordObjects.cy.js.mp4 b/cypress/videos/PageObjects/ForgetObjects/ResetPasswordObjects.cy.js.mp4
new file mode 100644
index 0000000..fbdd016
Binary files /dev/null and b/cypress/videos/PageObjects/ForgetObjects/ResetPasswordObjects.cy.js.mp4 differ
diff --git a/cypress/videos/PageObjects/HomeObjects/BackToTopButtonObjects.cy.js.mp4 b/cypress/videos/PageObjects/HomeObjects/BackToTopButtonObjects.cy.js.mp4
new file mode 100644
index 0000000..ad17d45
Binary files /dev/null and b/cypress/videos/PageObjects/HomeObjects/BackToTopButtonObjects.cy.js.mp4 differ
diff --git a/cypress/videos/PageObjects/SettingsObjects/AccountObjects.cy.js.mp4 b/cypress/videos/PageObjects/SettingsObjects/AccountObjects.cy.js.mp4
new file mode 100644
index 0000000..d11a3f6
Binary files /dev/null and b/cypress/videos/PageObjects/SettingsObjects/AccountObjects.cy.js.mp4 differ
diff --git a/cypress/videos/PageObjects/SettingsObjects/ChatAndMessagingObjects.cy.js.mp4 b/cypress/videos/PageObjects/SettingsObjects/ChatAndMessagingObjects.cy.js.mp4
new file mode 100644
index 0000000..94f9922
Binary files /dev/null and b/cypress/videos/PageObjects/SettingsObjects/ChatAndMessagingObjects.cy.js.mp4 differ
diff --git a/cypress/videos/PageObjects/SettingsObjects/EmailsObjects.cy.js.mp4 b/cypress/videos/PageObjects/SettingsObjects/EmailsObjects.cy.js.mp4
new file mode 100644
index 0000000..6facc7e
Binary files /dev/null and b/cypress/videos/PageObjects/SettingsObjects/EmailsObjects.cy.js.mp4 differ
diff --git a/cypress/videos/PageObjects/SettingsObjects/FeedSettingsObjects.cy.js.mp4 b/cypress/videos/PageObjects/SettingsObjects/FeedSettingsObjects.cy.js.mp4
new file mode 100644
index 0000000..bfea428
Binary files /dev/null and b/cypress/videos/PageObjects/SettingsObjects/FeedSettingsObjects.cy.js.mp4 differ
diff --git a/cypress/videos/PageObjects/SettingsObjects/ProfileObjects.cy.js.mp4 b/cypress/videos/PageObjects/SettingsObjects/ProfileObjects.cy.js.mp4
new file mode 100644
index 0000000..c552137
Binary files /dev/null and b/cypress/videos/PageObjects/SettingsObjects/ProfileObjects.cy.js.mp4 differ
diff --git a/cypress/videos/PageObjects/SettingsObjects/SafetyAndPrivacyObjects.cy.js.mp4 b/cypress/videos/PageObjects/SettingsObjects/SafetyAndPrivacyObjects.cy.js.mp4
new file mode 100644
index 0000000..5539274
Binary files /dev/null and b/cypress/videos/PageObjects/SettingsObjects/SafetyAndPrivacyObjects.cy.js.mp4 differ
diff --git a/cypress/videos/PostActions/createPost.cy.js.mp4 b/cypress/videos/PostActions/createPost.cy.js.mp4
new file mode 100644
index 0000000..18fa79a
Binary files /dev/null and b/cypress/videos/PostActions/createPost.cy.js.mp4 differ
diff --git a/cypress/videos/PostActions/postAction.cy.js.mp4 b/cypress/videos/PostActions/postAction.cy.js.mp4
new file mode 100644
index 0000000..68ad412
Binary files /dev/null and b/cypress/videos/PostActions/postAction.cy.js.mp4 differ
diff --git a/cypress/videos/SettingsActions/AccountActions.cy.js.mp4 b/cypress/videos/SettingsActions/AccountActions.cy.js.mp4
new file mode 100644
index 0000000..444bfab
Binary files /dev/null and b/cypress/videos/SettingsActions/AccountActions.cy.js.mp4 differ
diff --git a/cypress/videos/SettingsActions/ChatAndMessagingActions.cy.js.mp4 b/cypress/videos/SettingsActions/ChatAndMessagingActions.cy.js.mp4
new file mode 100644
index 0000000..1d87ff8
Binary files /dev/null and b/cypress/videos/SettingsActions/ChatAndMessagingActions.cy.js.mp4 differ
diff --git a/cypress/videos/SettingsActions/EmailsActions.cy.js.mp4 b/cypress/videos/SettingsActions/EmailsActions.cy.js.mp4
new file mode 100644
index 0000000..2bf49e3
Binary files /dev/null and b/cypress/videos/SettingsActions/EmailsActions.cy.js.mp4 differ
diff --git a/cypress/videos/SettingsActions/FeedSettingsActions.cy.js.mp4 b/cypress/videos/SettingsActions/FeedSettingsActions.cy.js.mp4
new file mode 100644
index 0000000..7a9c5ec
Binary files /dev/null and b/cypress/videos/SettingsActions/FeedSettingsActions.cy.js.mp4 differ
diff --git a/cypress/videos/SettingsActions/ProfileActions.cy.js.mp4 b/cypress/videos/SettingsActions/ProfileActions.cy.js.mp4
new file mode 100644
index 0000000..2a6c3a9
Binary files /dev/null and b/cypress/videos/SettingsActions/ProfileActions.cy.js.mp4 differ
diff --git a/cypress/videos/SettingsActions/SafetyAndPrivacyActions.cy.js.mp4 b/cypress/videos/SettingsActions/SafetyAndPrivacyActions.cy.js.mp4
new file mode 100644
index 0000000..f885a69
Binary files /dev/null and b/cypress/videos/SettingsActions/SafetyAndPrivacyActions.cy.js.mp4 differ
diff --git a/cypress/videos/SignUpActions/sign_up.cy.js.mp4 b/cypress/videos/SignUpActions/sign_up.cy.js.mp4
new file mode 100644
index 0000000..16789b4
Binary files /dev/null and b/cypress/videos/SignUpActions/sign_up.cy.js.mp4 differ
diff --git a/cypress/videos/SignUpActions/sign_up_second_form.cy.js.mp4 b/cypress/videos/SignUpActions/sign_up_second_form.cy.js.mp4
new file mode 100644
index 0000000..699cbf0
Binary files /dev/null and b/cypress/videos/SignUpActions/sign_up_second_form.cy.js.mp4 differ
diff --git a/cypress/videos/UserProfileActions/userProfile.cy.js.mp4 b/cypress/videos/UserProfileActions/userProfile.cy.js.mp4
new file mode 100644
index 0000000..de4d030
Binary files /dev/null and b/cypress/videos/UserProfileActions/userProfile.cy.js.mp4 differ
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..1d19b86
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,3173 @@
+{
+ "name": "Desktop",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "devDependencies": {
+ "cypress": "^10.11.0"
+ }
+ },
+ "node_modules/@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@cypress/request": {
+ "version": "2.88.10",
+ "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz",
+ "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==",
+ "dev": true,
+ "dependencies": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "http-signature": "~1.3.6",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@cypress/xvfb": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
+ "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^3.1.0",
+ "lodash.once": "^4.1.1"
+ }
+ },
+ "node_modules/@cypress/xvfb/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "14.18.33",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz",
+ "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==",
+ "dev": true
+ },
+ "node_modules/@types/sinonjs__fake-timers": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
+ "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
+ "dev": true
+ },
+ "node_modules/@types/sizzle": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz",
+ "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==",
+ "dev": true
+ },
+ "node_modules/@types/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dev": true,
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/arch": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
+ "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/asn1": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "node_modules/assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
+ "dev": true
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/aws4": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
+ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
+ "dev": true
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+ "dev": true,
+ "dependencies": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "node_modules/blob-util": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
+ "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
+ "dev": true
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/cachedir": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz",
+ "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
+ "dev": true
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/check-more-types": {
+ "version": "2.24.0",
+ "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
+ "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz",
+ "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==",
+ "dev": true
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-table3": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
+ "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": "10.* || >= 12.*"
+ },
+ "optionalDependencies": {
+ "@colors/colors": "1.5.0"
+ }
+ },
+ "node_modules/cli-truncate": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+ "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+ "dev": true,
+ "dependencies": {
+ "slice-ansi": "^3.0.0",
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/colorette": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
+ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
+ "dev": true
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/common-tags": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
+ "dev": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cypress": {
+ "version": "10.11.0",
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.11.0.tgz",
+ "integrity": "sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "@cypress/request": "^2.88.10",
+ "@cypress/xvfb": "^1.2.4",
+ "@types/node": "^14.14.31",
+ "@types/sinonjs__fake-timers": "8.1.1",
+ "@types/sizzle": "^2.3.2",
+ "arch": "^2.2.0",
+ "blob-util": "^2.0.2",
+ "bluebird": "^3.7.2",
+ "buffer": "^5.6.0",
+ "cachedir": "^2.3.0",
+ "chalk": "^4.1.0",
+ "check-more-types": "^2.24.0",
+ "cli-cursor": "^3.1.0",
+ "cli-table3": "~0.6.1",
+ "commander": "^5.1.0",
+ "common-tags": "^1.8.0",
+ "dayjs": "^1.10.4",
+ "debug": "^4.3.2",
+ "enquirer": "^2.3.6",
+ "eventemitter2": "6.4.7",
+ "execa": "4.1.0",
+ "executable": "^4.1.1",
+ "extract-zip": "2.0.1",
+ "figures": "^3.2.0",
+ "fs-extra": "^9.1.0",
+ "getos": "^3.2.1",
+ "is-ci": "^3.0.0",
+ "is-installed-globally": "~0.4.0",
+ "lazy-ass": "^1.6.0",
+ "listr2": "^3.8.3",
+ "lodash": "^4.17.21",
+ "log-symbols": "^4.0.0",
+ "minimist": "^1.2.6",
+ "ospath": "^1.2.2",
+ "pretty-bytes": "^5.6.0",
+ "proxy-from-env": "1.0.0",
+ "request-progress": "^3.0.0",
+ "semver": "^7.3.2",
+ "supports-color": "^8.1.1",
+ "tmp": "~0.2.1",
+ "untildify": "^4.0.0",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "cypress": "bin/cypress"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz",
+ "integrity": "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ==",
+ "dev": true
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+ "dev": true,
+ "dependencies": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eventemitter2": {
+ "version": "6.4.7",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
+ "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
+ "dev": true
+ },
+ "node_modules/execa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
+ "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "get-stream": "^5.0.0",
+ "human-signals": "^1.1.1",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.0",
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/executable": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
+ "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "node_modules/extract-zip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "get-stream": "^5.1.0",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "extract-zip": "cli.js"
+ },
+ "engines": {
+ "node": ">= 10.17.0"
+ },
+ "optionalDependencies": {
+ "@types/yauzl": "^2.9.1"
+ }
+ },
+ "node_modules/extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ]
+ },
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "dev": true,
+ "dependencies": {
+ "pend": "~1.2.0"
+ }
+ },
+ "node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/getos": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
+ "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
+ "dev": true,
+ "dependencies": {
+ "async": "^3.2.0"
+ }
+ },
+ "node_modules/getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "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"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/global-dirs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
+ "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
+ "dev": true,
+ "dependencies": {
+ "ini": "2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.10",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+ "dev": true
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/http-signature": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
+ "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^2.0.2",
+ "sshpk": "^1.14.1"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.12.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/ini": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+ "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/is-ci": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
+ "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
+ "dev": true,
+ "dependencies": {
+ "ci-info": "^3.2.0"
+ },
+ "bin": {
+ "is-ci": "bin.js"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-installed-globally": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+ "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+ "dev": true,
+ "dependencies": {
+ "global-dirs": "^3.0.0",
+ "is-path-inside": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "dev": true
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+ "dev": true
+ },
+ "node_modules/jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+ "dev": true
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "dev": true
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "dev": true
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsprim": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
+ "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "dependencies": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.4.0",
+ "verror": "1.10.0"
+ }
+ },
+ "node_modules/lazy-ass": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
+ "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
+ "dev": true,
+ "engines": {
+ "node": "> 0.8"
+ }
+ },
+ "node_modules/listr2": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
+ "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
+ "dev": true,
+ "dependencies": {
+ "cli-truncate": "^2.1.0",
+ "colorette": "^2.0.16",
+ "log-update": "^4.0.0",
+ "p-map": "^4.0.0",
+ "rfdc": "^1.3.0",
+ "rxjs": "^7.5.1",
+ "through": "^2.3.8",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "enquirer": ">= 2.3.0 < 3"
+ },
+ "peerDependenciesMeta": {
+ "enquirer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+ "dev": true
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+ "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-escapes": "^4.3.0",
+ "cli-cursor": "^3.1.0",
+ "slice-ansi": "^4.0.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ospath": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
+ "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
+ "dev": true
+ },
+ "node_modules/p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "dev": true,
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "dev": true
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "dev": true
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pretty-bytes": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+ "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
+ "dev": true
+ },
+ "node_modules/psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
+ "dev": true
+ },
+ "node_modules/pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+ "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/request-progress": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
+ "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
+ "dev": true,
+ "dependencies": {
+ "throttleit": "^1.0.0"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
+ "dev": true
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "7.5.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz",
+ "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "node_modules/semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/slice-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+ "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sshpk": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
+ "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
+ "dev": true,
+ "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"
+ },
+ "bin": {
+ "sshpk-conv": "bin/sshpk-conv",
+ "sshpk-sign": "bin/sshpk-sign",
+ "sshpk-verify": "bin/sshpk-verify"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/throttleit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
+ "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==",
+ "dev": true
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true
+ },
+ "node_modules/tmp": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+ "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+ "dev": true,
+ "dependencies": {
+ "rimraf": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8.17.0"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "dev": true,
+ "dependencies": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
+ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
+ "dev": true
+ },
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+ "dev": true
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/untildify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "dev": true,
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ }
+ },
+ "dependencies": {
+ "@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@cypress/request": {
+ "version": "2.88.10",
+ "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz",
+ "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "http-signature": "~1.3.6",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^8.3.2"
+ }
+ },
+ "@cypress/xvfb": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
+ "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
+ "dev": true,
+ "requires": {
+ "debug": "^3.1.0",
+ "lodash.once": "^4.1.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "@types/node": {
+ "version": "14.18.33",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz",
+ "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==",
+ "dev": true
+ },
+ "@types/sinonjs__fake-timers": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
+ "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
+ "dev": true
+ },
+ "@types/sizzle": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz",
+ "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==",
+ "dev": true
+ },
+ "@types/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dev": true,
+ "requires": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ }
+ },
+ "ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true
+ },
+ "ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.21.3"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "arch": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
+ "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
+ "dev": true
+ },
+ "asn1": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "dev": true
+ },
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true
+ },
+ "async": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true
+ },
+ "at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
+ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+ "dev": true,
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "blob-util": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
+ "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
+ "dev": true
+ },
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true
+ },
+ "cachedir": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz",
+ "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "check-more-types": {
+ "version": "2.24.0",
+ "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
+ "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
+ "dev": true
+ },
+ "ci-info": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz",
+ "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==",
+ "dev": true
+ },
+ "clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^3.1.0"
+ }
+ },
+ "cli-table3": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
+ "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==",
+ "dev": true,
+ "requires": {
+ "@colors/colors": "1.5.0",
+ "string-width": "^4.2.0"
+ }
+ },
+ "cli-truncate": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+ "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+ "dev": true,
+ "requires": {
+ "slice-ansi": "^3.0.0",
+ "string-width": "^4.2.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "colorette": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
+ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "dev": true
+ },
+ "common-tags": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "cypress": {
+ "version": "10.11.0",
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.11.0.tgz",
+ "integrity": "sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA==",
+ "dev": true,
+ "requires": {
+ "@cypress/request": "^2.88.10",
+ "@cypress/xvfb": "^1.2.4",
+ "@types/node": "^14.14.31",
+ "@types/sinonjs__fake-timers": "8.1.1",
+ "@types/sizzle": "^2.3.2",
+ "arch": "^2.2.0",
+ "blob-util": "^2.0.2",
+ "bluebird": "^3.7.2",
+ "buffer": "^5.6.0",
+ "cachedir": "^2.3.0",
+ "chalk": "^4.1.0",
+ "check-more-types": "^2.24.0",
+ "cli-cursor": "^3.1.0",
+ "cli-table3": "~0.6.1",
+ "commander": "^5.1.0",
+ "common-tags": "^1.8.0",
+ "dayjs": "^1.10.4",
+ "debug": "^4.3.2",
+ "enquirer": "^2.3.6",
+ "eventemitter2": "6.4.7",
+ "execa": "4.1.0",
+ "executable": "^4.1.1",
+ "extract-zip": "2.0.1",
+ "figures": "^3.2.0",
+ "fs-extra": "^9.1.0",
+ "getos": "^3.2.1",
+ "is-ci": "^3.0.0",
+ "is-installed-globally": "~0.4.0",
+ "lazy-ass": "^1.6.0",
+ "listr2": "^3.8.3",
+ "lodash": "^4.17.21",
+ "log-symbols": "^4.0.0",
+ "minimist": "^1.2.6",
+ "ospath": "^1.2.2",
+ "pretty-bytes": "^5.6.0",
+ "proxy-from-env": "1.0.0",
+ "request-progress": "^3.0.0",
+ "semver": "^7.3.2",
+ "supports-color": "^8.1.1",
+ "tmp": "~0.2.1",
+ "untildify": "^4.0.0",
+ "yauzl": "^2.10.0"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "dayjs": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz",
+ "integrity": "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+ "dev": true,
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "^4.1.1"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true
+ },
+ "eventemitter2": {
+ "version": "6.4.7",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
+ "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
+ "dev": true
+ },
+ "execa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
+ "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "get-stream": "^5.0.0",
+ "human-signals": "^1.1.1",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.0",
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
+ "executable": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
+ "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
+ "dev": true,
+ "requires": {
+ "pify": "^2.2.0"
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "extract-zip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "dev": true,
+ "requires": {
+ "@types/yauzl": "^2.9.1",
+ "debug": "^4.1.1",
+ "get-stream": "^5.1.0",
+ "yauzl": "^2.10.0"
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+ "dev": true
+ },
+ "fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "dev": true,
+ "requires": {
+ "pend": "~1.2.0"
+ }
+ },
+ "figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "^1.0.5"
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dev": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "requires": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "getos": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
+ "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
+ "dev": true,
+ "requires": {
+ "async": "^3.2.0"
+ }
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "requires": {
+ "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": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
+ "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
+ "dev": true,
+ "requires": {
+ "ini": "2.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.10",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
+ "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^2.0.2",
+ "sshpk": "^1.14.1"
+ }
+ },
+ "human-signals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+ "dev": true
+ },
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "ini": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+ "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+ "dev": true
+ },
+ "is-ci": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
+ "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
+ "dev": true,
+ "requires": {
+ "ci-info": "^3.2.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "is-installed-globally": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+ "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+ "dev": true,
+ "requires": {
+ "global-dirs": "^3.0.0",
+ "is-path-inside": "^3.0.2"
+ }
+ },
+ "is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "dev": true
+ },
+ "is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+ "dev": true
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "dev": true
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ }
+ },
+ "jsprim": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
+ "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.4.0",
+ "verror": "1.10.0"
+ }
+ },
+ "lazy-ass": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
+ "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
+ "dev": true
+ },
+ "listr2": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
+ "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
+ "dev": true,
+ "requires": {
+ "cli-truncate": "^2.1.0",
+ "colorette": "^2.0.16",
+ "log-update": "^4.0.0",
+ "p-map": "^4.0.0",
+ "rfdc": "^1.3.0",
+ "rxjs": "^7.5.1",
+ "through": "^2.3.8",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ }
+ },
+ "log-update": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+ "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "^4.3.0",
+ "cli-cursor": "^3.1.0",
+ "slice-ansi": "^4.0.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "dependencies": {
+ "slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ }
+ }
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.0.0"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "ospath": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
+ "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
+ "dev": true
+ },
+ "p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "dev": true,
+ "requires": {
+ "aggregate-error": "^3.0.0"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "dev": true
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true
+ },
+ "pretty-bytes": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+ "dev": true
+ },
+ "proxy-from-env": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+ "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
+ "dev": true
+ },
+ "psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
+ "dev": true
+ },
+ "pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+ "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+ "dev": true
+ },
+ "request-progress": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
+ "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
+ "dev": true,
+ "requires": {
+ "throttleit": "^1.0.0"
+ }
+ },
+ "restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "requires": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "rfdc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "rxjs": {
+ "version": "7.5.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz",
+ "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+ "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ }
+ },
+ "sshpk": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
+ "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
+ "dev": true,
+ "requires": {
+ "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": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "throttleit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
+ "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==",
+ "dev": true
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true
+ },
+ "tmp": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+ "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+ "dev": true,
+ "requires": {
+ "rimraf": "^3.0.0"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ }
+ },
+ "tslib": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
+ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
+ "dev": true
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+ "dev": true
+ },
+ "type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true
+ },
+ "universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true
+ },
+ "untildify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+ "dev": true
+ },
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "dev": true,
+ "requires": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..abaeecc
--- /dev/null
+++ b/package.json
@@ -0,0 +1,15 @@
+{
+ "devDependencies": {
+ "cypress": "^10.11.0"
+ },
+ "scripts": {
+ "openCypress": "cypress open",
+ "test": "node_modules\\.bin\\cypress run",
+ "runtests": "npm run test --",
+ "runCypressInTerminal": "cypress run",
+ "runCypressInBrowser": "cypress run --headed",
+ "runSpecificCase": "cypress run --spec ",
+ "runChrome": "cypress run --browser chrome",
+ "runEdge": "cypress run --browser edge"
+ }
+}