From 8ea2a386f259123d295ad837195d262aae7e4a02 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Tue, 15 Jun 2021 03:44:33 +0800 Subject: [PATCH 001/222] Create LogIn.js E2E testing --- test/Onboarding/LogIn.js | 67 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 test/Onboarding/LogIn.js diff --git a/test/Onboarding/LogIn.js b/test/Onboarding/LogIn.js new file mode 100644 index 0000000000..c41cea6a96 --- /dev/null +++ b/test/Onboarding/LogIn.js @@ -0,0 +1,67 @@ + +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const { expect } = require('chai'); +const { Console } = require('console'); + +describe('BobLogIn', function() { + this.timeout(30000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + }) + afterEach(async function() { + // await driver.quit(); + }) + it('Simple log in', async function() { + + console.log(" Test name: BobLogIn"); + await driver.get("https://sandbox.hollaex.com/login"); + await driver.sleep(5000); + const title = await driver.getTitle(); + console.log(title) + expect(title).to.equal(title); + console.log("entring sand box"); + console.log(" Step # | action | target | value"); + + console.log(" 1 | type | name=email | bob@gmail.com"); + await driver.wait(until.elementLocated(By.name("email")), 5000) + await driver.findElement(By.name("email")).sendKeys("bob@gmail.com"); + + console.log(" 2 | type | name=password | Holla!"); + await driver.wait(until.elementLocated(By.name("password")), 5000) + await driver.findElement(By.name("password")).sendKeys("Holla!"); + + console.log(" 3 | click | css=.auth_wrapper | "); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(".auth_wrapper"))), 5000); + await driver.findElement(By.css(".auth_wrapper")).click(); + console.log(" 4 | verifyElementPresent | css=.holla-button |"); + { + const elements = await driver.findElements(By.css(".holla-button")); + // assert(elements.length); + expect(elements.length); + } + + console.log(" 5 | click | css=.holla-button | "); + await driver.findElement(By.css(".holla-button")).click(); + await sleep(5000); + console.log(" 6 | assertText | css=.app-bar-account-content > div:nth-child(2) | youremail@gmail.com"); + await driver.wait(until.elementLocated(By.css(".app-bar-account-content > div:nth-child(2)")), 20000) + await console.log(await driver.findElement(By.css(".app-bar-account-content > div:nth-child(2)")).getText()); + expect(await driver.findElement(By.css(".app-bar-account-content > div:nth-child(2)")).getText()).to.equal("bob@gmail.com") + // console.log(" 6 | click | css=.d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container | "); + // await driver.wait(until.elementLocated(By.css(".d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container")), 5000) + // await driver.findElement(By.css(".d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container")).click(); + + console.log(" 7 | close | | "); + //await driver.close(); + + }) +}) From 435abaddec83f69165440c397a3ce2534adf2374 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Tue, 15 Jun 2021 03:44:41 +0800 Subject: [PATCH 002/222] Create LogOut.js --- test/Onboarding/LogOut.js | 71 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 test/Onboarding/LogOut.js diff --git a/test/Onboarding/LogOut.js b/test/Onboarding/LogOut.js new file mode 100644 index 0000000000..b1c8be187e --- /dev/null +++ b/test/Onboarding/LogOut.js @@ -0,0 +1,71 @@ + +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const { expect } = require('chai'); +const { Console } = require('console'); + +describe('BobLogIn', function() { + this.timeout(30000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + }) + afterEach(async function() { + // await driver.quit(); + }) + it('Simple log in', async function() { + + console.log(" Test name: BobLogIn"); + await driver.get("https://sandbox.hollaex.com/login"); + await driver.sleep(5000); + const title = await driver.getTitle(); + console.log(title) + expect(title).to.equal(title); + console.log("entring sand box"); + console.log(" Step # | action | target | value"); + + console.log(" 1 | type | name=email | bob@gmail.com"); + await driver.wait(until.elementLocated(By.name("email")), 5000) + await driver.findElement(By.name("email")).sendKeys("bob@gmail.com"); + + console.log(" 2 | type | name=password | Holla!"); + await driver.wait(until.elementLocated(By.name("password")), 5000) + await driver.findElement(By.name("password")).sendKeys("Holla!"); + + console.log(" 3 | click | css=.auth_wrapper | "); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(".auth_wrapper"))), 5000); + await driver.findElement(By.css(".auth_wrapper")).click(); + console.log(" 4 | verifyElementPresent | css=.holla-button |"); + { + const elements = await driver.findElements(By.css(".holla-button")); + // assert(elements.length); + expect(elements.length); + } + + console.log(" 5 | click | css=.holla-button | "); + await driver.findElement(By.css(".holla-button")).click(); + await sleep(5000); + console.log(" 6 | assertText | css=.app-bar-account-content > div:nth-child(2) | youremail@gmail.com"); + await driver.wait(until.elementLocated(By.css(".app-bar-account-content > div:nth-child(2)")), 20000) + await console.log(await driver.findElement(By.css(".app-bar-account-content > div:nth-child(2)")).getText()); + expect(await driver.findElement(By.css(".app-bar-account-content > div:nth-child(2)")).getText()).to.equal("bob@gmail.com") + // console.log(" 6 | click | css=.d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container | "); + // await driver.wait(until.elementLocated(By.css(".d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container")), 5000) + // await driver.findElement(By.css(".d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container")).click(); + await console.log("7 | click | css=.align-items-center:nth-child(9) |"); + await driver.findElement(By.css(".align-items-center:nth-child(9)")).click(); + console.log("8 | assertText | css=.icon_title-text | Login"); + expect(await driver.findElement(By.css(".icon_title-text")).getText()).to.equal( "Login"); + + console.log(" 9 | close | | "); + //await driver.close(); + + }) +}) From 1b889556d758fb20778b97055cb078ea4edb2a97 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Tue, 15 Jun 2021 03:44:49 +0800 Subject: [PATCH 003/222] Create ResendVerificationEmail.js --- test/Onboarding/ResendVerificationEmail.js | 104 +++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 test/Onboarding/ResendVerificationEmail.js diff --git a/test/Onboarding/ResendVerificationEmail.js b/test/Onboarding/ResendVerificationEmail.js new file mode 100644 index 0000000000..43463749ac --- /dev/null +++ b/test/Onboarding/ResendVerificationEmail.js @@ -0,0 +1,104 @@ +// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const { expect } = require('chai'); + + +describe('NewUserRequest', function() { + this.timeout(100000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + async function waitForWindow(timeout = 2) { + await driver.sleep(timeout) + const handlesThen = vars["windowHandles"] + const handlesNow = await driver.getAllWindowHandles() + if (handlesNow.length > handlesThen.length) { + return handlesNow.find(handle => (!handlesThen.includes(handle))) + } + throw new Error("New window did not appear before timeout") + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + }) + afterEach(async function() { + // await driver.quit(); + + }) + it('ResendRequest', async function() { + console.log("Test name: NewUserRequest"); + console.log(" Step # | name | target | value"); + console.log("1 | open | https://sandbox.hollaex.com/verify | "); + await driver.get("https://sandbox.hollaex.com/verify"); + const title = await driver.getTitle(); + console.log(title) + expect(title).to.equal(title); + console.log("entring sand box"); + console.log(" Step # | action | target | value"); + console.log("2 | setWindowSize | 1050x660 | "); + + console.log("1| type | name=email | bob@gmail.com"); + await sleep(4000); + await driver.findElement(By.name("email")).sendKeys("bob@gmail.com"); + console.log("2| click | css=.holla-button |"); + await sleep(4000); + await driver.findElement(By.css(".holla-button")).click(); + await sleep(4000); + console.log("assertText | css=.icon_title-text | Resent Email"); + expect(await driver.findElement(By.css(".icon_title-text")).getText()).to.equal("Resent Email"); + + console.log("Test name: New User Email Confirmation"); + console.log("Step # | name | target | value"); + console.log("1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |"); + await driver.get("https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin"); + + console.log("2 | setWindowSize | 1050x660 | "); + await driver.manage().window().setRect(1050, 660); + + console.log("3 | type&Enter | id=identifierId | youremail@gmail.com"); + await driver.findElement(By.id("identifierId")).sendKeys("qabitholla@gmail.com"); + await driver.findElement(By.id("identifierId")).sendKeys(Key.ENTER); + + console.log("4 | wait | name=password | Holla!"); + await driver.wait(until.elementsLocated(By.name("password"),30000,"wait", 5000)); + console.log("sleep well for 10"); + await sleep(5000); + + console.log("5 | type&Enter | id=password| your password!"); + await driver.findElement(By.name("password")).sendKeys("Holla!"); + await driver.findElement(By.name("password")).sendKeys(Key.ENTER); + + console.log("sleep well for 5"); + await sleep(5000); + + console.log("6 | click | linkText=Refresh | "); + await driver.findElement(By.linkText("Refresh")).click() + + console.log("7 | click | css=.ts | "); + await driver.findElement(By.css(".ts")).click(); + await driver.findElement(By.css(".h td")).click(); + + console.log(" 8 | assertText | css=h2 b | sandbox Sign Up"); + expect(await driver.findElement(By.css("h2 b")).getText()).to.equal("Fwd: sandbox Sign Up"); + console.log(" 9 | click | css=button | "); + vars["windowHandles"] = await driver.getAllWindowHandles(); + console.log("10 | selectWindow | handle=${win9509} | "); + await driver.findElement(By.css("button")).click() + console.log(" 11 | click | css=.icon_title-wrapper | "); + vars["win9509"] = await waitForWindow(5000) + console.log("12 | assertNotText | css=.icon_title-text | Error"); + await driver.switchTo().window(vars["win9509"]) + await driver.findElement(By.css(".icon_title-wrapper")).click(); + { + const text = await driver.findElement(By.css(".icon_title-text")).getText(); + expect(text).to.not.equal("Error"); + } + + + }) +}) \ No newline at end of file From 8a4dac968cefff14f899114b989064ae7cdd009f Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Tue, 15 Jun 2021 03:44:55 +0800 Subject: [PATCH 004/222] Create ResetPassword.js --- test/Onboarding/ResetPassword.js | 107 +++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 test/Onboarding/ResetPassword.js diff --git a/test/Onboarding/ResetPassword.js b/test/Onboarding/ResetPassword.js new file mode 100644 index 0000000000..7e9650b515 --- /dev/null +++ b/test/Onboarding/ResetPassword.js @@ -0,0 +1,107 @@ +// +const { Builder, By, Key, until, logging } = require('selenium-webdriver'); +const assert = require('assert'); +const { expect } = require('chai'); + + +describe('NewUserRequest', function() { + this.timeout(100000) + let driver + let vars + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + async function waitForWindow(timeout = 2) { + await driver.sleep(timeout) + const handlesThen = vars["windowHandles"] + const handlesNow = await driver.getAllWindowHandles() + if (handlesNow.length > handlesThen.length) { + return handlesNow.find(handle => (!handlesThen.includes(handle))) + } + throw new Error("New window did not appear before timeout") + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build() + vars = {} + }) + afterEach(async function() { + await driver.quit(); + }) + it('Rest Password', async function() { + console.log('// Test name: Reset Password') + // Step # | name | target | value + // 1 | open | https://sandbox.hollaex.com/reset-password | + await driver.get("https://sandbox.hollaex.com/reset-password") + // 2 | setWindowSize | 1050x660 | + await driver.manage().window().setRect(1050, 660) + // 3 | click | name=email | + await sleep(5000); + await driver.findElement(By.name("email")).click() + // 4 | type | name=email | bob@gmail.com + await driver.findElement(By.name("email")).sendKeys("bob@gmail.com") + // 5 | click | css=.holla-button | + await sleep(5000); + await driver.findElement(By.css(".holla-button")).click() + // 6 | click | css=.icon_title-wrapper | + await sleep(5000); + //await driver.findElement(By.css(".icon_title-wrapper")).click() + console.log("// 7 | assertText | css=.icon_title-text | Password Reset Sent"); + assert(await driver.findElement(By.css(".icon_title-text")).getText() == "Password Reset Sent") + // 8 | click | css=.holla-button:nth-child(1) | + driver.close(); + await sleep(10000); + driver = await new Builder().forBrowser('chrome').build(); + await sleep(10000); + console.log("Test name: New User Email Confirmation"); + console.log("Step # | name | target | value"); + console.log("1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |"); + await driver.get("https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin"); + + console.log("2 | setWindowSize | 1050x660 | "); + await driver.manage().window().setRect(1050, 660); + + console.log("3 | type&Enter | id=identifierId | youremail@gmail.com"); + + await driver.findElement(By.id("identifierId")).sendKeys("alice@gmail.com"); + await sleep(10000); + await driver.findElement(By.id("identifierId")).sendKeys(Key.ENTER); + + console.log("4 | wait | name=password | Holla!"); + await driver.wait(until.elementsLocated(By.name("password"),30000,"wait", 5000)); + console.log("sleep well for 10"); + await sleep(5000); + + console.log("5 | type&Enter | id=password| your password!"); + await driver.findElement(By.name("password")).sendKeys("Holla!"); + await driver.findElement(By.name("password")).sendKeys(Key.ENTER); + + console.log("sleep well for 5"); + await sleep(5000); + + console.log("6 | click | linkText=Refresh | "); + await driver.findElement(By.linkText("Refresh")).click() + + console.log("7 | click | css=.ts | "); + await driver.findElement(By.css(".ts")).click(); + await driver.findElement(By.css(".h td")).click(); + + assert(await driver.findElement(By.css("h2 b")).getText() == "Fwd: sandbox Reset Password Request") + // 6 | click | css=.gmail_attr | + await driver.findElement(By.css(".gmail_attr")).click() + // 7 | click | css=button | + vars["windowHandles"] = await driver.getAllWindowHandles() + // 8 | selectWindow | handle=${win3601} | + await driver.findElement(By.css("button")).click() + // 9 | type | name=password | Holla! + vars["win3601"] = await waitForWindow(2000) + // 10 | type | name=password_repeat | Hola2021! + await driver.switchTo().window(vars["win3601"]) + // 11 | click | css=.holla-button | + await driver.findElement(By.name("password")).sendKeys("Holla!") + await driver.findElement(By.name("password_repeat")).sendKeys("Hola2021!") + await driver.findElement(By.css(".holla-button")).click() + //logIN + }) +}) From 8b1397524683300906ed94c87d39aecf8a918bb8 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Tue, 15 Jun 2021 03:45:01 +0800 Subject: [PATCH 005/222] Create SignUp.js --- test/Onboarding/SignUp.js | 101 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 test/Onboarding/SignUp.js diff --git a/test/Onboarding/SignUp.js b/test/Onboarding/SignUp.js new file mode 100644 index 0000000000..249c76c644 --- /dev/null +++ b/test/Onboarding/SignUp.js @@ -0,0 +1,101 @@ +// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const { expect } = require('chai'); + + +describe('NewUserRequest', function() { + this.timeout(100000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + async function waitForWindow(timeout = 2) { + await driver.sleep(timeout) + const handlesThen = vars["windowHandles"] + const handlesNow = await driver.getAllWindowHandles() + if (handlesNow.length > handlesThen.length) { + return handlesNow.find(handle => (!handlesThen.includes(handle))) + } + throw new Error("New window did not appear before timeout") + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + }) + afterEach(async function() { + // await driver.quit(); + + }) + it('ResendRequest', async function() { + console.log("Test name: NewUserRequest"); + console.log(" Step # | name | target | value"); + console.log("1 | open | https://sandbox.hollaex.com/verify | "); + await driver.get("https://sandbox.hollaex.com/"); + const title = await driver.getTitle(); + console.log(title) + expect(title).to.equal(title); + console.log("entring sand box"); + console.log(" Step # | action | target | value"); + console.log("2 | setWindowSize | 1050x660 | "); + + console.log("1| type | name=email | bob@gmail.com"); + await driver.findElement(By.name("email")).sendKeys("bob@gmail.com"); + console.log("2| click | css=.holla-button |"); + await driver.findElement(By.css(".holla-button")).click(); + console.log("assertText | css=.icon_title-text | Resent Email"); + expect(await driver.findElement(By.css(".icon_title-text")).getText()).to.equal("Resent Email"); + + console.log("Test name: New User Email Confirmation"); + console.log("Step # | name | target | value"); + console.log("1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |"); + await driver.get("https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin"); + + console.log("2 | setWindowSize | 1050x660 | "); + await driver.manage().window().setRect(1050, 660); + + console.log("3 | type&Enter | id=identifierId | youremail@gmail.com"); + await driver.findElement(By.id("identifierId")).sendKeys("qabitholla@gmail.com"); + await driver.findElement(By.id("identifierId")).sendKeys(Key.ENTER); + + console.log("4 | wait | name=password | Holla!"); + await driver.wait(until.elementsLocated(By.name("password"),30000,"wait", 5000)); + console.log("sleep well for 10"); + await sleep(5000); + + console.log("5 | type&Enter | id=password| your password!"); + await driver.findElement(By.name("password")).sendKeys("Holla!"); + await driver.findElement(By.name("password")).sendKeys(Key.ENTER); + + console.log("sleep well for 5"); + await sleep(5000); + + console.log("6 | click | linkText=Refresh | "); + await driver.findElement(By.linkText("Refresh")).click() + + console.log("7 | click | css=.ts | "); + await driver.findElement(By.css(".ts")).click(); + await driver.findElement(By.css(".h td")).click(); + + console.log(" 8 | assertText | css=h2 b | sandbox Sign Up"); + expect(await driver.findElement(By.css("h2 b")).getText()).to.equal("Fwd: sandbox Sign Up"); + console.log(" 9 | click | css=button | "); + vars["windowHandles"] = await driver.getAllWindowHandles(); + console.log("10 | selectWindow | handle=${win9509} | "); + await driver.findElement(By.css("button")).click() + console.log(" 11 | click | css=.icon_title-wrapper | "); + vars["win9509"] = await waitForWindow(5000) + console.log("12 | assertNotText | css=.icon_title-text | Error"); + await driver.switchTo().window(vars["win9509"]) + await driver.findElement(By.css(".icon_title-wrapper")).click(); + { + const text = await driver.findElement(By.css(".icon_title-text")).getText(); + expect(text).to.not.equal("Error"); + } + + + }) +}) \ No newline at end of file From d4603c1f7b056b3780ced1de42bf35c6ec269070 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Tue, 15 Jun 2021 03:45:07 +0800 Subject: [PATCH 006/222] Create package.json --- test/package.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 test/package.json diff --git a/test/package.json b/test/package.json new file mode 100644 index 0000000000..5bd5843664 --- /dev/null +++ b/test/package.json @@ -0,0 +1,20 @@ +{ + "name": "selenes", + "version": "1.0.0", + "description": "Test Selenuim on JS", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Mahdi", + "license": "MIT", + "keywords": [], + "dependencies": { + + "selenium-webdriver": "^4.0.0-beta.3 + }, + "devDependencies": { + "chai": "^4.3.4", + "mocha": "^8.4.0" + } +} From 29212d82d0302ebdf49c011785f1d0b9045026ba Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Tue, 15 Jun 2021 03:45:16 +0800 Subject: [PATCH 007/222] Create CancelOrders.js --- test/Trade/CancelOrders.js | 79 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 test/Trade/CancelOrders.js diff --git a/test/Trade/CancelOrders.js b/test/Trade/CancelOrders.js new file mode 100644 index 0000000000..e954ce569d --- /dev/null +++ b/test/Trade/CancelOrders.js @@ -0,0 +1,79 @@ +const { Builder, By, Key, until } = require('selenium-webdriver') +const assert = require('assert') + +describe('Orders', function() { + this.timeout(300000) + let driver + let vars + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {} + // Test name: Untitled + // Step # | name | target | value + // 1 | open | /account | + await driver.get("https://sandbox.hollaex.com/account"); + await sleep(10000); + // 2 | type | name=email | USER@bitholla.com + // await driver.wait(until.elementLocated(await driver.findElement(By.name("email"))), 5000); + await driver.findElement(By.name("email")).sendKeys("USER@bitholla.com"); + // 3 | type | name=password | bitholla@bitholla.com + //await driver.wait(until.elementLocated(await driver.findElement(By.name("password"))),5000); + await driver.findElement(By.name("password")).sendKeys("bitholla@bitholla.com"); + // 4 | click | name=email | + + await sleep(4000); + await driver.findElement(By.name("email")).click(); + // 5 | click | css=.holla-button | + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(".holla-button"))), 50000); + await driver.findElement(By.css(".holla-button")).click(); + }) + afterEach(async function() { + await driver.quit(); + }) + it('Cancel Orders, all orders', async function() { + await sleep(4000); + await driver.findElement(By.css(".app-menu-bar-content:nth-child(2) .edit-wrapper__container")).click() + // 5 | click | name=Search Assets | | + await driver.findElement(By.name("Search Assets")).click() + // 6 | type | name=Search Assets | xht | + await driver.findElement(By.name("Search Assets")).sendKeys("xht") + // 7 | sendKeys | name=Search Assets | ${KEY_ENTER} | + await driver.findElement(By.name("Search Assets")).sendKeys(Key.ENTER) + // 8 | click | css=.trade_tab-pair-sub-title | | + await driver.findElement(By.css(".trade_tab-pair-sub-title")).click() + // 9 | click | name=size | | + await sleep(3000); + + await driver.findElement(By.css(".active-menu .edit-wrapper__container")).click() + // 3 | click | css=.tabs-pair-details:nth-child(1) > .market-card__sparkline-wrapper | + await driver.findElement(By.css(".tabs-pair-details:nth-child(1) > .market-card__sparkline-wrapper")).click() + // 4 | click | css=.table_body-row:nth-child(1) .action_notification-text | + await driver.findElement(By.css(".table_body-row:nth-child(1) .action_notification-text")).click() + // 5 | click | css=.table_body-row:nth-child(1) .action_notification-text | + await driver.findElement(By.css(".table_body-row:nth-child(1) .action_notification-text")).click() + // 6 | click | css=.table_body-row:nth-child(1) .action_notification-text | + await driver.findElement(By.css(".table_body-row:nth-child(1) .action_notification-text")).click() + // 7 | click | css=.table_body-row:nth-child(1) .action_notification-text | + await driver.findElement(By.css(".table_body-row:nth-child(1) .action_notification-text")).click() + // 8 | click | css=.table_body-row:nth-child(1) .action_notification-text | + await driver.findElement(By.css(".table_body-row:nth-child(1) .action_notification-text")).click() + // 9 | click | css=.table_body-row:nth-child(1) .action_notification-text | + await driver.findElement(By.css(".table_body-row:nth-child(1) .action_notification-text")).click() + // 10 | click | css=.table_body-row:nth-child(1) .action_notification-text | + await driver.findElement(By.css(".table_body-row:nth-child(1) .action_notification-text")).click() + // 11 | click | css=.trade__active-orders_cancel-All .action_notification-text | + await driver.findElement(By.css(".trade__active-orders_cancel-All .action_notification-text")).click() + // 12 | click | css=.icon_title-text | + await driver.findElement(By.css(".icon_title-text")).click() + // 13 | assertText | css=.icon_title-text | Cancel Orders + assert(await driver.findElement(By.css(".icon_title-text")).getText() == "Cancel Orders") + // 14 | click | css=.w-100 > .holla-button:nth-child(3) | + await driver.findElement(By.css(".w-100 > .holla-button:nth-child(3)")).click() + }) + +}) From 7292aa14fc47d89882805448a8b1f0acc68297b0 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Tue, 15 Jun 2021 03:45:25 +0800 Subject: [PATCH 008/222] Create trade.js --- test/Trade/trade.js | 188 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 test/Trade/trade.js diff --git a/test/Trade/trade.js b/test/Trade/trade.js new file mode 100644 index 0000000000..ba5241c3dd --- /dev/null +++ b/test/Trade/trade.js @@ -0,0 +1,188 @@ +// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver') +const assert = require('assert') + + + +describe('Trade', function() { + this.timeout(300000) + let driver + let vars + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {} + // Test name: Untitled + // Step # | name | target | value + // 1 | open | /account | + await driver.get("https://sandbox.hollaex.com/account"); + await sleep(10000); + // 2 | type | name=email | USER@bitholla.com + // await driver.wait(until.elementLocated(await driver.findElement(By.name("email"))), 5000); + await driver.findElement(By.name("email")).sendKeys("USER@bitholla.com"); + // 3 | type | name=password | bitholla@bitholla.com + //await driver.wait(until.elementLocated(await driver.findElement(By.name("password"))),5000); + await driver.findElement(By.name("password")).sendKeys("bitholla@bitholla.com"); + // 4 | click | name=email | + + await sleep(4000); + await driver.findElement(By.name("email")).click(); + // 5 | click | css=.holla-button | + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(".holla-button"))), 50000); + await driver.findElement(By.css(".holla-button")).click(); + }) + afterEach(async function() { + await driver.quit(); + }) + it('limit buy', async function() { + + // await driver.manage().window().setRect(1050, 660) + + // 3 | click | css=.home_app_bar > .pointer | | + await sleep(4000); + await driver.findElement(By.css(".app-menu-bar-content:nth-child(2) .edit-wrapper__container")).click() + // 5 | click | name=Search Assets | | + await driver.findElement(By.name("Search Assets")).click() + // 6 | type | name=Search Assets | xht | + await driver.findElement(By.name("Search Assets")).sendKeys("xht") + // 7 | sendKeys | name=Search Assets | ${KEY_ENTER} | + await driver.findElement(By.name("Search Assets")).sendKeys(Key.ENTER) + // 8 | click | css=.trade_tab-pair-sub-title | | + await driver.findElement(By.css(".trade_tab-pair-sub-title")).click() + // 9 | click | name=size | | + await sleep(3000); + await driver.findElement(By.name("size")).click() + // 10 | type | name=size | 1 | + await driver.findElement(By.name("size")).sendKeys("1") + // 11 | click | css=.holla-button | | + await driver.findElement(By.css(".holla-button")).click() + // 12 | click | css=.notification-content-information > .d-flex:nth-child(1) | | + await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(1)")).click() + // 13 | assertText | css=.text-capitalize | Limit Buy | + assert(await driver.findElement(By.css(".text-capitalize")).getText() == "Limit Buy") + // 14 | click | css=.d-flex > .holla-button:nth-child(3) | | + await driver.findElement(By.css(".d-flex > .holla-button:nth-child(3)")).click() + // 15 | click | css=.w-100 .ant-select-selection-item | | + await driver.findElement(By.css(".w-100 .ant-select-selection-item")).click() + // 16 | click | css=.ant-select-item-option-active > .ant-select-item-option-content | | + await driver.findElement(By.css(".ant-select-item-option-active > .ant-select-item-option-content")).click() + // 17 | click | name=stop | | + }) + + it('Limit Sell', async function() { + + // 2 | setWindowSize | 1050x660 | + // await driver.manage().window().setRect(1050, 660) + await sleep(4000); + // 3 | click | css=.home_app_bar > .pointer | + // await driver.findElement(By.css(".home_app_bar > .pointer")).click() + // 4 | click | css=.app-menu-bar-content:nth-child(2) .edit-wrapper__container | + await driver.findElement(By.css(".app-menu-bar-content:nth-child(2) .edit-wrapper__container")).click() + // 5 | click | name=Search Assets | + await driver.findElement(By.name("Search Assets")).click() + // 6 | type | name=Search Assets | xht + await driver.findElement(By.name("Search Assets")).sendKeys("xht") + // 7 | sendKeys | name=Search Assets | ${KEY_ENTER} + await driver.findElement(By.name("Search Assets")).sendKeys(Key.ENTER) + // 8 | click | css=.highcharts-background | + await driver.findElement(By.css(".trade_tab-pair-sub-title")).click() + // 9 | click | css=.holla-button-font:nth-child(2) | + await sleep(4000); + await driver.findElement(By.css(".holla-button-font:nth-child(2)")).click() + // 10 | click | name=size | + await driver.findElement(By.name("size")).click() + // 11 | type | name=size | 1 + await driver.findElement(By.name("size")).sendKeys("1") + // 12 | click | css=.holla-button | + await driver.findElement(By.css(".holla-button")).click() + // 13 | click | css=.text-capitalize | + await driver.findElement(By.css(".text-capitalize")).click() + // 14 | assertText | css=.text-capitalize | Limit Sell + assert(await driver.findElement(By.css(".text-capitalize")).getText() == "Limit Sell") + // 15 | click | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | + await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).click() + // 16 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT + assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).getText() == "1 XHT") + // 17 | click | css=.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2) | + await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)")).click() + // 18 | assertText | css=.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2) | 1 USDT + assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)")).getText() == "1 USDT") + // 19 | click | css=.d-flex > .holla-button:nth-child(3) | + await driver.findElement(By.css(".d-flex > .holla-button:nth-child(3)")).click() + // 20 | click | css=.table_body-row:nth-child(1) .action_notification-text | + await driver.findElement(By.css(".table_body-row:nth-child(1) .action_notification-text")).click() + }) + +it('Market buy', async function(){ + // await driver.manage().window().setRect(1296, 696) + await sleep(2000); + // 3 | click | css=.app-menu-bar-content:nth-child(2) .edit-wrapper__container | + await driver.findElement(By.css(".app-menu-bar-content:nth-child(2) .edit-wrapper__container")).click() + // 4 | click | name=Search Assets | + await driver.findElement(By.name("Search Assets")).click() + // 5 | type | name=Search Assets | xht + await driver.findElement(By.name("Search Assets")).sendKeys("xht") + // 6 | sendKeys | name=Search Assets | ${KEY_ENTER} + await driver.findElement(By.name("Search Assets")).sendKeys(Key.ENTER) + // 9 | click | css=.highcharts-background | + await driver.findElement(By.css(".highcharts-background")).click() + // 10 | click | css=.text-center:nth-child(1) | + await sleep(5000); + await driver.findElement(By.css(".text-center:nth-child(1)")).click() + // 11 | click&type 1 | name=size | + await driver.findElement(By.name("size")).click() + await driver.findElement(By.name("size")).sendKeys("1") + // 12 | click | css=.holla-button | + await driver.findElement(By.css(".holla-button")).click() + // 15 | click | css=.text-capitalize | + await driver.findElement(By.css(".text-capitalize")).click() + // 16 | assertText | css=.text-capitalize | Market Buy + assert(await driver.findElement(By.css(".text-capitalize")).getText() == "Market Buy!") + // 17 | click | css=.d-flex > .holla-button:nth-child(3) | + await driver.findElement(By.css(".d-flex > .holla-button:nth-child(3)")).click() + +}) + it('market sell', async function(){ + await driver.manage().window().setRect(1296, 696) + await sleep(2000); + // 3 | click | css=.app-menu-bar-content:nth-child(2) .edit-wrapper__container | + await driver.findElement(By.css(".app-menu-bar-content:nth-child(2) .edit-wrapper__container")).click() + // 4 | click | name=Search Assets | + await driver.findElement(By.name("Search Assets")).click() + // 5 | type | name=Search Assets | xht + await driver.findElement(By.name("Search Assets")).sendKeys("xht") + // 6 | sendKeys | name=Search Assets | ${KEY_ENTER} + await driver.findElement(By.name("Search Assets")).sendKeys(Key.ENTER) + // 9 | click | css=.highcharts-background | + await driver.findElement(By.css(".highcharts-background")).click() + // 10 | click | css=.text-center:nth-child(1) | + await sleep(5000); + await driver.findElement(By.css(".text-center:nth-child(1)")).click() + // 4 | click | css=.holla-button-font:nth-child(2) | + await driver.findElement(By.css(".holla-button-font:nth-child(2)")).click() + // 5 | click | css=.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1) | + await driver.findElement(By.css(".trade-col_action_wrapper > .trade_block-wrapper:nth-child(1)")).click() + await sleep(2000); + // // 11 | click&type 1 | name=size | + await driver.findElement(By.name("size")).click() + await driver.findElement(By.name("size")).sendKeys("1") + // 6 | click | css=.holla-button | + await driver.findElement(By.css(".holla-button")).click() + // 7 | click | css=.text-capitalize | + await driver.findElement(By.css(".text-capitalize")).click() + // 8 | assertText | css=.text-capitalize | Market Sell + assert(await driver.findElement(By.css(".text-capitalize")).getText() == "Market Sell") + // 9 | click | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | + await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).click() + // 10 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT + assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).getText() == "1 XHT") + // 11 | click | css=.d-flex > .holla-button:nth-child(3) | + await driver.findElement(By.css(".d-flex > .holla-button:nth-child(3)")).click() + + }) + +}) From efaa651028b9b835a61427a26da342da33cb12b9 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Tue, 15 Jun 2021 03:45:33 +0800 Subject: [PATCH 009/222] Create tradeWithStop.js --- test/Trade/tradeWithStop.js | 198 ++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 test/Trade/tradeWithStop.js diff --git a/test/Trade/tradeWithStop.js b/test/Trade/tradeWithStop.js new file mode 100644 index 0000000000..0c894bcf8e --- /dev/null +++ b/test/Trade/tradeWithStop.js @@ -0,0 +1,198 @@ +// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver') +const assert = require('assert') + + + +describe('Trade with stop', function() { + this.timeout(300000) + let driver + let vars + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {} + // Test name: Untitled + // Step # | name | target | value + // 1 | open | /account | + await driver.get("https://sandbox.hollaex.com/account"); + await sleep(10000); + // 2 | type | name=email | USER@bitholla.com + // await driver.wait(until.elementLocated(await driver.findElement(By.name("email"))), 5000); + await driver.findElement(By.name("email")).sendKeys("USER@bitholla.com"); + // 3 | type | name=password | bitholla@bitholla.com + //await driver.wait(until.elementLocated(await driver.findElement(By.name("password"))),5000); + await driver.findElement(By.name("password")).sendKeys("bitholla@bitholla.com"); + // 4 | click | name=email | + + await sleep(4000); + await driver.findElement(By.name("email")).click(); + // 5 | click | css=.holla-button | + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(".holla-button"))), 50000); + await driver.findElement(By.css(".holla-button")).click(); + // 3 | click | css=.home_app_bar > .pointer | | + await sleep(3000); + await driver.findElement(By.css(".app-menu-bar-content:nth-child(2) .edit-wrapper__container")).click() + // 5 | click | name=Search Assets | | + await driver.findElement(By.name("Search Assets")).click() + // 6 | type | name=Search Assets | xht | + await driver.findElement(By.name("Search Assets")).sendKeys("xht") + // 7 | sendKeys | name=Search Assets | ${KEY_ENTER} | + await driver.findElement(By.name("Search Assets")).sendKeys(Key.ENTER) + // 8 | click | css=.trade_tab-pair-sub-title | | + await driver.findElement(By.css(".trade_tab-pair-sub-title")).click() + // 9 | click | name=size | | + await sleep(3000); + + // await driver.manage().window().setRect(1050, 660) + // // 3 | click | css=.w-100 .ant-select-selection-item | + + await driver.findElement(By.css(".w-100 .ant-select-selection-item")).click() + await sleep(1000); + // xpath of stop '/html/body/div[11]/div/div/div/div[2]/div[1]/div/div/div[2]/div' + await driver.findElement(By.xpath('/html/body/div[11]/div/div/div/div[2]/div[1]/div/div/div[2]/div')).click() + }) + afterEach(async function() { + await driver.quit(); + }) + it('Limit Buy', async function() { + + // 3 | click | name=stop | + await sleep(1000) + await driver.findElement(By.css(".holla-button-font:nth-child(1)")).click() + await sleep(1000) + await driver.findElement(By.name("stop")).click() + // 4 | type | name=stop | 1 + await driver.findElement(By.name("stop")).sendKeys("1") + await sleep(1000) + // 7 | type | name=price | 0.9 + // await driver.findElement(By.name("price")).click() + // await driver.findElement(By.name("price")).clear() + // await driver.findElement(By.name("price")).sendKeys("0.9") + // await sleep(1000) + // 5 | click | name=size | + await driver.findElement(By.name("size")).click() + // 6 | type | name=size | 1 + await driver.findElement(By.name("size")).sendKeys("1") + await sleep(3000) + await driver.findElement(By.name("size")).sendKeys(Key.ENTER) + + // 8 | click | css=.holla-button | + // await driver.wait(until.elementIsEnabled(By.xpath('//*[@id="root"]/div[1]/div[2]/div/div/div[3]/div/div/div/div[3]/div[1]/div[2]/div/div/form/button'), 5000)); + // await driver.findElement(By.xpath('//*[@id="root"]/div[1]/div[2]/div/div/div[3]/div/div/div/div[3]/div[1]/div[2]/div/div/form/button')).click() + // // 9 | click | css=.notification-content-information > .d-flex:nth-child(1) | + //await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(1)")).click() + // 10 | assertText | css=.text-capitalize | Limit Buy + assert(await driver.findElement(By.css(".text-capitalize")).getText() == "Limit Buy") + // 11 | click | css=.notification-content-information > .d-flex:nth-child(2) | + await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2)")).click() + // 12 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT + assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).getText() == "1 XHT") + // 13 | click | css=.notification-content-information > .d-flex:nth-child(3) | + await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(3)")).click() + // 14 | assertText | css=.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2) | 0.9 USDT + assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)")).getText() == "0.9 USDT") + // 15 | click | css=.d-flex > .holla-button:nth-child(3) | + sleep(2000) + await driver.findElement(By.css(".d-flex > .holla-button:nth-child(3)")).click() + }) + + it('Limit sell', async function(){ + + + // Test name: Untitled + // Step # | name | target | value + // 1 | click | css=.holla-button-font:nth-child(2) | + await driver.findElement(By.css(".holla-button-font:nth-child(2)")).click() + // 2 | click | css=.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1) | + await driver.findElement(By.css(".trade-col_action_wrapper > .trade_block-wrapper:nth-child(1)")).click() + // 3 | storeValue | name=price | value + value = await driver.findElement(By.name("price")).getAttribute("value") + // await console.log(typeof(value)); + // await console.log(value) + // 4 | click | name=stop | + await driver.findElement(By.name("stop")).click() + // 5 | type | name=stop | value - 0.01 + // await driver.findElement(By.name("stop")).sendKeys(String(value - 0.1 )) + await driver.findElement(By.name("stop")).sendKeys(0.8) + // 6 | click | name=size | + await driver.findElement(By.name("size")).click() + await driver.findElement(By.name("size")).sendKeys(1) + // 7 | sendKeys | name=size | ${KEY_ENTER} + await driver.findElement(By.name("size")).sendKeys(Key.ENTER) + // // 8 | type | name=stop | 0.8 + // await driver.findElement(By.name("stop")).sendKeys("0.8") + // 9 | click | css=.notification-content-information > .d-flex:nth-child(1) | + await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(1)")).click() + // 10 | assertText | css=.d-flex:nth-child(1) > .text_disabled | Food type: + assert(await driver.findElement(By.css(".text-capitalize")).getText() == "Limit Sell") + // 11 | click | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | + await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).click() + // 12 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT + assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).getText() == "1 XHT") + // 13 | click | css=.notification-content-information > .d-flex:nth-child(3) | + await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(3)")).click() + // 14 | assertText | css=.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2) | 0.9 USDT + assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)")).getText() == "0.9 USDT") + // 15 | click | css=.d-flex > .holla-button:nth-child(3) | + await driver.findElement(By.css(".d-flex > .holla-button:nth-child(3)")).click() + }) + + it('Market Buy', async function(){ + + await driver.findElement(By.css(".text-center:nth-child(1)")).click() + await driver.findElement(By.css(".holla-button-font:nth-child(1)")).click() + // 4 | click | name=stop | + await driver.findElement(By.name("stop")).click() + // 5 | type | name=stop | 1 + await driver.findElement(By.name("stop")).sendKeys("1") + // 6 | click | name=size | + await driver.findElement(By.name("size")).click() + // 8 | type | name=size | 1 + await driver.findElement(By.name("size")).sendKeys("1") + // 9 | sendKeys | name=size | ${KEY_ENTER} + await driver.findElement(By.name("size")).sendKeys(Key.ENTER) + // 10 | click | css=.notification-content-information > .d-flex:nth-child(1) | + await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(1)")).click() + // 11 | assertText | css=.text-capitalize | Market Buy + assert(await driver.findElement(By.css(".text-capitalize")).getText() == "Market Buy") + // 14 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT + assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).getText() == "1 XHT") + // 15 | click | css=.d-flex > .holla-button:nth-child(3) | + await driver.findElement(By.css(".d-flex > .holla-button:nth-child(3)")).click() + }) + +it('Market Sell', async function(){ + + // 1 | click | css=.text-center:nth-child(1) | | + await driver.findElement(By.css(".text-center:nth-child(1)")).click() + // 2 | click | css=.holla-button-font:nth-child(2) | | + await driver.findElement(By.css(".holla-button-font:nth-child(2)")).click() + // 3 | click | css=.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1) | | + await driver.findElement(By.css(".trade-col_action_wrapper > .trade_block-wrapper:nth-child(1)")).click() + // 4 | click | name=size | | + + await driver.findElement(By.name("stop")).click() + // 5 | type | name=stop | 0.8 | + await driver.findElement(By.name("stop")).sendKeys("0.8") + + await driver.findElement(By.name("size")).click() + // 5 | type | name=size | 1 | + await driver.findElement(By.name("size")).sendKeys("1") + // 6 | sendKeys | name=size | ${KEY_ENTER} | + await driver.findElement(By.name("size")).sendKeys(Key.ENTER) + + // 8 | verifyText | css=.text-capitalize | Market Sell | + assert(await driver.findElement(By.css(".text-capitalize")).getText() == "Market Sell") + // 9 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT | + assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).getText() == "1 XHT") + // 10 | click | css=.d-flex > .holla-button:nth-child(3) | | + await driver.findElement(By.css(".d-flex > .holla-button:nth-child(3)")).click() + + + }) +}) From 0870a708e98f9c40784a170068119c6d9e3a4f35 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Tue, 15 Jun 2021 03:45:41 +0800 Subject: [PATCH 010/222] Create DW_flow.js --- test/Wallet/DW_flow.js | 193 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 test/Wallet/DW_flow.js diff --git a/test/Wallet/DW_flow.js b/test/Wallet/DW_flow.js new file mode 100644 index 0000000000..33cbc78d65 --- /dev/null +++ b/test/Wallet/DW_flow.js @@ -0,0 +1,193 @@ +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const { expect } = require('chai'); +const { Console } = require('console'); + +describe('Internal D/W Flow', function() { + this.timeout(30000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + async function waitForWindow(timeout = 2) { + await driver.sleep(timeout) + const handlesThen = vars["windowHandles"] + const handlesNow = await driver.getAllWindowHandles() + if (handlesNow.length > handlesThen.length) { + return handlesNow.find(handle => (!handlesThen.includes(handle))) + } + throw new Error("New window did not appear before timeout") + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + }) + afterEach(async function() { + // await driver.quit(); + }) + it('From Alice to Bob', async function() { + + console.log(" Test name: BobLogIn"); + await driver.get("https://sandbox.hollaex.com/login"); + await driver.sleep(5000); + const title = await driver.getTitle(); + console.log(title) + expect(title).to.equal(title); + console.log("entring sand box"); + console.log(" Step # | action | target | value"); + + console.log(" 1 | type | name=email | alice@gmail.com"); + await driver.wait(until.elementLocated(By.name("email")), 5000) + await driver.findElement(By.name("email")).sendKeys("alice@gmail.com"); + + console.log(" 2 | type | name=password | Holla!"); + await driver.wait(until.elementLocated(By.name("password")), 5000) + await driver.findElement(By.name("password")).sendKeys("Holla!"); + + console.log(" 3 | click | css=.auth_wrapper | "); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(".auth_wrapper"))), 5000); + await driver.findElement(By.css(".auth_wrapper")).click(); + console.log(" 4 | verifyElementPresent | css=.holla-button |"); + { + const elements = await driver.findElements(By.css(".holla-button")); + // assert(elements.length); + expect(elements.length); + } + + console.log(" 5 | click | css=.holla-button | "); + await driver.findElement(By.css(".holla-button")).click(); + await sleep(5000); + + // 11 | click | css=.d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container | + await driver.findElement(By.css(".d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container")).click() + // 12 | click | name=search-assets | + await driver.findElement(By.name("search-assets")).click() + // 13 | type | name=search-assets | Hollaex + await driver.findElement(By.name("search-assets")).sendKeys("Hollaex") + // 14 | sendKeys | name=search-assets | ${KEY_ENTER} + await driver.findElement(By.name("search-assets")).sendKeys(Key.ENTER) + // 15 | click | css=.csv-action:nth-child(2) > .action_notification-text | + await driver.findElement(By.css(".csv-action:nth-child(2) > .action_notification-text")).click() + // 16 | click | name=address | + await driver.findElement(By.name("address")).click() + // 17 | type | name=address | 0xef8a8e2053523fc989feb884f052726db5568ff6 + await driver.findElement(By.name("address")).sendKeys("0xef8a8e2053523fc989feb884f052726db5568ff6") + // 18 | click | css=.with-notification .field-label-wrapper:nth-child(1) | + await driver.findElement(By.css(".with-notification .field-label-wrapper:nth-child(1)")).click() + // 19 | click | name=amount | + await driver.findElement(By.name("amount")).click() + // 20 | type | name=amount | 1 + await driver.findElement(By.name("amount")).sendKeys("1") + // 21 | click | css=.holla-button | + await driver.findElement(By.css(".holla-button")).click() + // 22 | click | css=.button-fail | + await driver.findElement(By.css(".button-fail")).click() + // 23 | click | css=.holla-button | + await driver.findElement(By.css(".holla-button")).click() + // 24 | click | css=.button-success | + await driver.findElement(By.css(".button-success")).click() + await sleep(2000) + // // 25 | click | css=.ReactModal__Content | + // await driver.findElement(By.css(".ReactModal__Content")).click() + // 26 | assertText | css=.d-flex > .icon_title-wrapper .icon_title-text | Confirm Via Email + assert(await driver.findElement(By.css(".d-flex > .icon_title-wrapper .icon_title-text")).getText() == "Confirm Via Email") + // 27 | click | css=.holla-button:nth-child(3) | + + await driver.findElement(By.css(".holla-button:nth-child(3)")).click() + }) + + it('Gmailcheck', async function() { + console.log("1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |"); + await driver.get("https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin"); + + console.log("2 | setWindowSize | 1050x660 | "); + await driver.manage().window().setRect(1050, 660); + + console.log("3 | type&Enter | id=identifierId | youremail@gmail.com"); + await driver.findElement(By.id("identifierId")).sendKeys("alice@gmail.com"); + await driver.findElement(By.id("identifierId")).sendKeys(Key.ENTER); + + console.log("4 | wait | name=password | Holla!"); + await driver.wait(until.elementsLocated(By.name("password"),30000,"wait", 5000)); + console.log("sleep well for 10"); + await sleep(5000); + + console.log("5 | type&Enter | id=password| your password!"); + await driver.findElement(By.name("password")).sendKeys("Holla!"); + await driver.findElement(By.name("password")).sendKeys(Key.ENTER); + + console.log("sleep well for 5"); + await sleep(5000); + + console.log("6 | click | linkText=Refresh | "); + await driver.findElement(By.linkText("Refresh")).click() + await driver.findElement(By.css("h3:nth-child(4) font")).click() + // 4 | click | css=.ts > b | + await driver.findElement(By.css(".ts > b")).click() + // 5 | click | css=td:nth-child(2) > table > tbody:nth-child(1) > tr > td:nth-child(2) | + await driver.findElement(By.css("td:nth-child(2) > table > tbody:nth-child(1) > tr > td:nth-child(2)")).click() + // 6 | assertText | css=h2 b | sandbox XHT Withdrawal Request + assert(await driver.findElement(By.css("h2 b")).getText() == "sandbox XHT Withdrawal Request") + // 7 | click | css=div:nth-child(4) button | + vars["windowHandles"] = await driver.getAllWindowHandles() + // 8 | selectWindow | handle=${win4296} | + await driver.findElement(By.css("div:nth-child(4) button")).click() + // 9 | click | css=.app-bar-account-content > div:nth-child(2) | + vars["win4296"] = await waitForWindow(2000) + // 10 | click | css=.withdrawal-confirm-warpper | + await driver.switchTo().window(vars["win4296"]) + // 11 | click | css=.app-bar-account-content > div:nth-child(2) | + await driver.findElement(By.css(".app-bar-account-content > div:nth-child(2)")).click() + // 12 | click | css=.app-bar-account-menu-list:nth-child(11) > .edit-wrapper__container:nth-child(3) | + await driver.findElement(By.css(".withdrawal-confirm-warpper")).click() + await driver.findElement(By.css(".icon_title-text")).click() + assert(await driver.findElement(By.css(".icon_title-text")).getText() == "Success") + }) + it('BobLogin', async function() { + console.log(" Test name: BobLogIn"); + await driver.get("https://sandbox.hollaex.com/login"); + await driver.sleep(5000); + const title = await driver.getTitle(); + console.log(title) + expect(title).to.equal(title); + console.log("entring sand box"); + console.log(" Step # | action | target | value"); + + console.log(" 1 | type | name=email | bob@gmail.com"); + await driver.wait(until.elementLocated(By.name("email")), 5000) + await driver.findElement(By.name("email")).sendKeys("bob@gmail.com"); + + console.log(" 2 | type | name=password | Holla!"); + await driver.wait(until.elementLocated(By.name("password")), 5000) + await driver.findElement(By.name("password")).sendKeys("Holla!"); + + console.log(" 3 | click | css=.auth_wrapper | "); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(".auth_wrapper"))), 5000); + await driver.findElement(By.css(".auth_wrapper")).click(); + console.log(" 4 | verifyElementPresent | css=.holla-button |"); + { + const elements = await driver.findElements(By.css(".holla-button")); + // assert(elements.length); + expect(elements.length); + } + + console.log(" 5 | click | css=.holla-button | "); + await driver.findElement(By.css(".holla-button")).click(); + await sleep(5000); + // 8 | click | css=.d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container | + await driver.findElement(By.css(".d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container")).click() + // 9 | click | name=search-assets | + await driver.findElement(By.name("search-assets")).click() + // 10 | type | name=search-assets | hollaex + await driver.findElement(By.name("search-assets")).sendKeys("hollaex") + // 11 | sendKeys | name=search-assets | ${KEY_ENTER} + await driver.findElement(By.name("search-assets")).sendKeys(Key.ENTER) + // 12 | click | css=.td-amount > .d-flex | + await driver.findElement(By.css(".td-amount > .d-flex")).click() + // 13 | assertText | css=.mr-4 | 1 XHT + assert(await driver.findElement(By.css(".mr-4")).getText() == "1 XHT") + }) +}) \ No newline at end of file From 4c3f418fe6137223364e46e2a0d2c41f46bc0834 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Tue, 15 Jun 2021 03:45:46 +0800 Subject: [PATCH 011/222] Create wallet.js --- test/Wallet/wallet.js | 111 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 test/Wallet/wallet.js diff --git a/test/Wallet/wallet.js b/test/Wallet/wallet.js new file mode 100644 index 0000000000..58045058c5 --- /dev/null +++ b/test/Wallet/wallet.js @@ -0,0 +1,111 @@ + +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const { expect } = require('chai'); +const { Console } = require('console'); + +describe('LogIn', function() { + this.timeout(30000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + console.log(" Test name: BobLogIn"); + await driver.get("https://sandbox.hollaex.com/login"); + await driver.sleep(5000); + const title = await driver.getTitle(); + console.log(title) + expect(title).to.equal(title); + console.log("entring sand box"); + console.log(" Step # | action | target | value"); + + console.log(" 1 | type | name=email | bob@gmail.com"); + await driver.wait(until.elementLocated(By.name("email")), 5000) + await driver.findElement(By.name("email")).sendKeys("bob@gmail.com"); + + console.log(" 2 | type | name=password | Holla!"); + await driver.wait(until.elementLocated(By.name("password")), 5000) + await driver.findElement(By.name("password")).sendKeys("Holla!"); + + console.log(" 3 | click | css=.auth_wrapper | "); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(".auth_wrapper"))), 5000); + await driver.findElement(By.css(".auth_wrapper")).click(); + console.log(" 4 | verifyElementPresent | css=.holla-button |"); + { + const elements = await driver.findElements(By.css(".holla-button")); + // assert(elements.length); + expect(elements.length); + } + + console.log(" 5 | click | css=.holla-button | "); + await driver.findElement(By.css(".holla-button")).click(); + await sleep(5000); + }) + afterEach(async function() { + await driver.quit(); + }) + it('ETH', async function() { + + + await driver.get("https://sandbox.hollaex.com/wallet"); + await sleep(5000); + await driver.findElement(By.name("search-assets")).click() + // 3 | type | name=search-assets | USDT + await driver.findElement(By.name("search-assets")).sendKeys("USDT") + // 4 | sendKeys | name=search-assets | ${KEY_ENTER} + await driver.findElement(By.name("search-assets")).sendKeys(Key.ENTER) + // 5 | click | css=.action-button-wrapper:nth-child(1) > .action_notification-text | + await driver.findElement(By.css(".action-button-wrapper:nth-child(1) > .action_notification-text")).click() + // 6 | click | css=.dropdown-placeholder | + await driver.findElement(By.css(".dropdown-placeholder")).click() + // 7 | click | id=network-eth-0 | + await driver.findElement(By.id("network-eth-0")).click() + // 8 | click | css=.holla-button | + await driver.findElement(By.css(".holla-button")).click() + // 9 | click | css=.font-weight-bold | + await driver.findElement(By.css(".font-weight-bold")).click() + // 10 | assertText | css=.font-weight-bold > .edit-wrapper__container | Generate USD Tether Wallet + assert(await driver.findElement(By.css(".font-weight-bold > .edit-wrapper__container")).getText() == "Generate USD Tether Wallet") + // 11 | click | css=.holla-button:nth-child(3) | + await driver.findElement(By.css(".holla-button:nth-child(3)")).click() + // 12 | click | css=.dumb-field-wrapper .field-label-wrapper > .d-flex | + await driver.findElement(By.css(".dumb-field-wrapper .field-label-wrapper > .d-flex")).click() + // 13 | assertText | css=.dumb-field-wrapper .d-flex > .field-label | Your USD Tether receiving address + assert(await driver.findElement(By.css(".dumb-field-wrapper .d-flex > .field-label")).getText() == "Your USD Tether receiving address") + }) + it('TRX', async function() { + + + await driver.get("https://sandbox.hollaex.com/wallet"); + await sleep(5000); + await driver.findElement(By.name("search-assets")).click() + // 3 | type | name=search-assets | USDT + await driver.findElement(By.name("search-assets")).sendKeys("USDT") + // 4 | sendKeys | name=search-assets | ${KEY_ENTER} + await driver.findElement(By.name("search-assets")).sendKeys(Key.ENTER) + // 5 | click | css=.action-button-wrapper:nth-child(1) > .action_notification-text | + await driver.findElement(By.css(".action-button-wrapper:nth-child(1) > .action_notification-text")).click() + // 6 | click | css=.dropdown-placeholder | + await driver.findElement(By.css(".dropdown-placeholder")).click() + // 7 | click | id=network-eth-0 | + await driver.findElement(By.id("network-trx-1")).click() + // 8 | click | css=.holla-button | + await driver.findElement(By.css(".holla-button")).click() + // 9 | click | css=.font-weight-bold | + await driver.findElement(By.css(".font-weight-bold")).click() + // 10 | assertText | css=.font-weight-bold > .edit-wrapper__container | Generate USD Tether Wallet + assert(await driver.findElement(By.css(".font-weight-bold > .edit-wrapper__container")).getText() == "Generate USD Tether Wallet") + // 11 | click | css=.holla-button:nth-child(3) | + await driver.findElement(By.css(".holla-button:nth-child(3)")).click() + // 12 | click | css=.dumb-field-wrapper .field-label-wrapper > .d-flex | + await driver.findElement(By.css(".dumb-field-wrapper .field-label-wrapper > .d-flex")).click() + // 13 | assertText | css=.dumb-field-wrapper .d-flex > .field-label | Your USD Tether receiving address + assert(await driver.findElement(By.css(".dumb-field-wrapper .d-flex > .field-label")).getText() == "Your USD Tether receiving address") + }) +}) From 929c55b9824767c7ebb906566d51f54292abbf02 Mon Sep 17 00:00:00 2001 From: Ali Beikverdi Date: Tue, 15 Jun 2021 14:27:14 +0900 Subject: [PATCH 012/222] added env to test --- test/.env | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 test/.env diff --git a/test/.env b/test/.env new file mode 100644 index 0000000000..a76130927c --- /dev/null +++ b/test/.env @@ -0,0 +1,2 @@ +EMAIL= +PASSWORD= From 13a04954aa1b9c5082241f53ea2dcc00d45c4294 Mon Sep 17 00:00:00 2001 From: Ali Beikverdi Date: Tue, 15 Jun 2021 14:27:44 +0900 Subject: [PATCH 013/222] package.json fix --- test/package.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/test/package.json b/test/package.json index 5bd5843664..beee6acda8 100644 --- a/test/package.json +++ b/test/package.json @@ -10,11 +10,10 @@ "license": "MIT", "keywords": [], "dependencies": { - - "selenium-webdriver": "^4.0.0-beta.3 + "selenium-webdriver": "4.0.0-beta.3" }, "devDependencies": { - "chai": "^4.3.4", - "mocha": "^8.4.0" + "chai": "4.3.4", + "mocha": "8.4.0" } } From 1110460cbebf0301ff09889c71064388b7b19fa9 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Tue, 22 Jun 2021 13:36:43 +0800 Subject: [PATCH 014/222] initial tests --- test/.env | 16 + test/.eslintrc.json | 20 + test/.gitignore | 1 + test/.prettierrc.json | 8 + test/Onboarding/LogIn.js | 129 +- test/Onboarding/LogOut.js | 132 +- test/Onboarding/ResendVerificationEmail.js | 199 +- test/Onboarding/ResetPassword.js | 197 +- test/Onboarding/SignUp.js | 221 +- test/README.md | 8 + test/Trade/CancelOrders.js | 161 +- test/Trade/trade.js | 360 +- test/Trade/tradeWithStop.js | 357 +- test/Wallet/DW_flow.js | 348 +- test/Wallet/wallet.js | 204 +- test/gmailLogin.js | 125 + test/index.js | 36 + test/package-lock.json | 7798 ++++++++++++++++++++ test/package.json | 19 +- 19 files changed, 9239 insertions(+), 1100 deletions(-) create mode 100644 test/.eslintrc.json create mode 100644 test/.gitignore create mode 100644 test/.prettierrc.json create mode 100644 test/README.md create mode 100644 test/gmailLogin.js create mode 100644 test/index.js create mode 100644 test/package-lock.json diff --git a/test/.env b/test/.env index a76130927c..3a19e54d3d 100644 --- a/test/.env +++ b/test/.env @@ -1,2 +1,18 @@ +<<<<<<< HEAD +NODE_ENV = +USER_NAME = +ADMIN_USER = +ADMIN_PASS = +NEW_USER = +PASSWORD = +WEBSITE = +LOGIN_PAGE = +SIGN_UP_PAGE = +EMAIL_PAGE = +Email_ADMIN_USERNAME = +ALICE = +BOB = +======= EMAIL= PASSWORD= +>>>>>>> 13a04954aa1b9c5082241f53ea2dcc00d45c4294 diff --git a/test/.eslintrc.json b/test/.eslintrc.json new file mode 100644 index 0000000000..c5624c4e5c --- /dev/null +++ b/test/.eslintrc.json @@ -0,0 +1,20 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 12, + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + } +} diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 0000000000..c37ece228b --- /dev/null +++ b/test/.gitignore @@ -0,0 +1 @@ +.env.example diff --git a/test/.prettierrc.json b/test/.prettierrc.json new file mode 100644 index 0000000000..9d38e0ceec --- /dev/null +++ b/test/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "tabWidth": 3, + "useTabs": true, + "semi": true, + "singleQuote": true, + "bracketSpacing": true, + "arrowParens": "always" +} diff --git a/test/Onboarding/LogIn.js b/test/Onboarding/LogIn.js index c41cea6a96..ac5146b61d 100644 --- a/test/Onboarding/LogIn.js +++ b/test/Onboarding/LogIn.js @@ -1,67 +1,78 @@ - -const { Builder, By, Key, until } = require('selenium-webdriver'); -const assert = require('assert'); +//testing the login function of Hollaex Kit +//Using Selenium webderiver and Mocha/Chai +//given, when and then +const { Builder, By, until } = require('selenium-webdriver'); const { expect } = require('chai'); const { Console } = require('console'); +const dotenv = require('dotenv'); +dotenv.config(); +let userName = process.env.USER_NAME; +let passWord = process.env.PASSWORD; +let logInPage = process.env.LOGIN_PAGE; +if (process.env.NODE_ENV == 'test') { + console.log('Variables are defined'); + } describe('BobLogIn', function() { - this.timeout(30000); - let driver; - let vars; - function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); - } - beforeEach(async function() { - driver = await new Builder().forBrowser('chrome').build(); - vars = {}; - }) - afterEach(async function() { - // await driver.quit(); - }) - it('Simple log in', async function() { - - console.log(" Test name: BobLogIn"); - await driver.get("https://sandbox.hollaex.com/login"); - await driver.sleep(5000); - const title = await driver.getTitle(); - console.log(title) - expect(title).to.equal(title); - console.log("entring sand box"); - console.log(" Step # | action | target | value"); - - console.log(" 1 | type | name=email | bob@gmail.com"); - await driver.wait(until.elementLocated(By.name("email")), 5000) - await driver.findElement(By.name("email")).sendKeys("bob@gmail.com"); - - console.log(" 2 | type | name=password | Holla!"); - await driver.wait(until.elementLocated(By.name("password")), 5000) - await driver.findElement(By.name("password")).sendKeys("Holla!"); + this.timeout(30000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + }); + + afterEach(async function() { + //await driver.quit(); + }); + + it('Simple log in', async function() { +//Given User's data + console.log(' Test name : BobLogIn'); + console.log(logInPage); + await driver.get(logInPage); + await driver.sleep(5000); + const title = await driver.getTitle(); + console.log(title); + expect(title).to.equal(title); + console.log('entring', logInPage); + console.log(' Step # | action | target | value'); - console.log(" 3 | click | css=.auth_wrapper | "); - await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(".auth_wrapper"))), 5000); - await driver.findElement(By.css(".auth_wrapper")).click(); - console.log(" 4 | verifyElementPresent | css=.holla-button |"); - { - const elements = await driver.findElements(By.css(".holla-button")); - // assert(elements.length); - expect(elements.length); - } + console.log(' 1 | type | name=email |', userName); + await driver.wait(until.elementLocated(By.name('email')), 5000); + await driver.findElement(By.name('email')).sendKeys(userName); - console.log(" 5 | click | css=.holla-button | "); - await driver.findElement(By.css(".holla-button")).click(); - await sleep(5000); - console.log(" 6 | assertText | css=.app-bar-account-content > div:nth-child(2) | youremail@gmail.com"); - await driver.wait(until.elementLocated(By.css(".app-bar-account-content > div:nth-child(2)")), 20000) - await console.log(await driver.findElement(By.css(".app-bar-account-content > div:nth-child(2)")).getText()); - expect(await driver.findElement(By.css(".app-bar-account-content > div:nth-child(2)")).getText()).to.equal("bob@gmail.com") - // console.log(" 6 | click | css=.d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container | "); - // await driver.wait(until.elementLocated(By.css(".d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container")), 5000) - // await driver.findElement(By.css(".d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container")).click(); + console.log(' 2 | type | name=password | PASSWORD'); + await driver.wait(until.elementLocated(By.name('password')), 5000); + await driver.findElement(By.name('password')).sendKeys(passWord); - console.log(" 7 | close | | "); - //await driver.close(); + console.log(' 3 | click | css=.auth_wrapper | '); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.auth_wrapper'))), 5000); + await driver.findElement(By.css('.auth_wrapper')).click(); + console.log(' 4 | verifyElementPresent | css=.holla-button |'); + { + const elements = await driver.findElements(By.css('.holla-button')); + // assert(elements.length); + expect(elements.length); + } +//when login + console.log(' 5 | click | css=.holla-button | '); + await driver.findElement(By.css('.holla-button')).click(); + await sleep(5000); +//then the username should be as same as entered + console.log(' 6 | assertText | css=.app-bar-account-content > div:nth-child(2) |',userName); + await driver.wait(until.elementLocated(By.css('.app-bar-account-content > div:nth-child(2)')), 20000); + await console.log(await driver.findElement(By.css('.app-bar-account-content > div:nth-child(2)')).getText()); + expect(await driver.findElement(By.css('.app-bar-account-content > div:nth-child(2)')).getText()).to.equal(userName); + + console.log(' 7 | close | | '); + - }) -}) + }); +}); diff --git a/test/Onboarding/LogOut.js b/test/Onboarding/LogOut.js index b1c8be187e..67a5fbfcda 100644 --- a/test/Onboarding/LogOut.js +++ b/test/Onboarding/LogOut.js @@ -1,71 +1,79 @@ - +//testing the logout function of Hollaex Kit +//Using Selenium webderiver and Mocha/Chai +//given, when and then const { Builder, By, Key, until } = require('selenium-webdriver'); const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); - -describe('BobLogIn', function() { - this.timeout(30000); - let driver; - let vars; - function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); - } - beforeEach(async function() { - driver = await new Builder().forBrowser('chrome').build(); - vars = {}; - }) - afterEach(async function() { - // await driver.quit(); - }) - it('Simple log in', async function() { +const dotenv = require('dotenv'); +dotenv.config(); +let userName = process.env.USER_NAME; +let passWord = process.env.PASSWORD; +let logInPage = process.env.LOGIN_PAGE; +let signUpPage = process.env.SIGN_UP_PAGE; +let emailPage = process.env.EMAIL_PAGE; +if (process.env.NODE_ENV == 'test') { + console.log('Variables are defined'); + } +describe('BobLogOut', function() { + this.timeout(30000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + }); + afterEach(async function() { + // await driver.quit(); + }); + it('Simple log in', async function() { +//Given The user logged in + console.log(' Test name: BobLogIn'); + await driver.get(logInPage); + await driver.sleep(5000); + const title = await driver.getTitle(); + console.log(title); + expect(title).to.equal(title); + console.log('entring sand box'); + console.log(' Step # | action | target | value'); - console.log(" Test name: BobLogIn"); - await driver.get("https://sandbox.hollaex.com/login"); - await driver.sleep(5000); - const title = await driver.getTitle(); - console.log(title) - expect(title).to.equal(title); - console.log("entring sand box"); - console.log(" Step # | action | target | value"); + console.log(' 1 | type | name=email |',userName); + await driver.wait(until.elementLocated(By.name('email')), 5000); + await driver.findElement(By.name('email')).sendKeys(userName); - console.log(" 1 | type | name=email | bob@gmail.com"); - await driver.wait(until.elementLocated(By.name("email")), 5000) - await driver.findElement(By.name("email")).sendKeys("bob@gmail.com"); + console.log(' 2 | type | name=password | Password'); + await driver.wait(until.elementLocated(By.name('password')), 5000); + await driver.findElement(By.name('password')).sendKeys(passWord); - console.log(" 2 | type | name=password | Holla!"); - await driver.wait(until.elementLocated(By.name("password")), 5000) - await driver.findElement(By.name("password")).sendKeys("Holla!"); + console.log(' 3 | click | css=.auth_wrapper | '); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.auth_wrapper'))), 5000); + await driver.findElement(By.css('.auth_wrapper')).click(); + console.log(' 4 | verifyElementPresent | css=.holla-button |'); + { + const elements = await driver.findElements(By.css('.holla-button')); + expect(elements.length); + } - console.log(" 3 | click | css=.auth_wrapper | "); - await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(".auth_wrapper"))), 5000); - await driver.findElement(By.css(".auth_wrapper")).click(); - console.log(" 4 | verifyElementPresent | css=.holla-button |"); - { - const elements = await driver.findElements(By.css(".holla-button")); - // assert(elements.length); - expect(elements.length); - } - - console.log(" 5 | click | css=.holla-button | "); - await driver.findElement(By.css(".holla-button")).click(); - await sleep(5000); - console.log(" 6 | assertText | css=.app-bar-account-content > div:nth-child(2) | youremail@gmail.com"); - await driver.wait(until.elementLocated(By.css(".app-bar-account-content > div:nth-child(2)")), 20000) - await console.log(await driver.findElement(By.css(".app-bar-account-content > div:nth-child(2)")).getText()); - expect(await driver.findElement(By.css(".app-bar-account-content > div:nth-child(2)")).getText()).to.equal("bob@gmail.com") - // console.log(" 6 | click | css=.d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container | "); - // await driver.wait(until.elementLocated(By.css(".d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container")), 5000) - // await driver.findElement(By.css(".d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container")).click(); - await console.log("7 | click | css=.align-items-center:nth-child(9) |"); - await driver.findElement(By.css(".align-items-center:nth-child(9)")).click(); - console.log("8 | assertText | css=.icon_title-text | Login"); - expect(await driver.findElement(By.css(".icon_title-text")).getText()).to.equal( "Login"); - - console.log(" 9 | close | | "); - //await driver.close(); + console.log(' 5 | click | css=.holla-button | '); + await driver.findElement(By.css('.holla-button')).click(); + await sleep(5000); +//when it is confirmed the user logged in + console.log(' 6 | assertText | css=.app-bar-account-content > div:nth-child(2) |',userName); + await driver.wait(until.elementLocated(By.css('.app-bar-account-content > div:nth-child(2)')), 20000); + await console.log(await driver.findElement(By.css('.app-bar-account-content > div:nth-child(2)')).getText()); + expect(await driver.findElement(By.css('.app-bar-account-content > div:nth-child(2)')).getText()).to.equal(userName); +//Then Log out should happen + await console.log('7 | click | css=.align-items-center:nth-child(9) |'); + await driver.findElement(By.css('.align-items-center:nth-child(9)')).click(); + console.log('8 | assertText | css=.icon_title-text | Login'); + expect(await driver.findElement(By.css('.icon_title-text')).getText()).to.equal( 'Login'); + console.log(' 9 | close | | '); + - }) -}) + }); +}); diff --git a/test/Onboarding/ResendVerificationEmail.js b/test/Onboarding/ResendVerificationEmail.js index 43463749ac..d391f9ed02 100644 --- a/test/Onboarding/ResendVerificationEmail.js +++ b/test/Onboarding/ResendVerificationEmail.js @@ -1,104 +1,115 @@ -// Generated by Selenium IDE +//testing the login function of Hollaex Kit +//Using Selenium webderiver and Mocha/Chai +//given, when and then const { Builder, By, Key, until } = require('selenium-webdriver'); -const assert = require('assert'); const { expect } = require('chai'); +const { Console } = require('console'); +const dotenv = require('dotenv'); +dotenv.config(); +let userName = process.env.USER_NAME; +let passWord = process.env.PASSWORD; +let webSite = process.env.WEBSITE; + +if (process.env.NODE_ENV == 'test') { + console.log('Variables are defined'); +} describe('NewUserRequest', function() { - this.timeout(100000); - let driver; - let vars; - function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); - } - async function waitForWindow(timeout = 2) { - await driver.sleep(timeout) - const handlesThen = vars["windowHandles"] - const handlesNow = await driver.getAllWindowHandles() - if (handlesNow.length > handlesThen.length) { - return handlesNow.find(handle => (!handlesThen.includes(handle))) - } - throw new Error("New window did not appear before timeout") - } - beforeEach(async function() { - driver = await new Builder().forBrowser('chrome').build(); - vars = {}; - }) - afterEach(async function() { - // await driver.quit(); - - }) - it('ResendRequest', async function() { - console.log("Test name: NewUserRequest"); - console.log(" Step # | name | target | value"); - console.log("1 | open | https://sandbox.hollaex.com/verify | "); - await driver.get("https://sandbox.hollaex.com/verify"); - const title = await driver.getTitle(); - console.log(title) - expect(title).to.equal(title); - console.log("entring sand box"); - console.log(" Step # | action | target | value"); - console.log("2 | setWindowSize | 1050x660 | "); - - console.log("1| type | name=email | bob@gmail.com"); - await sleep(4000); - await driver.findElement(By.name("email")).sendKeys("bob@gmail.com"); - console.log("2| click | css=.holla-button |"); - await sleep(4000); - await driver.findElement(By.css(".holla-button")).click(); - await sleep(4000); - console.log("assertText | css=.icon_title-text | Resent Email"); - expect(await driver.findElement(By.css(".icon_title-text")).getText()).to.equal("Resent Email"); - - console.log("Test name: New User Email Confirmation"); - console.log("Step # | name | target | value"); - console.log("1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |"); - await driver.get("https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin"); - - console.log("2 | setWindowSize | 1050x660 | "); - await driver.manage().window().setRect(1050, 660); - - console.log("3 | type&Enter | id=identifierId | youremail@gmail.com"); - await driver.findElement(By.id("identifierId")).sendKeys("qabitholla@gmail.com"); - await driver.findElement(By.id("identifierId")).sendKeys(Key.ENTER); - - console.log("4 | wait | name=password | Holla!"); - await driver.wait(until.elementsLocated(By.name("password"),30000,"wait", 5000)); - console.log("sleep well for 10"); - await sleep(5000); - - console.log("5 | type&Enter | id=password| your password!"); - await driver.findElement(By.name("password")).sendKeys("Holla!"); - await driver.findElement(By.name("password")).sendKeys(Key.ENTER); + this.timeout(100000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + async function waitForWindow(timeout = 2) { + await driver.sleep(timeout); + const handlesThen = vars['windowHandles']; + const handlesNow = await driver.getAllWindowHandles(); + if (handlesNow.length > handlesThen.length) { + return handlesNow.find(handle => (!handlesThen.includes(handle))); + } + throw new Error('New window did not appear before timeout'); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + }); + afterEach(async function() { + // await driver.quit(); - console.log("sleep well for 5"); - await sleep(5000); + }); + it('ResendRequest', async function() { + console.log('Test name: NewUserRequest'); + console.log(' Step # | name | target | value'); + console.log('1 | open | https://yourwebsite/verify | '); + await driver.get(webSite+'verify'); + const title = await driver.getTitle(); + console.log(title); + expect(title).to.equal(title); + console.log('entring sand box'); + console.log(' Step # | action | target | value'); + console.log('2 | setWindowSize | 1050x660 | '); + + console.log('1| type | name=email | bob@gmail.com'); + await sleep(4000); + await driver.findElement(By.name('email')).sendKeys(userName); + console.log('2| click | css=.holla-button |'); + await sleep(4000); + await driver.findElement(By.css('.holla-button')).click(); + await sleep(4000); + console.log('assertText | css=.icon_title-text | Resent Email'); + expect(await driver.findElement(By.css('.icon_title-text')).getText()).to.equal('Resent Email'); - console.log("6 | click | linkText=Refresh | "); - await driver.findElement(By.linkText("Refresh")).click() + console.log('Test name: New User Email Confirmation'); + console.log('Step # | name | target | value'); + console.log('1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |'); + await driver.get('https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin'); + + console.log('2 | setWindowSize | 1050x660 | '); + await driver.manage().window().setRect(1050, 660); + + console.log('3 | type&Enter | id=identifierId | youremail@gmail.com'); + await driver.findElement(By.id('identifierId')).sendKeys(userName); + await driver.findElement(By.id('identifierId')).sendKeys(Key.ENTER); - console.log("7 | click | css=.ts | "); - await driver.findElement(By.css(".ts")).click(); - await driver.findElement(By.css(".h td")).click(); - - console.log(" 8 | assertText | css=h2 b | sandbox Sign Up"); - expect(await driver.findElement(By.css("h2 b")).getText()).to.equal("Fwd: sandbox Sign Up"); - console.log(" 9 | click | css=button | "); - vars["windowHandles"] = await driver.getAllWindowHandles(); - console.log("10 | selectWindow | handle=${win9509} | "); - await driver.findElement(By.css("button")).click() - console.log(" 11 | click | css=.icon_title-wrapper | "); - vars["win9509"] = await waitForWindow(5000) - console.log("12 | assertNotText | css=.icon_title-text | Error"); - await driver.switchTo().window(vars["win9509"]) - await driver.findElement(By.css(".icon_title-wrapper")).click(); - { - const text = await driver.findElement(By.css(".icon_title-text")).getText(); - expect(text).to.not.equal("Error"); - } + console.log('4 | wait | name=password | Holla!'); + await driver.wait(until.elementsLocated(By.name('password'),30000,'wait', 5000)); + console.log('sleep well for 10'); + await sleep(5000); + + console.log('5 | type&Enter | id=password| your password!'); + await driver.findElement(By.name('password')).sendKeys(passWord); + await driver.findElement(By.name('password')).sendKeys(Key.ENTER); + + console.log('sleep well for 5'); + await sleep(5000); + + console.log('6 | click | linkText=Refresh | '); + await driver.findElement(By.linkText('Refresh')).click(); + + console.log('7 | click | css=.ts | '); + await driver.findElement(By.css('.ts')).click(); + await driver.findElement(By.css('.h td')).click(); + console.log(' 8 | assertText | css=h2 b | sandbox Sign Up'); + expect(await driver.findElement(By.css('h2 b')).getText()).to.equal('sandbox Sign Up'); + console.log(' 9 | click | css=button | '); + vars['windowHandles'] = await driver.getAllWindowHandles(); + console.log('10 | selectWindow | handle=${win9509} | '); + await driver.findElement(By.css('button')).click(); + console.log(' 11 | click | css=.icon_title-wrapper | '); + vars['win9509'] = await waitForWindow(5000); + console.log('12 | assertNotText | css=.icon_title-text | Error'); + await driver.switchTo().window(vars['win9509']); + await driver.findElement(By.css('.icon_title-wrapper')).click(); + { + const text = await driver.findElement(By.css('.icon_title-text')).getText(); + expect(text).to.not.equal('Error'); + } + - }) -}) \ No newline at end of file + }); +}); \ No newline at end of file diff --git a/test/Onboarding/ResetPassword.js b/test/Onboarding/ResetPassword.js index 7e9650b515..d5ceb26f83 100644 --- a/test/Onboarding/ResetPassword.js +++ b/test/Onboarding/ResetPassword.js @@ -1,107 +1,118 @@ -// -const { Builder, By, Key, until, logging } = require('selenium-webdriver'); +//testing the login function of Hollaex Kit +//Using Selenium webderiver and Mocha/Chai +//given, when and then +const { Builder, By, Key, until } = require('selenium-webdriver'); const assert = require('assert'); const { expect } = require('chai'); +const { Console } = require('console'); +const dotenv = require('dotenv'); +dotenv.config(); +let userName = process.env.USER_NAME; +let passWord = process.env.PASSWORD; + +if (process.env.NODE_ENV == 'test') { + console.log('Variables are defined'); +} describe('NewUserRequest', function() { - this.timeout(100000) - let driver - let vars - function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); - } - async function waitForWindow(timeout = 2) { - await driver.sleep(timeout) - const handlesThen = vars["windowHandles"] - const handlesNow = await driver.getAllWindowHandles() - if (handlesNow.length > handlesThen.length) { - return handlesNow.find(handle => (!handlesThen.includes(handle))) - } - throw new Error("New window did not appear before timeout") - } - beforeEach(async function() { - driver = await new Builder().forBrowser('chrome').build() - vars = {} - }) - afterEach(async function() { - await driver.quit(); - }) - it('Rest Password', async function() { - console.log('// Test name: Reset Password') - // Step # | name | target | value - // 1 | open | https://sandbox.hollaex.com/reset-password | - await driver.get("https://sandbox.hollaex.com/reset-password") - // 2 | setWindowSize | 1050x660 | - await driver.manage().window().setRect(1050, 660) - // 3 | click | name=email | - await sleep(5000); - await driver.findElement(By.name("email")).click() - // 4 | type | name=email | bob@gmail.com - await driver.findElement(By.name("email")).sendKeys("bob@gmail.com") - // 5 | click | css=.holla-button | - await sleep(5000); - await driver.findElement(By.css(".holla-button")).click() - // 6 | click | css=.icon_title-wrapper | - await sleep(5000); - //await driver.findElement(By.css(".icon_title-wrapper")).click() - console.log("// 7 | assertText | css=.icon_title-text | Password Reset Sent"); - assert(await driver.findElement(By.css(".icon_title-text")).getText() == "Password Reset Sent") - // 8 | click | css=.holla-button:nth-child(1) | - driver.close(); - await sleep(10000); - driver = await new Builder().forBrowser('chrome').build(); - await sleep(10000); - console.log("Test name: New User Email Confirmation"); - console.log("Step # | name | target | value"); - console.log("1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |"); - await driver.get("https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin"); + this.timeout(100000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + async function waitForWindow(timeout = 2) { + await driver.sleep(timeout); + const handlesThen = vars['windowHandles']; + const handlesNow = await driver.getAllWindowHandles(); + if (handlesNow.length > handlesThen.length) { + return handlesNow.find(handle => (!handlesThen.includes(handle))); + } + throw new Error('New window did not appear before timeout'); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + }); + afterEach(async function() { + await driver.quit(); + }); + it('Rest Password', async function() { + console.log('// Test name: Reset Password'); + console.log(' Step # | name | target | value'); + console.log(' 1 | open | https://sandbox.hollaex.com/reset-password | '); + await driver.get('https://sandbox.hollaex.com/reset-password'); + console.log(' 2 | setWindowSize | 1050x660 | '); + await driver.manage().window().setRect(1050, 660); + console.log(' 3 | click | name=email | '); + await sleep(5000); + await driver.findElement(By.name('email')).click(); + console.log(' 4 | type | name=email | bob@gmail.com'); + await driver.findElement(By.name('email')).sendKeys(userName); + console.log(' 5 | click | css=.holla-button | '); + await sleep(5000); + await driver.findElement(By.css('.holla-button')).click(); + console.log(' 6 | click | css=.icon_title-wrapper | '); + await sleep(5000); + //console.log("await driver.findElement(By.css(".icon_title-wrapper")).click()"); + console.log(' 7 | assertText | css=.icon_title-text | Password Reset Sent'); + assert(await driver.findElement(By.css('.icon_title-text')).getText() == 'Password Reset Sent'); + console.log(' 8 | click | css=.holla-button:nth-child(1) | '); + driver.close(); + await sleep(10000); + driver = await new Builder().forBrowser('chrome').build(); + await sleep(10000); + console.log('Test name: New User Email Confirmation'); + console.log('Step # | name | target | value'); + console.log('1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |'); + await driver.get('https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin'); - console.log("2 | setWindowSize | 1050x660 | "); - await driver.manage().window().setRect(1050, 660); + console.log('2 | setWindowSize | 1050x660 | '); + await driver.manage().window().setRect(1050, 660); - console.log("3 | type&Enter | id=identifierId | youremail@gmail.com"); + console.log('3 | type&Enter | id=identifierId | youremail@gmail.com'); - await driver.findElement(By.id("identifierId")).sendKeys("alice@gmail.com"); - await sleep(10000); - await driver.findElement(By.id("identifierId")).sendKeys(Key.ENTER); + await driver.findElement(By.id('identifierId')).sendKeys(userName); + await sleep(10000); + await driver.findElement(By.id('identifierId')).sendKeys(Key.ENTER); - console.log("4 | wait | name=password | Holla!"); - await driver.wait(until.elementsLocated(By.name("password"),30000,"wait", 5000)); - console.log("sleep well for 10"); - await sleep(5000); + console.log('4 | wait | name=password | Holla!'); + await driver.wait(until.elementsLocated(By.name('password'),30000,'wait', 5000)); + console.log('sleep well for 10'); + await sleep(5000); - console.log("5 | type&Enter | id=password| your password!"); - await driver.findElement(By.name("password")).sendKeys("Holla!"); - await driver.findElement(By.name("password")).sendKeys(Key.ENTER); + console.log('5 | type&Enter | id=password| your password!'); + await driver.findElement(By.name('password')).sendKeys(passWord); + await driver.findElement(By.name('password')).sendKeys(Key.ENTER); - console.log("sleep well for 5"); - await sleep(5000); + console.log('sleep well for 5'); + await sleep(5000); - console.log("6 | click | linkText=Refresh | "); - await driver.findElement(By.linkText("Refresh")).click() + console.log('6 | click | linkText=Refresh | '); + await driver.findElement(By.linkText('Refresh')).click(); - console.log("7 | click | css=.ts | "); - await driver.findElement(By.css(".ts")).click(); - await driver.findElement(By.css(".h td")).click(); + console.log('7 | click | css=.ts | '); + await driver.findElement(By.css('.ts')).click(); + await driver.findElement(By.css('.h td')).click(); - assert(await driver.findElement(By.css("h2 b")).getText() == "Fwd: sandbox Reset Password Request") - // 6 | click | css=.gmail_attr | - await driver.findElement(By.css(".gmail_attr")).click() - // 7 | click | css=button | - vars["windowHandles"] = await driver.getAllWindowHandles() - // 8 | selectWindow | handle=${win3601} | - await driver.findElement(By.css("button")).click() - // 9 | type | name=password | Holla! - vars["win3601"] = await waitForWindow(2000) - // 10 | type | name=password_repeat | Hola2021! - await driver.switchTo().window(vars["win3601"]) - // 11 | click | css=.holla-button | - await driver.findElement(By.name("password")).sendKeys("Holla!") - await driver.findElement(By.name("password_repeat")).sendKeys("Hola2021!") - await driver.findElement(By.css(".holla-button")).click() - //logIN - }) -}) + assert(await driver.findElement(By.css('h2 b')).getText() == 'sandbox Reset Password Request'); + console.log(' 6 | click | css=.gmail_attr | '); + await driver.findElement(By.css('.gmail_attr')).click(); + console.log(' 7 | click | css=button | '); + vars['windowHandles'] = await driver.getAllWindowHandles(); + console.log(' 8 | selectWindow | handle=${win3601} | '); + await driver.findElement(By.css('button')).click(); + console.log(' 9 | type | name=password | password!'); + vars['win3601'] = await waitForWindow(2000); + console.log(' 10 | type | name=password_repeat | password'); + await driver.switchTo().window(vars['win3601']); + console.log(' 11 | click | css=.holla-button | '); + await driver.findElement(By.name('password')).sendKeys(passWord); + await driver.findElement(By.name('password_repeat')).sendKeys(passWord); + await driver.findElement(By.css('.holla-button')).click(); + console.log('logIN'); + }); +}); diff --git a/test/Onboarding/SignUp.js b/test/Onboarding/SignUp.js index 249c76c644..096a7b0eab 100644 --- a/test/Onboarding/SignUp.js +++ b/test/Onboarding/SignUp.js @@ -1,101 +1,132 @@ -// Generated by Selenium IDE -const { Builder, By, Key, until } = require('selenium-webdriver'); +//testing the login function of Hollaex Kit +//Using Selenium webderiver and Mocha/Chai +//given, when and then +const { Builder, By, until } = require('selenium-webdriver'); const assert = require('assert'); const { expect } = require('chai'); - +const { Console } = require('console'); +var randomstring = require('randomstring'); +const dotenv = require('dotenv'); +dotenv.config(); +let User = process.env.NEW_USER; +let passWord = process.env.PASSWORD; +let signUpPage = process.env.SIGN_UP_PAGE; +let emailAdmin =process.env.Email_ADMIN_USERNAME; +const newUser = randomstring.generate(4)+'@'+User ; +console.log(newUser); describe('NewUserRequest', function() { - this.timeout(100000); - let driver; - let vars; - function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); - } - async function waitForWindow(timeout = 2) { - await driver.sleep(timeout) - const handlesThen = vars["windowHandles"] - const handlesNow = await driver.getAllWindowHandles() - if (handlesNow.length > handlesThen.length) { - return handlesNow.find(handle => (!handlesThen.includes(handle))) - } - throw new Error("New window did not appear before timeout") - } - beforeEach(async function() { - driver = await new Builder().forBrowser('chrome').build(); - vars = {}; - }) - afterEach(async function() { - // await driver.quit(); - - }) - it('ResendRequest', async function() { - console.log("Test name: NewUserRequest"); - console.log(" Step # | name | target | value"); - console.log("1 | open | https://sandbox.hollaex.com/verify | "); - await driver.get("https://sandbox.hollaex.com/"); - const title = await driver.getTitle(); - console.log(title) - expect(title).to.equal(title); - console.log("entring sand box"); - console.log(" Step # | action | target | value"); - console.log("2 | setWindowSize | 1050x660 | "); - - console.log("1| type | name=email | bob@gmail.com"); - await driver.findElement(By.name("email")).sendKeys("bob@gmail.com"); - console.log("2| click | css=.holla-button |"); - await driver.findElement(By.css(".holla-button")).click(); - console.log("assertText | css=.icon_title-text | Resent Email"); - expect(await driver.findElement(By.css(".icon_title-text")).getText()).to.equal("Resent Email"); - - console.log("Test name: New User Email Confirmation"); - console.log("Step # | name | target | value"); - console.log("1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |"); - await driver.get("https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin"); - - console.log("2 | setWindowSize | 1050x660 | "); - await driver.manage().window().setRect(1050, 660); - - console.log("3 | type&Enter | id=identifierId | youremail@gmail.com"); - await driver.findElement(By.id("identifierId")).sendKeys("qabitholla@gmail.com"); - await driver.findElement(By.id("identifierId")).sendKeys(Key.ENTER); - - console.log("4 | wait | name=password | Holla!"); - await driver.wait(until.elementsLocated(By.name("password"),30000,"wait", 5000)); - console.log("sleep well for 10"); - await sleep(5000); - - console.log("5 | type&Enter | id=password| your password!"); - await driver.findElement(By.name("password")).sendKeys("Holla!"); - await driver.findElement(By.name("password")).sendKeys(Key.ENTER); - - console.log("sleep well for 5"); - await sleep(5000); - - console.log("6 | click | linkText=Refresh | "); - await driver.findElement(By.linkText("Refresh")).click() - - console.log("7 | click | css=.ts | "); - await driver.findElement(By.css(".ts")).click(); - await driver.findElement(By.css(".h td")).click(); + this.timeout(100000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + }); + afterEach(async function() { + //await driver.quit(); - console.log(" 8 | assertText | css=h2 b | sandbox Sign Up"); - expect(await driver.findElement(By.css("h2 b")).getText()).to.equal("Fwd: sandbox Sign Up"); - console.log(" 9 | click | css=button | "); - vars["windowHandles"] = await driver.getAllWindowHandles(); - console.log("10 | selectWindow | handle=${win9509} | "); - await driver.findElement(By.css("button")).click() - console.log(" 11 | click | css=.icon_title-wrapper | "); - vars["win9509"] = await waitForWindow(5000) - console.log("12 | assertNotText | css=.icon_title-text | Error"); - await driver.switchTo().window(vars["win9509"]) - await driver.findElement(By.css(".icon_title-wrapper")).click(); - { - const text = await driver.findElement(By.css(".icon_title-text")).getText(); - expect(text).to.not.equal("Error"); - } - + }); + + it('NewUserRequest', async function() { + console.log('Test name: NewUserRequest'); + console.log(' Step # | name | target | value'); + console.log('1 | open | ',signUpPage); + await driver.get(signUpPage); + const title = await driver.getTitle(); + console.log(title); + expect(title).to.equal(title); + console.log('entring sand box'); + console.log(' Step # | action | target | value'); + console.log('2 | setWindowSize | 1050x660 | '); + await driver.manage().window().setRect(1050, 660); + + console.log('3 | type | name=email |',newUser); + await driver.wait(until.elementLocated(By.name('email')), 5000); + await driver.findElement(By.name('email')).clear(); + await driver.findElement(By.name('email')).sendKeys(newUser); + + console.log('4 | type | name=password | password!'); + await driver.findElement(By.name('password')).clear(); + await driver.findElement(By.name('password')).sendKeys(passWord); + + + console.log('5 | type | name=password_repeat | your password again!'); + await driver.findElement(By.name('password_repeat')).clear(); + await driver.findElement(By.name('password_repeat')).sendKeys(passWord); + await sleep(2000); + console.log('6 | click | name=terms |'); + await driver.findElement(By.name('terms')).click(); + await sleep(10000); + console.log('7 | click | css=.holla-button |'); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.holla-button'))), 50000); + await driver.findElement(By.css('.holla-button')).click(); + await driver.executeScript('window.scrollTo(0,0)'); - }) -}) \ No newline at end of file + + }); + it('Email Confirmation', async function() { + console.log('Test name: Confirmation'); + console.log('Step # | name | target | value'); + console.log('1 | open | /auth/?client_id=4534a10755c6fd46&redirect_uri=https%3A%2F%2Fwebmail.mail.us-west-2.awsapps.com%2Fworkmail%2F | '); + await driver.get('https://sahlabadi-website.awsapps.com/auth/?client_id=4534a10755c6fd46&redirect_uri=https%3A%2F%2Fwebmail.mail.us-west-2.awsapps.com%2Fworkmail%2F'); + console.log('2 | setWindowSize | 1280x680 |'); + await driver.manage().window().setRect(1280, 680); + console.log('3 | click | id=wdc_username |'); + await sleep(10000); + await driver.findElement(By.id('wdc_username')).click(); + console.log('4 | type | id=wdc_username | QA'); + await driver.findElement(By.id('wdc_username')).sendKeys(emailAdmin); + console.log('5 | click | id=wdc_password | '); + await driver.findElement(By.id('wdc_password')).click(); + console.log('6 | type | id=wdc_password | Password!'); + await driver.findElement(By.id('wdc_password')).sendKeys(passWord); + console.log('7 | click | id=wdc_login_button | '); + await driver.findElement(By.id('wdc_login_button')).click(); + console.log('8 | click | css=.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1) | '); + await driver.manage().window().maximize(); + await sleep(10000); + await driver.findElement(By.css('.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1)')).click(); + console.log('9 | doubleClick | css=.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1) | '); + { + const element = await driver.findElement(By.css('.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1)')); + await driver.actions({ bridge: true}).doubleClick(element).perform(); + } + console.log('10 | selectFrame | index=1 | '); + await driver.switchTo().frame(1); + await sleep(10000); + console.log('12 | storeText | xpath=/html/body/pre/a[22] | content'); + vars['content'] = await driver.findElement(By.xpath('/html/body/pre/a[22]')).getText(); + console.log('13 | echo | ${content} | '); + console.log(vars['content']); + console.log('14 | assertText | xpath=/html/body/pre/a[22] | ${content}'); + expect(vars['content']).to.equal(newUser.toLowerCase()); + + console.log('15 | storeAttribute | xpath=/html/body/pre/a[26]@href | mytextlink'); + { + const attribute = await driver.findElement(By.xpath('/html/body/pre/a[26]')).getAttribute('href'); + vars['mytextlink'] = attribute; + } + console.log('16 | echo | ${mytextlink} | '); + console.log(vars['mytextlink']); + console.log('17 | echo | \'xpath=/html/body/pre/a[26]\' | '); + console.log('\'xpath=/html/body/pre/a[26]\''); + console.log('18 | open | ${mytextlink} | '); + await driver.get(vars['mytextlink']); + console.log('19 | selectFrame | relative=parent | '); + await sleep(1000); + await driver.switchTo().defaultContent(); + console.log('20 | click | css=.icon_title-wrapper | '); + await driver.findElement(By.css('.icon_title-wrapper')).click(); + console.log('21 | assertNotText | css=.icon_title-text | Error'); + { + const text = await driver.findElement(By.css('.icon_title-text')).getText(); + assert(text !== 'Error'); + } + }); +}); \ No newline at end of file diff --git a/test/README.md b/test/README.md new file mode 100644 index 0000000000..4a1558bb50 --- /dev/null +++ b/test/README.md @@ -0,0 +1,8 @@ +## Get Started + +HollaEx Kit provides a simple (but powerful) E2E tool to help exchange operators test the exchange. Get started by install HollaEx TEST, then set the .env and run: + +mocha index.js + +you can run each test separately by running +moch path/filename \ No newline at end of file diff --git a/test/Trade/CancelOrders.js b/test/Trade/CancelOrders.js index e954ce569d..7bc17bdc46 100644 --- a/test/Trade/CancelOrders.js +++ b/test/Trade/CancelOrders.js @@ -1,79 +1,90 @@ -const { Builder, By, Key, until } = require('selenium-webdriver') -const assert = require('assert') - +//testing the login function of Hollaex Kit +//Using Selenium webderiver and Mocha/Chai +//given, when and then +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const { expect } = require('chai'); +const { Console } = require('console'); +const dotenv = require('dotenv'); +const { addConsoleHandler } = require('selenium-webdriver/lib/logging'); +dotenv.config(); +let userName = process.env.ADMIN_USER; +let passWord = process.env.ADMIN_PASS; +let logInPage = process.env.LOGIN_PAGE; describe('Orders', function() { - this.timeout(300000) - let driver - let vars - function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); - } - beforeEach(async function() { - driver = await new Builder().forBrowser('chrome').build(); - vars = {} - // Test name: Untitled - // Step # | name | target | value - // 1 | open | /account | - await driver.get("https://sandbox.hollaex.com/account"); - await sleep(10000); - // 2 | type | name=email | USER@bitholla.com - // await driver.wait(until.elementLocated(await driver.findElement(By.name("email"))), 5000); - await driver.findElement(By.name("email")).sendKeys("USER@bitholla.com"); - // 3 | type | name=password | bitholla@bitholla.com - //await driver.wait(until.elementLocated(await driver.findElement(By.name("password"))),5000); - await driver.findElement(By.name("password")).sendKeys("bitholla@bitholla.com"); - // 4 | click | name=email | + this.timeout(300000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + // Test name: Untitled + // Step # | name | target | value + // 1 | open | /account | + await driver.get(logInPage); + await sleep(10000); + // 2 | type | name=email | USER@bitholla.com + // await driver.wait(until.elementLocated(await driver.findElement(By.name("email"))), 5000); + await driver.findElement(By.name('email')).sendKeys(userName); + // 3 | type | name=password | bitholla@bitholla.com + //await driver.wait(until.elementLocated(await driver.findElement(By.name("password"))),5000); + await driver.findElement(By.name('password')).sendKeys(passWord); + // 4 | click | name=email | - await sleep(4000); - await driver.findElement(By.name("email")).click(); - // 5 | click | css=.holla-button | - await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(".holla-button"))), 50000); - await driver.findElement(By.css(".holla-button")).click(); - }) - afterEach(async function() { - await driver.quit(); - }) - it('Cancel Orders, all orders', async function() { - await sleep(4000); - await driver.findElement(By.css(".app-menu-bar-content:nth-child(2) .edit-wrapper__container")).click() - // 5 | click | name=Search Assets | | - await driver.findElement(By.name("Search Assets")).click() - // 6 | type | name=Search Assets | xht | - await driver.findElement(By.name("Search Assets")).sendKeys("xht") - // 7 | sendKeys | name=Search Assets | ${KEY_ENTER} | - await driver.findElement(By.name("Search Assets")).sendKeys(Key.ENTER) - // 8 | click | css=.trade_tab-pair-sub-title | | - await driver.findElement(By.css(".trade_tab-pair-sub-title")).click() - // 9 | click | name=size | | - await sleep(3000); + await sleep(4000); + await driver.findElement(By.name('email')).click(); + // 5 | click | css=.holla-button | + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.holla-button'))), 50000); + await driver.findElement(By.css('.holla-button')).click(); + }); + afterEach(async function() { + await driver.quit(); + }); + it('Cancel Orders, all orders', async function() { + await sleep(4000); + await driver.findElement(By.css('.app-menu-bar-content:nth-child(2) .edit-wrapper__container')).click(); + // 5 | click | name=Search Assets | | + await driver.findElement(By.name('Search Assets')).click(); + // 6 | type | name=Search Assets | xht | + await driver.findElement(By.name('Search Assets')).sendKeys('xht'); + // 7 | sendKeys | name=Search Assets | ${KEY_ENTER} | + await driver.findElement(By.name('Search Assets')).sendKeys(Key.ENTER); + // 8 | click | css=.trade_tab-pair-sub-title | | + await driver.findElement(By.css('.trade_tab-pair-sub-title')).click(); + // 9 | click | name=size | | + await driver.manage().window().maximize(); + await sleep(5000); - await driver.findElement(By.css(".active-menu .edit-wrapper__container")).click() - // 3 | click | css=.tabs-pair-details:nth-child(1) > .market-card__sparkline-wrapper | - await driver.findElement(By.css(".tabs-pair-details:nth-child(1) > .market-card__sparkline-wrapper")).click() - // 4 | click | css=.table_body-row:nth-child(1) .action_notification-text | - await driver.findElement(By.css(".table_body-row:nth-child(1) .action_notification-text")).click() - // 5 | click | css=.table_body-row:nth-child(1) .action_notification-text | - await driver.findElement(By.css(".table_body-row:nth-child(1) .action_notification-text")).click() - // 6 | click | css=.table_body-row:nth-child(1) .action_notification-text | - await driver.findElement(By.css(".table_body-row:nth-child(1) .action_notification-text")).click() - // 7 | click | css=.table_body-row:nth-child(1) .action_notification-text | - await driver.findElement(By.css(".table_body-row:nth-child(1) .action_notification-text")).click() - // 8 | click | css=.table_body-row:nth-child(1) .action_notification-text | - await driver.findElement(By.css(".table_body-row:nth-child(1) .action_notification-text")).click() - // 9 | click | css=.table_body-row:nth-child(1) .action_notification-text | - await driver.findElement(By.css(".table_body-row:nth-child(1) .action_notification-text")).click() - // 10 | click | css=.table_body-row:nth-child(1) .action_notification-text | - await driver.findElement(By.css(".table_body-row:nth-child(1) .action_notification-text")).click() - // 11 | click | css=.trade__active-orders_cancel-All .action_notification-text | - await driver.findElement(By.css(".trade__active-orders_cancel-All .action_notification-text")).click() - // 12 | click | css=.icon_title-text | - await driver.findElement(By.css(".icon_title-text")).click() - // 13 | assertText | css=.icon_title-text | Cancel Orders - assert(await driver.findElement(By.css(".icon_title-text")).getText() == "Cancel Orders") - // 14 | click | css=.w-100 > .holla-button:nth-child(3) | - await driver.findElement(By.css(".w-100 > .holla-button:nth-child(3)")).click() - }) + await driver.findElement(By.css('.active-menu .edit-wrapper__container')).click(); + // 3 | click | css=.tabs-pair-details:nth-child(1) > .market-card__sparkline-wrapper | + await driver.findElement(By.css('.tabs-pair-details:nth-child(1) > .market-card__sparkline-wrapper')).click(); + // 4 | click | css=.table_body-row:nth-child(1) .action_notification-text | + await driver.findElement(By.css('.table_body-row:nth-child(1) .action_notification-text')).click(); + // 5 | click | css=.table_body-row:nth-child(1) .action_notification-text | + await driver.findElement(By.css('.table_body-row:nth-child(1) .action_notification-text')).click(); + // 6 | click | css=.table_body-row:nth-child(1) .action_notification-text | + await driver.findElement(By.css('.table_body-row:nth-child(1) .action_notification-text')).click(); + // 7 | click | css=.table_body-row:nth-child(1) .action_notification-text | + await driver.findElement(By.css('.table_body-row:nth-child(1) .action_notification-text')).click(); + // 8 | click | css=.table_body-row:nth-child(1) .action_notification-text | + await driver.findElement(By.css('.table_body-row:nth-child(1) .action_notification-text')).click(); + // 9 | click | css=.table_body-row:nth-child(1) .action_notification-text | + await driver.findElement(By.css('.table_body-row:nth-child(1) .action_notification-text')).click(); + // 10 | click | css=.table_body-row:nth-child(1) .action_notification-text | + await driver.findElement(By.css('.table_body-row:nth-child(1) .action_notification-text')).click(); + // 11 | click | css=.trade__active-orders_cancel-All .action_notification-text | + await driver.findElement(By.css('.trade__active-orders_cancel-All .action_notification-text')).click(); + // 12 | click | css=.icon_title-text | + await driver.findElement(By.css('.icon_title-text')).click(); + // 13 | assertText | css=.icon_title-text | Cancel Orders + assert(await driver.findElement(By.css('.icon_title-text')).getText() == 'Cancel Orders'); + // 14 | click | css=.w-100 > .holla-button:nth-child(3) | + await driver.findElement(By.css('.w-100 > .holla-button:nth-child(3)')).click(); + }); -}) +}); diff --git a/test/Trade/trade.js b/test/Trade/trade.js index ba5241c3dd..c041edf0cd 100644 --- a/test/Trade/trade.js +++ b/test/Trade/trade.js @@ -1,188 +1,198 @@ -// Generated by Selenium IDE -const { Builder, By, Key, until } = require('selenium-webdriver') -const assert = require('assert') +//testing the login function of Hollaex Kit +//Using Selenium webderiver and Mocha/Chai +//given, when and then +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const { expect } = require('chai'); +const { Console } = require('console'); +const dotenv = require('dotenv'); +const { addConsoleHandler } = require('selenium-webdriver/lib/logging'); +dotenv.config(); +let userName = process.env.ADMIN_USER; +let passWord = process.env.ADMIN_PASS; +let logInPage = process.env.LOGIN_PAGE; describe('Trade', function() { - this.timeout(300000) - let driver - let vars - function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); - } - beforeEach(async function() { - driver = await new Builder().forBrowser('chrome').build(); - vars = {} - // Test name: Untitled - // Step # | name | target | value - // 1 | open | /account | - await driver.get("https://sandbox.hollaex.com/account"); - await sleep(10000); - // 2 | type | name=email | USER@bitholla.com - // await driver.wait(until.elementLocated(await driver.findElement(By.name("email"))), 5000); - await driver.findElement(By.name("email")).sendKeys("USER@bitholla.com"); - // 3 | type | name=password | bitholla@bitholla.com - //await driver.wait(until.elementLocated(await driver.findElement(By.name("password"))),5000); - await driver.findElement(By.name("password")).sendKeys("bitholla@bitholla.com"); - // 4 | click | name=email | + this.timeout(300000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + // Test name: Untitled + // Step # | name | target | value + // 1 | open | /account | + await driver.get(logInPage); + await sleep(10000); + // 2 | type | name=email | USER@bitholla.com + // await driver.wait(until.elementLocated(await driver.findElement(By.name("email"))), 5000); + await driver.findElement(By.name('email')).sendKeys(userName); + // 3 | type | name=password | bitholla@bitholla.com + //await driver.wait(until.elementLocated(await driver.findElement(By.name("password"))),5000); + await driver.findElement(By.name('password')).sendKeys(passWord); + // 4 | click | name=email | - await sleep(4000); - await driver.findElement(By.name("email")).click(); - // 5 | click | css=.holla-button | - await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(".holla-button"))), 50000); - await driver.findElement(By.css(".holla-button")).click(); - }) - afterEach(async function() { - await driver.quit(); - }) - it('limit buy', async function() { + await sleep(4000); + // await driver.findElement(By.name("email")).click(); + // // 5 | click | css=.holla-button | + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.holla-button'))), 50000); + await driver.findElement(By.css('.holla-button')).click(); + }); + afterEach(async function() { + await driver.quit(); + }); + it('limit buy', async function() { - // await driver.manage().window().setRect(1050, 660) + // await driver.manage().window().setRect(1050, 660) - // 3 | click | css=.home_app_bar > .pointer | | - await sleep(4000); - await driver.findElement(By.css(".app-menu-bar-content:nth-child(2) .edit-wrapper__container")).click() - // 5 | click | name=Search Assets | | - await driver.findElement(By.name("Search Assets")).click() - // 6 | type | name=Search Assets | xht | - await driver.findElement(By.name("Search Assets")).sendKeys("xht") - // 7 | sendKeys | name=Search Assets | ${KEY_ENTER} | - await driver.findElement(By.name("Search Assets")).sendKeys(Key.ENTER) - // 8 | click | css=.trade_tab-pair-sub-title | | - await driver.findElement(By.css(".trade_tab-pair-sub-title")).click() - // 9 | click | name=size | | - await sleep(3000); - await driver.findElement(By.name("size")).click() - // 10 | type | name=size | 1 | - await driver.findElement(By.name("size")).sendKeys("1") - // 11 | click | css=.holla-button | | - await driver.findElement(By.css(".holla-button")).click() - // 12 | click | css=.notification-content-information > .d-flex:nth-child(1) | | - await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(1)")).click() - // 13 | assertText | css=.text-capitalize | Limit Buy | - assert(await driver.findElement(By.css(".text-capitalize")).getText() == "Limit Buy") - // 14 | click | css=.d-flex > .holla-button:nth-child(3) | | - await driver.findElement(By.css(".d-flex > .holla-button:nth-child(3)")).click() - // 15 | click | css=.w-100 .ant-select-selection-item | | - await driver.findElement(By.css(".w-100 .ant-select-selection-item")).click() - // 16 | click | css=.ant-select-item-option-active > .ant-select-item-option-content | | - await driver.findElement(By.css(".ant-select-item-option-active > .ant-select-item-option-content")).click() - // 17 | click | name=stop | | - }) + // 3 | click | css=.home_app_bar > .pointer | | + await sleep(4000); + await driver.findElement(By.css('.app-menu-bar-content:nth-child(2) .edit-wrapper__container')).click(); + // 5 | click | name=Search Assets | | + await driver.findElement(By.name('Search Assets')).click(); + // 6 | type | name=Search Assets | xht | + await driver.findElement(By.name('Search Assets')).sendKeys('xht'); + // 7 | sendKeys | name=Search Assets | ${KEY_ENTER} | + await driver.findElement(By.name('Search Assets')).sendKeys(Key.ENTER); + // 8 | click | css=.trade_tab-pair-sub-title | | + await driver.findElement(By.css('.trade_tab-pair-sub-title')).click(); + // 9 | click | name=size | | + await sleep(3000); + await driver.findElement(By.name('size')).click(); + // 10 | type | name=size | 1 | + await driver.findElement(By.name('size')).sendKeys('1'); + // 11 | click | css=.holla-button | | + await driver.findElement(By.css('.holla-button')).click(); + // 12 | click | css=.notification-content-information > .d-flex:nth-child(1) | | + await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(1)')).click(); + // 13 | assertText | css=.text-capitalize | Limit Buy | + assert(await driver.findElement(By.css('.text-capitalize')).getText() == 'Limit Buy'); + // 14 | click | css=.d-flex > .holla-button:nth-child(3) | | + await driver.findElement(By.css('.d-flex > .holla-button:nth-child(3)')).click(); + // 15 | click | css=.w-100 .ant-select-selection-item | | + await driver.findElement(By.css('.w-100 .ant-select-selection-item')).click(); + // 16 | click | css=.ant-select-item-option-active > .ant-select-item-option-content | | + await driver.findElement(By.css('.ant-select-item-option-active > .ant-select-item-option-content')).click(); + // 17 | click | name=stop | | + }); - it('Limit Sell', async function() { + it('Limit Sell', async function() { - // 2 | setWindowSize | 1050x660 | - // await driver.manage().window().setRect(1050, 660) - await sleep(4000); - // 3 | click | css=.home_app_bar > .pointer | - // await driver.findElement(By.css(".home_app_bar > .pointer")).click() - // 4 | click | css=.app-menu-bar-content:nth-child(2) .edit-wrapper__container | - await driver.findElement(By.css(".app-menu-bar-content:nth-child(2) .edit-wrapper__container")).click() - // 5 | click | name=Search Assets | - await driver.findElement(By.name("Search Assets")).click() - // 6 | type | name=Search Assets | xht - await driver.findElement(By.name("Search Assets")).sendKeys("xht") - // 7 | sendKeys | name=Search Assets | ${KEY_ENTER} - await driver.findElement(By.name("Search Assets")).sendKeys(Key.ENTER) - // 8 | click | css=.highcharts-background | - await driver.findElement(By.css(".trade_tab-pair-sub-title")).click() - // 9 | click | css=.holla-button-font:nth-child(2) | - await sleep(4000); - await driver.findElement(By.css(".holla-button-font:nth-child(2)")).click() - // 10 | click | name=size | - await driver.findElement(By.name("size")).click() - // 11 | type | name=size | 1 - await driver.findElement(By.name("size")).sendKeys("1") - // 12 | click | css=.holla-button | - await driver.findElement(By.css(".holla-button")).click() - // 13 | click | css=.text-capitalize | - await driver.findElement(By.css(".text-capitalize")).click() - // 14 | assertText | css=.text-capitalize | Limit Sell - assert(await driver.findElement(By.css(".text-capitalize")).getText() == "Limit Sell") - // 15 | click | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | - await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).click() - // 16 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT - assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).getText() == "1 XHT") - // 17 | click | css=.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2) | - await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)")).click() - // 18 | assertText | css=.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2) | 1 USDT - assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)")).getText() == "1 USDT") - // 19 | click | css=.d-flex > .holla-button:nth-child(3) | - await driver.findElement(By.css(".d-flex > .holla-button:nth-child(3)")).click() - // 20 | click | css=.table_body-row:nth-child(1) .action_notification-text | - await driver.findElement(By.css(".table_body-row:nth-child(1) .action_notification-text")).click() - }) + // 2 | setWindowSize | 1050x660 | + // await driver.manage().window().setRect(1050, 660) + await sleep(4000); + // 3 | click | css=.home_app_bar > .pointer | + // await driver.findElement(By.css(".home_app_bar > .pointer")).click() + // 4 | click | css=.app-menu-bar-content:nth-child(2) .edit-wrapper__container | + await driver.findElement(By.css('.app-menu-bar-content:nth-child(2) .edit-wrapper__container')).click(); + // 5 | click | name=Search Assets | + await driver.findElement(By.name('Search Assets')).click(); + // 6 | type | name=Search Assets | xht + await driver.findElement(By.name('Search Assets')).sendKeys('xht'); + // 7 | sendKeys | name=Search Assets | ${KEY_ENTER} + await driver.findElement(By.name('Search Assets')).sendKeys(Key.ENTER); + // 8 | click | css=.highcharts-background | + await driver.findElement(By.css('.trade_tab-pair-sub-title')).click(); + // 9 | click | css=.holla-button-font:nth-child(2) | + await sleep(4000); + await driver.findElement(By.css('.holla-button-font:nth-child(2)')).click(); + // 10 | click | name=size | + await driver.findElement(By.name('size')).click(); + // 11 | type | name=size | 1 + await driver.findElement(By.name('size')).sendKeys('1'); + // 12 | click | css=.holla-button | + await driver.findElement(By.css('.holla-button')).click(); + // 13 | click | css=.text-capitalize | + await driver.findElement(By.css('.text-capitalize')).click(); + // 14 | assertText | css=.text-capitalize | Limit Sell + assert(await driver.findElement(By.css('.text-capitalize')).getText() == 'Limit Sell'); + // 15 | click | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | + await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)')).click(); + // 16 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT + assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)')).getText() == '1 XHT'); + // 17 | click | css=.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2) | + await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)')).click(); + // 18 | assertText | css=.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2) | 1 USDT + assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)')).getText() == '1 USDT'); + // 19 | click | css=.d-flex > .holla-button:nth-child(3) | + await driver.findElement(By.css('.d-flex > .holla-button:nth-child(3)')).click(); + // 20 | click | css=.table_body-row:nth-child(1) .action_notification-text | + await driver.findElement(By.css('.table_body-row:nth-child(1) .action_notification-text')).click(); + }); -it('Market buy', async function(){ - // await driver.manage().window().setRect(1296, 696) - await sleep(2000); - // 3 | click | css=.app-menu-bar-content:nth-child(2) .edit-wrapper__container | - await driver.findElement(By.css(".app-menu-bar-content:nth-child(2) .edit-wrapper__container")).click() - // 4 | click | name=Search Assets | - await driver.findElement(By.name("Search Assets")).click() - // 5 | type | name=Search Assets | xht - await driver.findElement(By.name("Search Assets")).sendKeys("xht") - // 6 | sendKeys | name=Search Assets | ${KEY_ENTER} - await driver.findElement(By.name("Search Assets")).sendKeys(Key.ENTER) - // 9 | click | css=.highcharts-background | - await driver.findElement(By.css(".highcharts-background")).click() - // 10 | click | css=.text-center:nth-child(1) | - await sleep(5000); - await driver.findElement(By.css(".text-center:nth-child(1)")).click() - // 11 | click&type 1 | name=size | - await driver.findElement(By.name("size")).click() - await driver.findElement(By.name("size")).sendKeys("1") - // 12 | click | css=.holla-button | - await driver.findElement(By.css(".holla-button")).click() - // 15 | click | css=.text-capitalize | - await driver.findElement(By.css(".text-capitalize")).click() - // 16 | assertText | css=.text-capitalize | Market Buy - assert(await driver.findElement(By.css(".text-capitalize")).getText() == "Market Buy!") - // 17 | click | css=.d-flex > .holla-button:nth-child(3) | - await driver.findElement(By.css(".d-flex > .holla-button:nth-child(3)")).click() + it('Market buy', async function(){ + // await driver.manage().window().setRect(1296, 696) + await sleep(2000); + // 3 | click | css=.app-menu-bar-content:nth-child(2) .edit-wrapper__container | + await driver.findElement(By.css('.app-menu-bar-content:nth-child(2) .edit-wrapper__container')).click(); + // 4 | click | name=Search Assets | + await driver.findElement(By.name('Search Assets')).click(); + // 5 | type | name=Search Assets | xht + await driver.findElement(By.name('Search Assets')).sendKeys('xht'); + // 6 | sendKeys | name=Search Assets | ${KEY_ENTER} + await driver.findElement(By.name('Search Assets')).sendKeys(Key.ENTER); + // 9 | click | css=.highcharts-background | + await driver.findElement(By.css('.highcharts-background')).click(); + // 10 | click | css=.text-center:nth-child(1) | + await sleep(5000); + await driver.findElement(By.css('.text-center:nth-child(1)')).click(); + // 11 | click&type 1 | name=size | + await driver.findElement(By.name('size')).click(); + await driver.findElement(By.name('size')).sendKeys('1'); + // 12 | click | css=.holla-button | + await driver.findElement(By.css('.holla-button')).click(); + // 15 | click | css=.text-capitalize | + await driver.findElement(By.css('.text-capitalize')).click(); + // 16 | assertText | css=.text-capitalize | Market Buy + assert(await driver.findElement(By.css('.text-capitalize')).getText() == 'Market Buy!'); + // 17 | click | css=.d-flex > .holla-button:nth-child(3) | + await driver.findElement(By.css('.d-flex > .holla-button:nth-child(3)')).click(); -}) - it('market sell', async function(){ - await driver.manage().window().setRect(1296, 696) - await sleep(2000); - // 3 | click | css=.app-menu-bar-content:nth-child(2) .edit-wrapper__container | - await driver.findElement(By.css(".app-menu-bar-content:nth-child(2) .edit-wrapper__container")).click() - // 4 | click | name=Search Assets | - await driver.findElement(By.name("Search Assets")).click() - // 5 | type | name=Search Assets | xht - await driver.findElement(By.name("Search Assets")).sendKeys("xht") - // 6 | sendKeys | name=Search Assets | ${KEY_ENTER} - await driver.findElement(By.name("Search Assets")).sendKeys(Key.ENTER) - // 9 | click | css=.highcharts-background | - await driver.findElement(By.css(".highcharts-background")).click() - // 10 | click | css=.text-center:nth-child(1) | - await sleep(5000); - await driver.findElement(By.css(".text-center:nth-child(1)")).click() - // 4 | click | css=.holla-button-font:nth-child(2) | - await driver.findElement(By.css(".holla-button-font:nth-child(2)")).click() - // 5 | click | css=.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1) | - await driver.findElement(By.css(".trade-col_action_wrapper > .trade_block-wrapper:nth-child(1)")).click() - await sleep(2000); - // // 11 | click&type 1 | name=size | - await driver.findElement(By.name("size")).click() - await driver.findElement(By.name("size")).sendKeys("1") - // 6 | click | css=.holla-button | - await driver.findElement(By.css(".holla-button")).click() - // 7 | click | css=.text-capitalize | - await driver.findElement(By.css(".text-capitalize")).click() - // 8 | assertText | css=.text-capitalize | Market Sell - assert(await driver.findElement(By.css(".text-capitalize")).getText() == "Market Sell") - // 9 | click | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | - await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).click() - // 10 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT - assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).getText() == "1 XHT") - // 11 | click | css=.d-flex > .holla-button:nth-child(3) | - await driver.findElement(By.css(".d-flex > .holla-button:nth-child(3)")).click() + }); + it('market sell', async function(){ + await driver.manage().window().setRect(1296, 696); + await sleep(2000); + // 3 | click | css=.app-menu-bar-content:nth-child(2) .edit-wrapper__container | + await driver.findElement(By.css('.app-menu-bar-content:nth-child(2) .edit-wrapper__container')).click(); + // 4 | click | name=Search Assets | + await driver.findElement(By.name('Search Assets')).click(); + // 5 | type | name=Search Assets | xht + await driver.findElement(By.name('Search Assets')).sendKeys('xht'); + // 6 | sendKeys | name=Search Assets | ${KEY_ENTER} + await driver.findElement(By.name('Search Assets')).sendKeys(Key.ENTER); + // 9 | click | css=.highcharts-background | + await driver.findElement(By.css('.highcharts-background')).click(); + // 10 | click | css=.text-center:nth-child(1) | + await sleep(5000); + await driver.findElement(By.css('.text-center:nth-child(1)')).click(); + // 4 | click | css=.holla-button-font:nth-child(2) | + await driver.findElement(By.css('.holla-button-font:nth-child(2)')).click(); + // 5 | click | css=.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1) | + await driver.findElement(By.css('.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1)')).click(); + await sleep(2000); + // // 11 | click&type 1 | name=size | + await driver.findElement(By.name('size')).click(); + await driver.findElement(By.name('size')).sendKeys('1'); + // 6 | click | css=.holla-button | + await driver.findElement(By.css('.holla-button')).click(); + // 7 | click | css=.text-capitalize | + await driver.findElement(By.css('.text-capitalize')).click(); + // 8 | assertText | css=.text-capitalize | Market Sell + assert(await driver.findElement(By.css('.text-capitalize')).getText() == 'Market Sell'); + // 9 | click | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | + await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)')).click(); + // 10 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT + assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)')).getText() == '1 XHT'); + // 11 | click | css=.d-flex > .holla-button:nth-child(3) | + await driver.findElement(By.css('.d-flex > .holla-button:nth-child(3)')).click(); - }) + }); -}) +}); diff --git a/test/Trade/tradeWithStop.js b/test/Trade/tradeWithStop.js index 0c894bcf8e..8b6327a687 100644 --- a/test/Trade/tradeWithStop.js +++ b/test/Trade/tradeWithStop.js @@ -1,198 +1,197 @@ -// Generated by Selenium IDE -const { Builder, By, Key, until } = require('selenium-webdriver') -const assert = require('assert') - - +//testing the login function of Hollaex Kit +//Using Selenium webderiver and Mocha/Chai +//given, when and then +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const { expect } = require('chai'); +const { Console } = require('console'); +const dotenv = require('dotenv'); +const { addConsoleHandler } = require('selenium-webdriver/lib/logging'); +dotenv.config(); +let userName = process.env.ADMIN_USER; +let passWord = process.env.ADMIN_PASS; +let logInPage = process.env.LOGIN_PAGE; describe('Trade with stop', function() { - this.timeout(300000) - let driver - let vars - function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); - } - beforeEach(async function() { - driver = await new Builder().forBrowser('chrome').build(); - vars = {} - // Test name: Untitled - // Step # | name | target | value - // 1 | open | /account | - await driver.get("https://sandbox.hollaex.com/account"); - await sleep(10000); - // 2 | type | name=email | USER@bitholla.com - // await driver.wait(until.elementLocated(await driver.findElement(By.name("email"))), 5000); - await driver.findElement(By.name("email")).sendKeys("USER@bitholla.com"); - // 3 | type | name=password | bitholla@bitholla.com - //await driver.wait(until.elementLocated(await driver.findElement(By.name("password"))),5000); - await driver.findElement(By.name("password")).sendKeys("bitholla@bitholla.com"); - // 4 | click | name=email | + this.timeout(300000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + // Test name: Untitled + // Step # | name | target | value + // 1 | open | /account | + await driver.get(logInPage); + await sleep(10000); + // 2 | type | name=email | USER@bitholla.com + // await driver.wait(until.elementLocated(await driver.findElement(By.name("email"))), 5000); + await driver.findElement(By.name('email')).sendKeys(userName); + // 3 | type | name=password | bitholla@bitholla.com + //await driver.wait(until.elementLocated(await driver.findElement(By.name("password"))),5000); + await driver.findElement(By.name('password')).sendKeys(passWord); + // 4 | click | name=email | - await sleep(4000); - await driver.findElement(By.name("email")).click(); - // 5 | click | css=.holla-button | - await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(".holla-button"))), 50000); - await driver.findElement(By.css(".holla-button")).click(); - // 3 | click | css=.home_app_bar > .pointer | | - await sleep(3000); - await driver.findElement(By.css(".app-menu-bar-content:nth-child(2) .edit-wrapper__container")).click() - // 5 | click | name=Search Assets | | - await driver.findElement(By.name("Search Assets")).click() - // 6 | type | name=Search Assets | xht | - await driver.findElement(By.name("Search Assets")).sendKeys("xht") - // 7 | sendKeys | name=Search Assets | ${KEY_ENTER} | - await driver.findElement(By.name("Search Assets")).sendKeys(Key.ENTER) - // 8 | click | css=.trade_tab-pair-sub-title | | - await driver.findElement(By.css(".trade_tab-pair-sub-title")).click() - // 9 | click | name=size | | - await sleep(3000); + await sleep(4000); + await driver.findElement(By.name('email')).click(); + // 5 | click | css=.holla-button | + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.holla-button'))), 50000); + await driver.findElement(By.css('.holla-button')).click(); + // 3 | click | css=.home_app_bar > .pointer | | + await sleep(5000); + await driver.findElement(By.css('.app-menu-bar-content:nth-child(2) .edit-wrapper__container')).click(); + // 5 | click | name=Search Assets | | + await driver.findElement(By.name('Search Assets')).click(); + // 6 | type | name=Search Assets | xht | + await driver.findElement(By.name('Search Assets')).sendKeys('xht'); + // 7 | sendKeys | name=Search Assets | ${KEY_ENTER} | + await driver.findElement(By.name('Search Assets')).sendKeys(Key.ENTER); + // 8 | click | css=.trade_tab-pair-sub-title | | + await driver.findElement(By.css('.trade_tab-pair-sub-title')).click(); + // 9 | click | name=size | | + await sleep(3000); - // await driver.manage().window().setRect(1050, 660) - // // 3 | click | css=.w-100 .ant-select-selection-item | + // await driver.manage().window().setRect(1050, 660) + // // 3 | click | css=.w-100 .ant-select-selection-item | - await driver.findElement(By.css(".w-100 .ant-select-selection-item")).click() - await sleep(1000); - // xpath of stop '/html/body/div[11]/div/div/div/div[2]/div[1]/div/div/div[2]/div' - await driver.findElement(By.xpath('/html/body/div[11]/div/div/div/div[2]/div[1]/div/div/div[2]/div')).click() - }) - afterEach(async function() { - await driver.quit(); - }) - it('Limit Buy', async function() { + await driver.findElement(By.css('.w-100 .ant-select-selection-item')).click(); + await sleep(1000); + // xpath of stop '/html/body/div[11]/div/div/div/div[2]/div[1]/div/div/div[2]/div' + await driver.findElement(By.xpath('/html/body/div[11]/div/div/div/div[2]/div[1]/div/div/div[2]/div')).click(); + }); + afterEach(async function() { + await driver.quit(); + }); + it('Limit Buy', async function() { - // 3 | click | name=stop | - await sleep(1000) - await driver.findElement(By.css(".holla-button-font:nth-child(1)")).click() - await sleep(1000) - await driver.findElement(By.name("stop")).click() - // 4 | type | name=stop | 1 - await driver.findElement(By.name("stop")).sendKeys("1") - await sleep(1000) - // 7 | type | name=price | 0.9 - // await driver.findElement(By.name("price")).click() - // await driver.findElement(By.name("price")).clear() - // await driver.findElement(By.name("price")).sendKeys("0.9") - // await sleep(1000) - // 5 | click | name=size | - await driver.findElement(By.name("size")).click() - // 6 | type | name=size | 1 - await driver.findElement(By.name("size")).sendKeys("1") - await sleep(3000) - await driver.findElement(By.name("size")).sendKeys(Key.ENTER) + // 3 | click | name=stop | + await sleep(1000); + await driver.findElement(By.css('.holla-button-font:nth-child(1)')).click(); + await sleep(1000); + await driver.findElement(By.name('stop')).click(); + // 4 | type | name=stop | 1 + await driver.findElement(By.name('stop')).sendKeys('1'); + await sleep(1000); + // 7 | type | name=price | 0.9 + // await sleep(1000) + // 5 | click | name=size | + await driver.findElement(By.name('size')).click(); + // 6 | type | name=size | 1 + await driver.findElement(By.name('size')).sendKeys('1'); + await sleep(3000); + await driver.findElement(By.name('size')).sendKeys(Key.ENTER); - // 8 | click | css=.holla-button | - // await driver.wait(until.elementIsEnabled(By.xpath('//*[@id="root"]/div[1]/div[2]/div/div/div[3]/div/div/div/div[3]/div[1]/div[2]/div/div/form/button'), 5000)); - // await driver.findElement(By.xpath('//*[@id="root"]/div[1]/div[2]/div/div/div[3]/div/div/div/div[3]/div[1]/div[2]/div/div/form/button')).click() - // // 9 | click | css=.notification-content-information > .d-flex:nth-child(1) | - //await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(1)")).click() - // 10 | assertText | css=.text-capitalize | Limit Buy - assert(await driver.findElement(By.css(".text-capitalize")).getText() == "Limit Buy") - // 11 | click | css=.notification-content-information > .d-flex:nth-child(2) | - await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2)")).click() - // 12 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT - assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).getText() == "1 XHT") - // 13 | click | css=.notification-content-information > .d-flex:nth-child(3) | - await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(3)")).click() - // 14 | assertText | css=.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2) | 0.9 USDT - assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)")).getText() == "0.9 USDT") - // 15 | click | css=.d-flex > .holla-button:nth-child(3) | - sleep(2000) - await driver.findElement(By.css(".d-flex > .holla-button:nth-child(3)")).click() - }) + // 10 | assertText | css=.text-capitalize | Limit Buy + assert(await driver.findElement(By.css('.text-capitalize')).getText() == 'Limit Buy'); + // 11 | click | css=.notification-content-information > .d-flex:nth-child(2) | + await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(2)')).click(); + // 12 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT + assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)')).getText() == '1 XHT'); + // 13 | click | css=.notification-content-information > .d-flex:nth-child(3) | + await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(3)')).click(); + // 14 | assertText | css=.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2) | 0.9 USDT + assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)')).getText() == '0.9 USDT'); + // 15 | click | css=.d-flex > .holla-button:nth-child(3) | + sleep(2000); + await driver.findElement(By.css('.d-flex > .holla-button:nth-child(3)')).click(); + }); - it('Limit sell', async function(){ + it('Limit sell', async function(){ - // Test name: Untitled - // Step # | name | target | value - // 1 | click | css=.holla-button-font:nth-child(2) | - await driver.findElement(By.css(".holla-button-font:nth-child(2)")).click() - // 2 | click | css=.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1) | - await driver.findElement(By.css(".trade-col_action_wrapper > .trade_block-wrapper:nth-child(1)")).click() - // 3 | storeValue | name=price | value - value = await driver.findElement(By.name("price")).getAttribute("value") - // await console.log(typeof(value)); - // await console.log(value) - // 4 | click | name=stop | - await driver.findElement(By.name("stop")).click() - // 5 | type | name=stop | value - 0.01 - // await driver.findElement(By.name("stop")).sendKeys(String(value - 0.1 )) - await driver.findElement(By.name("stop")).sendKeys(0.8) - // 6 | click | name=size | - await driver.findElement(By.name("size")).click() - await driver.findElement(By.name("size")).sendKeys(1) - // 7 | sendKeys | name=size | ${KEY_ENTER} - await driver.findElement(By.name("size")).sendKeys(Key.ENTER) - // // 8 | type | name=stop | 0.8 - // await driver.findElement(By.name("stop")).sendKeys("0.8") - // 9 | click | css=.notification-content-information > .d-flex:nth-child(1) | - await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(1)")).click() - // 10 | assertText | css=.d-flex:nth-child(1) > .text_disabled | Food type: - assert(await driver.findElement(By.css(".text-capitalize")).getText() == "Limit Sell") - // 11 | click | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | - await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).click() - // 12 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT - assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).getText() == "1 XHT") - // 13 | click | css=.notification-content-information > .d-flex:nth-child(3) | - await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(3)")).click() - // 14 | assertText | css=.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2) | 0.9 USDT - assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)")).getText() == "0.9 USDT") - // 15 | click | css=.d-flex > .holla-button:nth-child(3) | - await driver.findElement(By.css(".d-flex > .holla-button:nth-child(3)")).click() - }) + // Test name: Untitled + // Step # | name | target | value + // 1 | click | css=.holla-button-font:nth-child(2) | + await driver.findElement(By.css('.holla-button-font:nth-child(2)')).click(); + // 2 | click | css=.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1) | + await driver.findElement(By.css('.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1)')).click(); + // 3 | storeValue | name=price | value + value = await driver.findElement(By.name('price')).getAttribute('value'); + // await console.log(typeof(value)); + // await console.log(value) + // 4 | click | name=stop | + await driver.findElement(By.name('stop')).click(); + // 5 | type | name=stop | value - 0.01 + await driver.findElement(By.name('stop')).sendKeys(0.8); + // 6 | click | name=size | + await driver.findElement(By.name('size')).click(); + await driver.findElement(By.name('size')).sendKeys(1); + // 7 | sendKeys | name=size | ${KEY_ENTER} + await driver.findElement(By.name('size')).sendKeys(Key.ENTER); + // // 8 | type | name=stop | 0.8 + // await driver.findElement(By.name("stop")).sendKeys("0.8") + // 9 | click | css=.notification-content-information > .d-flex:nth-child(1) | + await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(1)')).click(); + // 10 | assertText | css=.d-flex:nth-child(1) > .text_disabled | Food type: + assert(await driver.findElement(By.css('.text-capitalize')).getText() == 'Limit Sell'); + // 11 | click | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | + await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)')).click(); + // 12 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT + assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)')).getText() == '1 XHT'); + // 13 | click | css=.notification-content-information > .d-flex:nth-child(3) | + await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(3)')).click(); + // 14 | assertText | css=.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2) | 0.9 USDT + assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)')).getText() == '0.9 USDT'); + // 15 | click | css=.d-flex > .holla-button:nth-child(3) | + await driver.findElement(By.css('.d-flex > .holla-button:nth-child(3)')).click(); + }); - it('Market Buy', async function(){ + it('Market Buy', async function(){ - await driver.findElement(By.css(".text-center:nth-child(1)")).click() - await driver.findElement(By.css(".holla-button-font:nth-child(1)")).click() - // 4 | click | name=stop | - await driver.findElement(By.name("stop")).click() - // 5 | type | name=stop | 1 - await driver.findElement(By.name("stop")).sendKeys("1") - // 6 | click | name=size | - await driver.findElement(By.name("size")).click() - // 8 | type | name=size | 1 - await driver.findElement(By.name("size")).sendKeys("1") - // 9 | sendKeys | name=size | ${KEY_ENTER} - await driver.findElement(By.name("size")).sendKeys(Key.ENTER) - // 10 | click | css=.notification-content-information > .d-flex:nth-child(1) | - await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(1)")).click() - // 11 | assertText | css=.text-capitalize | Market Buy - assert(await driver.findElement(By.css(".text-capitalize")).getText() == "Market Buy") - // 14 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT - assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).getText() == "1 XHT") - // 15 | click | css=.d-flex > .holla-button:nth-child(3) | - await driver.findElement(By.css(".d-flex > .holla-button:nth-child(3)")).click() - }) + await driver.findElement(By.css('.text-center:nth-child(1)')).click(); + await driver.findElement(By.css('.holla-button-font:nth-child(1)')).click(); + // 4 | click | name=stop | + await driver.findElement(By.name('stop')).click(); + // 5 | type | name=stop | 1 + await driver.findElement(By.name('stop')).sendKeys('1'); + // 6 | click | name=size | + await driver.findElement(By.name('size')).click(); + // 8 | type | name=size | 1 + await driver.findElement(By.name('size')).sendKeys('1'); + // 9 | sendKeys | name=size | ${KEY_ENTER} + await driver.findElement(By.name('size')).sendKeys(Key.ENTER); + // 10 | click | css=.notification-content-information > .d-flex:nth-child(1) | + await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(1)')).click(); + // 11 | assertText | css=.text-capitalize | Market Buy + assert(await driver.findElement(By.css('.text-capitalize')).getText() == 'Market Buy'); + // 14 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT + assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)')).getText() == '1 XHT'); + // 15 | click | css=.d-flex > .holla-button:nth-child(3) | + await driver.findElement(By.css('.d-flex > .holla-button:nth-child(3)')).click(); + }); -it('Market Sell', async function(){ + it('Market Sell', async function(){ - // 1 | click | css=.text-center:nth-child(1) | | - await driver.findElement(By.css(".text-center:nth-child(1)")).click() - // 2 | click | css=.holla-button-font:nth-child(2) | | - await driver.findElement(By.css(".holla-button-font:nth-child(2)")).click() - // 3 | click | css=.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1) | | - await driver.findElement(By.css(".trade-col_action_wrapper > .trade_block-wrapper:nth-child(1)")).click() - // 4 | click | name=size | | + // 1 | click | css=.text-center:nth-child(1) | | + await driver.findElement(By.css('.text-center:nth-child(1)')).click(); + // 2 | click | css=.holla-button-font:nth-child(2) | | + await driver.findElement(By.css('.holla-button-font:nth-child(2)')).click(); + // 3 | click | css=.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1) | | + await driver.findElement(By.css('.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1)')).click(); + // 4 | click | name=size | | - await driver.findElement(By.name("stop")).click() - // 5 | type | name=stop | 0.8 | - await driver.findElement(By.name("stop")).sendKeys("0.8") + await driver.findElement(By.name('stop')).click(); + // 5 | type | name=stop | 0.8 | + await driver.findElement(By.name('stop')).sendKeys('0.8'); - await driver.findElement(By.name("size")).click() - // 5 | type | name=size | 1 | - await driver.findElement(By.name("size")).sendKeys("1") - // 6 | sendKeys | name=size | ${KEY_ENTER} | - await driver.findElement(By.name("size")).sendKeys(Key.ENTER) + await driver.findElement(By.name('size')).click(); + // 5 | type | name=size | 1 | + await driver.findElement(By.name('size')).sendKeys('1'); + // 6 | sendKeys | name=size | ${KEY_ENTER} | + await driver.findElement(By.name('size')).sendKeys(Key.ENTER); - // 8 | verifyText | css=.text-capitalize | Market Sell | - assert(await driver.findElement(By.css(".text-capitalize")).getText() == "Market Sell") - // 9 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT | - assert(await driver.findElement(By.css(".notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)")).getText() == "1 XHT") - // 10 | click | css=.d-flex > .holla-button:nth-child(3) | | - await driver.findElement(By.css(".d-flex > .holla-button:nth-child(3)")).click() + // 8 | verifyText | css=.text-capitalize | Market Sell | + assert(await driver.findElement(By.css('.text-capitalize')).getText() == 'Market Sell'); + // 9 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT | + assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)')).getText() == '1 XHT'); + // 10 | click | css=.d-flex > .holla-button:nth-child(3) | | + await driver.findElement(By.css('.d-flex > .holla-button:nth-child(3)')).click(); - }) -}) + }); +}); diff --git a/test/Wallet/DW_flow.js b/test/Wallet/DW_flow.js index 33cbc78d65..3b55117db2 100644 --- a/test/Wallet/DW_flow.js +++ b/test/Wallet/DW_flow.js @@ -1,193 +1,203 @@ +//testing the login function of Hollaex Kit +//Using Selenium webderiver and Mocha/Chai +//given, when and then const { Builder, By, Key, until } = require('selenium-webdriver'); const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); +const dotenv = require('dotenv'); +const { addConsoleHandler } = require('selenium-webdriver/lib/logging'); +dotenv.config(); +let bob = process.env.BOB; +let passWord = process.env.PASSWORD; +let alice = process.env.ALICE; +let logInPage = process.env.LOGIN_PAGE; describe('Internal D/W Flow', function() { - this.timeout(30000); - let driver; - let vars; - function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); - } - async function waitForWindow(timeout = 2) { - await driver.sleep(timeout) - const handlesThen = vars["windowHandles"] - const handlesNow = await driver.getAllWindowHandles() - if (handlesNow.length > handlesThen.length) { - return handlesNow.find(handle => (!handlesThen.includes(handle))) - } - throw new Error("New window did not appear before timeout") - } - beforeEach(async function() { - driver = await new Builder().forBrowser('chrome').build(); - vars = {}; - }) - afterEach(async function() { - // await driver.quit(); - }) - it('From Alice to Bob', async function() { + this.timeout(30000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + async function waitForWindow(timeout = 2) { + await driver.sleep(timeout); + const handlesThen = vars['windowHandles']; + const handlesNow = await driver.getAllWindowHandles(); + if (handlesNow.length > handlesThen.length) { + return handlesNow.find(handle => (!handlesThen.includes(handle))); + } + throw new Error('New window did not appear before timeout'); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + }); + afterEach(async function() { + // await driver.quit(); + }); + it('From Alice to Bob', async function() { - console.log(" Test name: BobLogIn"); - await driver.get("https://sandbox.hollaex.com/login"); - await driver.sleep(5000); - const title = await driver.getTitle(); - console.log(title) - expect(title).to.equal(title); - console.log("entring sand box"); - console.log(" Step # | action | target | value"); + console.log(' Test name: BobLogIn'); + await driver.get(logInPage); + await driver.sleep(5000); + const title = await driver.getTitle(); + console.log(title); + expect(title).to.equal(title); + console.log('entring sand box'); + console.log(' Step # | action | target | value'); - console.log(" 1 | type | name=email | alice@gmail.com"); - await driver.wait(until.elementLocated(By.name("email")), 5000) - await driver.findElement(By.name("email")).sendKeys("alice@gmail.com"); + console.log(' 1 | type | name=email | alice@gmail.com'); + await driver.wait(until.elementLocated(By.name('email')), 5000); + await driver.findElement(By.name('email')).sendKeys(alice); - console.log(" 2 | type | name=password | Holla!"); - await driver.wait(until.elementLocated(By.name("password")), 5000) - await driver.findElement(By.name("password")).sendKeys("Holla!"); + console.log(' 2 | type | name=password | Holla!'); + await driver.wait(until.elementLocated(By.name('password')), 5000); + await driver.findElement(By.name('password')).sendKeys(passWord); - console.log(" 3 | click | css=.auth_wrapper | "); - await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(".auth_wrapper"))), 5000); - await driver.findElement(By.css(".auth_wrapper")).click(); - console.log(" 4 | verifyElementPresent | css=.holla-button |"); - { - const elements = await driver.findElements(By.css(".holla-button")); - // assert(elements.length); - expect(elements.length); - } + console.log(' 3 | click | css=.auth_wrapper | '); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.auth_wrapper'))), 5000); + await driver.findElement(By.css('.auth_wrapper')).click(); + console.log(' 4 | verifyElementPresent | css=.holla-button |'); + { + const elements = await driver.findElements(By.css('.holla-button')); + // assert(elements.length); + expect(elements.length); + } - console.log(" 5 | click | css=.holla-button | "); - await driver.findElement(By.css(".holla-button")).click(); - await sleep(5000); + console.log(' 5 | click | css=.holla-button | '); + await driver.findElement(By.css('.holla-button')).click(); + await sleep(5000); - // 11 | click | css=.d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container | - await driver.findElement(By.css(".d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container")).click() - // 12 | click | name=search-assets | - await driver.findElement(By.name("search-assets")).click() - // 13 | type | name=search-assets | Hollaex - await driver.findElement(By.name("search-assets")).sendKeys("Hollaex") - // 14 | sendKeys | name=search-assets | ${KEY_ENTER} - await driver.findElement(By.name("search-assets")).sendKeys(Key.ENTER) - // 15 | click | css=.csv-action:nth-child(2) > .action_notification-text | - await driver.findElement(By.css(".csv-action:nth-child(2) > .action_notification-text")).click() - // 16 | click | name=address | - await driver.findElement(By.name("address")).click() - // 17 | type | name=address | 0xef8a8e2053523fc989feb884f052726db5568ff6 - await driver.findElement(By.name("address")).sendKeys("0xef8a8e2053523fc989feb884f052726db5568ff6") - // 18 | click | css=.with-notification .field-label-wrapper:nth-child(1) | - await driver.findElement(By.css(".with-notification .field-label-wrapper:nth-child(1)")).click() - // 19 | click | name=amount | - await driver.findElement(By.name("amount")).click() - // 20 | type | name=amount | 1 - await driver.findElement(By.name("amount")).sendKeys("1") - // 21 | click | css=.holla-button | - await driver.findElement(By.css(".holla-button")).click() - // 22 | click | css=.button-fail | - await driver.findElement(By.css(".button-fail")).click() - // 23 | click | css=.holla-button | - await driver.findElement(By.css(".holla-button")).click() - // 24 | click | css=.button-success | - await driver.findElement(By.css(".button-success")).click() - await sleep(2000) - // // 25 | click | css=.ReactModal__Content | - // await driver.findElement(By.css(".ReactModal__Content")).click() - // 26 | assertText | css=.d-flex > .icon_title-wrapper .icon_title-text | Confirm Via Email - assert(await driver.findElement(By.css(".d-flex > .icon_title-wrapper .icon_title-text")).getText() == "Confirm Via Email") - // 27 | click | css=.holla-button:nth-child(3) | + // 11 | click | css=.d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container | + await driver.findElement(By.css('.d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container')).click(); + // 12 | click | name=search-assets | + await driver.findElement(By.name('search-assets')).click(); + // 13 | type | name=search-assets | Hollaex + await driver.findElement(By.name('search-assets')).sendKeys('Hollaex'); + // 14 | sendKeys | name=search-assets | ${KEY_ENTER} + await driver.findElement(By.name('search-assets')).sendKeys(Key.ENTER); + // 15 | click | css=.csv-action:nth-child(2) > .action_notification-text | + await driver.findElement(By.css('.csv-action:nth-child(2) > .action_notification-text')).click(); + // 16 | click | name=address | + await driver.findElement(By.name('address')).click(); + // 17 | type | name=address | 0xef8a8e2053523fc989feb884f052726db5568ff6 + await driver.findElement(By.name('address')).sendKeys('0xef8a8e2053523fc989feb884f052726db5568ff6'); + // 18 | click | css=.with-notification .field-label-wrapper:nth-child(1) | + await driver.findElement(By.css('.with-notification .field-label-wrapper:nth-child(1)')).click(); + // 19 | click | name=amount | + await driver.findElement(By.name('amount')).click(); + // 20 | type | name=amount | 1 + await driver.findElement(By.name('amount')).sendKeys('1'); + // 21 | click | css=.holla-button | + await driver.findElement(By.css('.holla-button')).click(); + // 22 | click | css=.button-fail | + await driver.findElement(By.css('.button-fail')).click(); + // 23 | click | css=.holla-button | + await driver.findElement(By.css('.holla-button')).click(); + // 24 | click | css=.button-success | + await driver.findElement(By.css('.button-success')).click(); + await sleep(2000); + // // 25 | click | css=.ReactModal__Content | + // await driver.findElement(By.css(".ReactModal__Content")).click() + // 26 | assertText | css=.d-flex > .icon_title-wrapper .icon_title-text | Confirm Via Email + assert(await driver.findElement(By.css('.d-flex > .icon_title-wrapper .icon_title-text')).getText() == 'Confirm Via Email'); + // 27 | click | css=.holla-button:nth-child(3) | - await driver.findElement(By.css(".holla-button:nth-child(3)")).click() - }) + await driver.findElement(By.css('.holla-button:nth-child(3)')).click(); + }); - it('Gmailcheck', async function() { - console.log("1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |"); - await driver.get("https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin"); + it('Gmailcheck', async function() { + console.log('1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |'); + await driver.get('https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin'); - console.log("2 | setWindowSize | 1050x660 | "); - await driver.manage().window().setRect(1050, 660); + console.log('2 | setWindowSize | 1050x660 | '); + await driver.manage().window().setRect(1050, 660); - console.log("3 | type&Enter | id=identifierId | youremail@gmail.com"); - await driver.findElement(By.id("identifierId")).sendKeys("alice@gmail.com"); - await driver.findElement(By.id("identifierId")).sendKeys(Key.ENTER); + console.log('3 | type&Enter | id=identifierId | youremail@gmail.com'); + await driver.findElement(By.id('identifierId')).sendKeys(alice); + await driver.findElement(By.id('identifierId')).sendKeys(Key.ENTER); - console.log("4 | wait | name=password | Holla!"); - await driver.wait(until.elementsLocated(By.name("password"),30000,"wait", 5000)); - console.log("sleep well for 10"); - await sleep(5000); + console.log('4 | wait | name=password | Holla!'); + await driver.wait(until.elementsLocated(By.name('password'),30000,'wait', 5000)); + console.log('sleep well for 10'); + await sleep(5000); - console.log("5 | type&Enter | id=password| your password!"); - await driver.findElement(By.name("password")).sendKeys("Holla!"); - await driver.findElement(By.name("password")).sendKeys(Key.ENTER); + console.log('5 | type&Enter | id=password| your password!'); + await driver.findElement(By.name('password')).sendKeys('Holla!'); + await driver.findElement(By.name('password')).sendKeys(Key.ENTER); - console.log("sleep well for 5"); - await sleep(5000); + console.log('sleep well for 5'); + await sleep(5000); - console.log("6 | click | linkText=Refresh | "); - await driver.findElement(By.linkText("Refresh")).click() - await driver.findElement(By.css("h3:nth-child(4) font")).click() - // 4 | click | css=.ts > b | - await driver.findElement(By.css(".ts > b")).click() - // 5 | click | css=td:nth-child(2) > table > tbody:nth-child(1) > tr > td:nth-child(2) | - await driver.findElement(By.css("td:nth-child(2) > table > tbody:nth-child(1) > tr > td:nth-child(2)")).click() - // 6 | assertText | css=h2 b | sandbox XHT Withdrawal Request - assert(await driver.findElement(By.css("h2 b")).getText() == "sandbox XHT Withdrawal Request") - // 7 | click | css=div:nth-child(4) button | - vars["windowHandles"] = await driver.getAllWindowHandles() - // 8 | selectWindow | handle=${win4296} | - await driver.findElement(By.css("div:nth-child(4) button")).click() - // 9 | click | css=.app-bar-account-content > div:nth-child(2) | - vars["win4296"] = await waitForWindow(2000) - // 10 | click | css=.withdrawal-confirm-warpper | - await driver.switchTo().window(vars["win4296"]) - // 11 | click | css=.app-bar-account-content > div:nth-child(2) | - await driver.findElement(By.css(".app-bar-account-content > div:nth-child(2)")).click() - // 12 | click | css=.app-bar-account-menu-list:nth-child(11) > .edit-wrapper__container:nth-child(3) | - await driver.findElement(By.css(".withdrawal-confirm-warpper")).click() - await driver.findElement(By.css(".icon_title-text")).click() - assert(await driver.findElement(By.css(".icon_title-text")).getText() == "Success") - }) - it('BobLogin', async function() { - console.log(" Test name: BobLogIn"); - await driver.get("https://sandbox.hollaex.com/login"); - await driver.sleep(5000); - const title = await driver.getTitle(); - console.log(title) - expect(title).to.equal(title); - console.log("entring sand box"); - console.log(" Step # | action | target | value"); + console.log('6 | click | linkText=Refresh | '); + await driver.findElement(By.linkText('Refresh')).click(); + await driver.findElement(By.css('h3:nth-child(4) font')).click(); + // 4 | click | css=.ts > b | + await driver.findElement(By.css('.ts > b')).click(); + // 5 | click | css=td:nth-child(2) > table > tbody:nth-child(1) > tr > td:nth-child(2) | + await driver.findElement(By.css('td:nth-child(2) > table > tbody:nth-child(1) > tr > td:nth-child(2)')).click(); + // 6 | assertText | css=h2 b | sandbox XHT Withdrawal Request + assert(await driver.findElement(By.css('h2 b')).getText() == 'sandbox XHT Withdrawal Request'); + // 7 | click | css=div:nth-child(4) button | + vars['windowHandles'] = await driver.getAllWindowHandles(); + // 8 | selectWindow | handle=${win4296} | + await driver.findElement(By.css('div:nth-child(4) button')).click(); + // 9 | click | css=.app-bar-account-content > div:nth-child(2) | + vars['win4296'] = await waitForWindow(2000); + // 10 | click | css=.withdrawal-confirm-warpper | + await driver.switchTo().window(vars['win4296']); + // 11 | click | css=.app-bar-account-content > div:nth-child(2) | + await driver.findElement(By.css('.app-bar-account-content > div:nth-child(2)')).click(); + // 12 | click | css=.app-bar-account-menu-list:nth-child(11) > .edit-wrapper__container:nth-child(3) | + await driver.findElement(By.css('.withdrawal-confirm-warpper')).click(); + await driver.findElement(By.css('.icon_title-text')).click(); + assert(await driver.findElement(By.css('.icon_title-text')).getText() == 'Success'); + }); + it('BobLogin', async function() { + console.log(' Test name: BobLogIn'); + await driver.get(logInPage); + await driver.sleep(5000); + const title = await driver.getTitle(); + console.log(title); + expect(title).to.equal(title); + console.log('entring sand box'); + console.log(' Step # | action | target | value'); - console.log(" 1 | type | name=email | bob@gmail.com"); - await driver.wait(until.elementLocated(By.name("email")), 5000) - await driver.findElement(By.name("email")).sendKeys("bob@gmail.com"); + console.log(' 1 | type | name=email | bob@gmail.com'); + await driver.wait(until.elementLocated(By.name('email')), 5000); + await driver.findElement(By.name('email')).sendKeys(bob); - console.log(" 2 | type | name=password | Holla!"); - await driver.wait(until.elementLocated(By.name("password")), 5000) - await driver.findElement(By.name("password")).sendKeys("Holla!"); + console.log(' 2 | type | name=password | Holla!'); + await driver.wait(until.elementLocated(By.name('password')), 5000); + await driver.findElement(By.name('password')).sendKeys(passWord); - console.log(" 3 | click | css=.auth_wrapper | "); - await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(".auth_wrapper"))), 5000); - await driver.findElement(By.css(".auth_wrapper")).click(); - console.log(" 4 | verifyElementPresent | css=.holla-button |"); - { - const elements = await driver.findElements(By.css(".holla-button")); - // assert(elements.length); - expect(elements.length); - } + console.log(' 3 | click | css=.auth_wrapper | '); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.auth_wrapper'))), 5000); + await driver.findElement(By.css('.auth_wrapper')).click(); + console.log(' 4 | verifyElementPresent | css=.holla-button |'); + { + const elements = await driver.findElements(By.css('.holla-button')); + // assert(elements.length); + expect(elements.length); + } - console.log(" 5 | click | css=.holla-button | "); - await driver.findElement(By.css(".holla-button")).click(); - await sleep(5000); - // 8 | click | css=.d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container | - await driver.findElement(By.css(".d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container")).click() - // 9 | click | name=search-assets | - await driver.findElement(By.name("search-assets")).click() - // 10 | type | name=search-assets | hollaex - await driver.findElement(By.name("search-assets")).sendKeys("hollaex") - // 11 | sendKeys | name=search-assets | ${KEY_ENTER} - await driver.findElement(By.name("search-assets")).sendKeys(Key.ENTER) - // 12 | click | css=.td-amount > .d-flex | - await driver.findElement(By.css(".td-amount > .d-flex")).click() - // 13 | assertText | css=.mr-4 | 1 XHT - assert(await driver.findElement(By.css(".mr-4")).getText() == "1 XHT") - }) -}) \ No newline at end of file + console.log(' 5 | click | css=.holla-button | '); + await driver.findElement(By.css('.holla-button')).click(); + await sleep(5000); + // 8 | click | css=.d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container | + await driver.findElement(By.css('.d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container')).click(); + // 9 | click | name=search-assets | + await driver.findElement(By.name('search-assets')).click(); + // 10 | type | name=search-assets | hollaex + await driver.findElement(By.name('search-assets')).sendKeys('hollaex'); + // 11 | sendKeys | name=search-assets | ${KEY_ENTER} + await driver.findElement(By.name('search-assets')).sendKeys(Key.ENTER); + // 12 | click | css=.td-amount > .d-flex | + await driver.findElement(By.css('.td-amount > .d-flex')).click(); + // 13 | assertText | css=.mr-4 | 1 XHT + assert(await driver.findElement(By.css('.mr-4')).getText() == '1 XHT'); + }); +}); \ No newline at end of file diff --git a/test/Wallet/wallet.js b/test/Wallet/wallet.js index 58045058c5..5986974136 100644 --- a/test/Wallet/wallet.js +++ b/test/Wallet/wallet.js @@ -1,111 +1,119 @@ - +//testing the login function of Hollaex Kit +//Using Selenium webderiver and Mocha/Chai +//given, when and then const { Builder, By, Key, until } = require('selenium-webdriver'); const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); - +const dotenv = require('dotenv'); +const { addConsoleHandler } = require('selenium-webdriver/lib/logging'); +dotenv.config(); +let bob = process.env.BOB; +let passWord = process.env.PASSWORD; +let logInPage = process.env.LOGIN_PAGE; +let webSite = process.nextTick.WEBSITE; describe('LogIn', function() { - this.timeout(30000); - let driver; - let vars; - function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); - } - beforeEach(async function() { - driver = await new Builder().forBrowser('chrome').build(); - vars = {}; - console.log(" Test name: BobLogIn"); - await driver.get("https://sandbox.hollaex.com/login"); - await driver.sleep(5000); - const title = await driver.getTitle(); - console.log(title) - expect(title).to.equal(title); - console.log("entring sand box"); - console.log(" Step # | action | target | value"); + this.timeout(30000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + console.log(' Test name: BobLogIn'); + await driver.get(logInPage); + await driver.sleep(5000); + const title = await driver.getTitle(); + console.log(title); + expect(title).to.equal(title); + console.log('entring sand box'); + console.log(' Step # | action | target | value'); - console.log(" 1 | type | name=email | bob@gmail.com"); - await driver.wait(until.elementLocated(By.name("email")), 5000) - await driver.findElement(By.name("email")).sendKeys("bob@gmail.com"); + console.log(' 1 | type | name=email | bob@gmail.com'); + await driver.wait(until.elementLocated(By.name('email')), 5000); + await driver.findElement(By.name('email')).sendKeys(bob); - console.log(" 2 | type | name=password | Holla!"); - await driver.wait(until.elementLocated(By.name("password")), 5000) - await driver.findElement(By.name("password")).sendKeys("Holla!"); + console.log(' 2 | type | name=password | Holla!'); + await driver.wait(until.elementLocated(By.name('password')), 5000); + await driver.findElement(By.name('password')).sendKeys(passWord); - console.log(" 3 | click | css=.auth_wrapper | "); - await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(".auth_wrapper"))), 5000); - await driver.findElement(By.css(".auth_wrapper")).click(); - console.log(" 4 | verifyElementPresent | css=.holla-button |"); - { - const elements = await driver.findElements(By.css(".holla-button")); - // assert(elements.length); - expect(elements.length); - } + console.log(' 3 | click | css=.auth_wrapper | '); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.auth_wrapper'))), 5000); + await driver.findElement(By.css('.auth_wrapper')).click(); + console.log(' 4 | verifyElementPresent | css=.holla-button |'); + { + const elements = await driver.findElements(By.css('.holla-button')); + // assert(elements.length); + expect(elements.length); + } - console.log(" 5 | click | css=.holla-button | "); - await driver.findElement(By.css(".holla-button")).click(); - await sleep(5000); - }) - afterEach(async function() { - await driver.quit(); - }) - it('ETH', async function() { + console.log(' 5 | click | css=.holla-button | '); + await driver.findElement(By.css('.holla-button')).click(); + await sleep(5000); + }); + afterEach(async function() { + await driver.quit(); + }); + it('ETH', async function() { - await driver.get("https://sandbox.hollaex.com/wallet"); - await sleep(5000); - await driver.findElement(By.name("search-assets")).click() - // 3 | type | name=search-assets | USDT - await driver.findElement(By.name("search-assets")).sendKeys("USDT") - // 4 | sendKeys | name=search-assets | ${KEY_ENTER} - await driver.findElement(By.name("search-assets")).sendKeys(Key.ENTER) - // 5 | click | css=.action-button-wrapper:nth-child(1) > .action_notification-text | - await driver.findElement(By.css(".action-button-wrapper:nth-child(1) > .action_notification-text")).click() - // 6 | click | css=.dropdown-placeholder | - await driver.findElement(By.css(".dropdown-placeholder")).click() - // 7 | click | id=network-eth-0 | - await driver.findElement(By.id("network-eth-0")).click() - // 8 | click | css=.holla-button | - await driver.findElement(By.css(".holla-button")).click() - // 9 | click | css=.font-weight-bold | - await driver.findElement(By.css(".font-weight-bold")).click() - // 10 | assertText | css=.font-weight-bold > .edit-wrapper__container | Generate USD Tether Wallet - assert(await driver.findElement(By.css(".font-weight-bold > .edit-wrapper__container")).getText() == "Generate USD Tether Wallet") - // 11 | click | css=.holla-button:nth-child(3) | - await driver.findElement(By.css(".holla-button:nth-child(3)")).click() - // 12 | click | css=.dumb-field-wrapper .field-label-wrapper > .d-flex | - await driver.findElement(By.css(".dumb-field-wrapper .field-label-wrapper > .d-flex")).click() - // 13 | assertText | css=.dumb-field-wrapper .d-flex > .field-label | Your USD Tether receiving address - assert(await driver.findElement(By.css(".dumb-field-wrapper .d-flex > .field-label")).getText() == "Your USD Tether receiving address") - }) - it('TRX', async function() { + await driver.get(webSite,'wallet'); + await sleep(5000); + await driver.findElement(By.name('search-assets')).click(); + // 3 | type | name=search-assets | USDT + await driver.findElement(By.name('search-assets')).sendKeys('USDT'); + // 4 | sendKeys | name=search-assets | ${KEY_ENTER} + await driver.findElement(By.name('search-assets')).sendKeys(Key.ENTER); + // 5 | click | css=.action-button-wrapper:nth-child(1) > .action_notification-text | + await driver.findElement(By.css('.action-button-wrapper:nth-child(1) > .action_notification-text')).click(); + // 6 | click | css=.dropdown-placeholder | + await driver.findElement(By.css('.dropdown-placeholder')).click(); + // 7 | click | id=network-eth-0 | + await driver.findElement(By.id('network-eth-0')).click(); + // 8 | click | css=.holla-button | + await driver.findElement(By.css('.holla-button')).click(); + // 9 | click | css=.font-weight-bold | + await driver.findElement(By.css('.font-weight-bold')).click(); + // 10 | assertText | css=.font-weight-bold > .edit-wrapper__container | Generate USD Tether Wallet + assert(await driver.findElement(By.css('.font-weight-bold > .edit-wrapper__container')).getText() == 'Generate USD Tether Wallet'); + // 11 | click | css=.holla-button:nth-child(3) | + await driver.findElement(By.css('.holla-button:nth-child(3)')).click(); + // 12 | click | css=.dumb-field-wrapper .field-label-wrapper > .d-flex | + await driver.findElement(By.css('.dumb-field-wrapper .field-label-wrapper > .d-flex')).click(); + // 13 | assertText | css=.dumb-field-wrapper .d-flex > .field-label | Your USD Tether receiving address + assert(await driver.findElement(By.css('.dumb-field-wrapper .d-flex > .field-label')).getText() == 'Your USD Tether receiving address'); + }); + it('TRX', async function() { - await driver.get("https://sandbox.hollaex.com/wallet"); - await sleep(5000); - await driver.findElement(By.name("search-assets")).click() - // 3 | type | name=search-assets | USDT - await driver.findElement(By.name("search-assets")).sendKeys("USDT") - // 4 | sendKeys | name=search-assets | ${KEY_ENTER} - await driver.findElement(By.name("search-assets")).sendKeys(Key.ENTER) - // 5 | click | css=.action-button-wrapper:nth-child(1) > .action_notification-text | - await driver.findElement(By.css(".action-button-wrapper:nth-child(1) > .action_notification-text")).click() - // 6 | click | css=.dropdown-placeholder | - await driver.findElement(By.css(".dropdown-placeholder")).click() - // 7 | click | id=network-eth-0 | - await driver.findElement(By.id("network-trx-1")).click() - // 8 | click | css=.holla-button | - await driver.findElement(By.css(".holla-button")).click() - // 9 | click | css=.font-weight-bold | - await driver.findElement(By.css(".font-weight-bold")).click() - // 10 | assertText | css=.font-weight-bold > .edit-wrapper__container | Generate USD Tether Wallet - assert(await driver.findElement(By.css(".font-weight-bold > .edit-wrapper__container")).getText() == "Generate USD Tether Wallet") - // 11 | click | css=.holla-button:nth-child(3) | - await driver.findElement(By.css(".holla-button:nth-child(3)")).click() - // 12 | click | css=.dumb-field-wrapper .field-label-wrapper > .d-flex | - await driver.findElement(By.css(".dumb-field-wrapper .field-label-wrapper > .d-flex")).click() - // 13 | assertText | css=.dumb-field-wrapper .d-flex > .field-label | Your USD Tether receiving address - assert(await driver.findElement(By.css(".dumb-field-wrapper .d-flex > .field-label")).getText() == "Your USD Tether receiving address") - }) -}) + await driver.get(webSite,'wallet'); + await sleep(5000); + await driver.findElement(By.name('search-assets')).click(); + // 3 | type | name=search-assets | USDT + await driver.findElement(By.name('search-assets')).sendKeys('USDT'); + // 4 | sendKeys | name=search-assets | ${KEY_ENTER} + await driver.findElement(By.name('search-assets')).sendKeys(Key.ENTER); + // 5 | click | css=.action-button-wrapper:nth-child(1) > .action_notification-text | + await driver.findElement(By.css('.action-button-wrapper:nth-child(1) > .action_notification-text')).click(); + // 6 | click | css=.dropdown-placeholder | + await driver.findElement(By.css('.dropdown-placeholder')).click(); + // 7 | click | id=network-eth-0 | + await driver.findElement(By.id('network-trx-1')).click(); + // 8 | click | css=.holla-button | + await driver.findElement(By.css('.holla-button')).click(); + // 9 | click | css=.font-weight-bold | + await driver.findElement(By.css('.font-weight-bold')).click(); + // 10 | assertText | css=.font-weight-bold > .edit-wrapper__container | Generate USD Tether Wallet + assert(await driver.findElement(By.css('.font-weight-bold > .edit-wrapper__container')).getText() == 'Generate USD Tether Wallet'); + // 11 | click | css=.holla-button:nth-child(3) | + await driver.findElement(By.css('.holla-button:nth-child(3)')).click(); + // 12 | click | css=.dumb-field-wrapper .field-label-wrapper > .d-flex | + await driver.findElement(By.css('.dumb-field-wrapper .field-label-wrapper > .d-flex')).click(); + // 13 | assertText | css=.dumb-field-wrapper .d-flex > .field-label | Your USD Tether receiving address + assert(await driver.findElement(By.css('.dumb-field-wrapper .d-flex > .field-label')).getText() == 'Your USD Tether receiving address'); + }); +}); diff --git a/test/gmailLogin.js b/test/gmailLogin.js new file mode 100644 index 0000000000..b8b143d89e --- /dev/null +++ b/test/gmailLogin.js @@ -0,0 +1,125 @@ +// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const { expect } = require('chai'); + + +describe('NewUserRequest', function() { + this.timeout(100000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + async function waitForWindow(timeout = 2) { + await driver.sleep(timeout); + const handlesThen = vars['windowHandles']; + const handlesNow = await driver.getAllWindowHandles(); + if (handlesNow.length > handlesThen.length) { + return handlesNow.find(handle => (!handlesThen.includes(handle))); + } + throw new Error('New window did not appear before timeout'); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + }); + afterEach(async function() { + // await driver.quit(); + + }); + + it('NewUserRequest', async function() { + console.log('Test name: NewUserRequest'); + console.log(' Step # | name | target | value'); + console.log('1 | open | https://sandbox.hollaex.com/signup | '); + await driver.get('https://sandbox.hollaex.com/signup'); + const title = await driver.getTitle(); + console.log(title); + expect(title).to.equal(title); + console.log('entring sand box'); + console.log(' Step # | action | target | value'); + console.log('2 | setWindowSize | 1050x660 | '); + await driver.manage().window().setRect(1050, 660); + + console.log('3 | type | name=email | youremail@gmail.com'); + await driver.wait(until.elementLocated(By.name('email')), 5000); + await driver.findElement(By.name('email')).clear(); + await driver.findElement(By.name('email')).sendKeys('47b2obbitholla@gmail.com'); + + console.log('4 | type | name=password | yourpassword!'); + await driver.findElement(By.name('password')).clear(); + await driver.findElement(By.name('password')).sendKeys('Holla2021!'); + + + console.log('5 | type | name=password_repeat | your password again!'); + await driver.findElement(By.name('password_repeat')).clear(); + await driver.findElement(By.name('password_repeat')).sendKeys('Holla2021!'); + + console.log('6 | click | name=terms |'); + await driver.findElement(By.name('terms')).click(); + + console.log('7 | click | css=.holla-button |'); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.holla-button'))), 50000); + await driver.findElement(By.css('.holla-button')).click(); + await driver.executeScript('window.scrollTo(0,0)'); + + console.log('8 | assertText | css=.icon_title-text | Email Sent'); + console.log('9 | waitForElementPresent | css=.icon_title-text | 5'); + + await driver.wait(until.elementLocated(By.css('.icon_title-text')), 5000); + await console.log(await driver.findElement(By.css('.icon_title-text')).getText()); + // expect(await driver.findElement(By.css(".icon_title-text")).getText()).to.equal("Email Sent"); + + console.log('Test name: New User Email Confirmation'); + console.log('Step # | name | target | value'); + console.log('1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |'); + await driver.get('https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin'); + + console.log('2 | setWindowSize | 1050x660 | '); + await driver.manage().window().setRect(1050, 660); + + console.log('3 | type&Enter | id=identifierId | youremail@gmail.com'); + await driver.findElement(By.id('identifierId')).sendKeys('yourgamil@gmail.com'); + await driver.findElement(By.id('identifierId')).sendKeys(Key.ENTER); + + console.log('4 | wait | name=password | Holla2021!'); + await driver.wait(until.elementsLocated(By.name('password'),30000,'wait', 5000)); + console.log('sleep well for 10'); + await sleep(5000); + + console.log('5 | type&Enter | id=password| your password!'); + await driver.findElement(By.name('password')).sendKeys('yourpassword'); + await driver.findElement(By.name('password')).sendKeys(Key.ENTER); + + console.log('sleep well for 5'); + await sleep(5000); + + console.log('6 | click | linkText=Refresh | '); + await driver.findElement(By.linkText('Refresh')).click(); + + console.log('7 | click | css=.ts | '); + await driver.findElement(By.css('.ts')).click(); + await driver.findElement(By.css('.h td')).click(); + + console.log(' 8 | assertText | css=h2 b | sandbox Sign Up'); + expect(await driver.findElement(By.css('h2 b')).getText()).to.equal('sandbox Sign Up'); + console.log(' 9 | click | css=button | '); + vars['windowHandles'] = await driver.getAllWindowHandles(); + console.log('10 | selectWindow | handle=${win9509} | '); + await driver.findElement(By.css('button')).click(); + console.log(' 11 | click | css=.icon_title-wrapper | '); + vars['win9509'] = await waitForWindow(5000); + console.log('12 | assertNotText | css=.icon_title-text | Error'); + await driver.switchTo().window(vars['win9509']); + await driver.findElement(By.css('.icon_title-wrapper')).click(); + { + const text = await driver.findElement(By.css('.icon_title-text')).getText(); + expect(text).to.not.equal('Error'); + } + + + }); +}); \ No newline at end of file diff --git a/test/index.js b/test/index.js new file mode 100644 index 0000000000..59ffaa4d67 --- /dev/null +++ b/test/index.js @@ -0,0 +1,36 @@ +//testing the login function of Hollaex Kit +//Using Selenium webderiver and Mocha/Chai +//given, when and then +console.log('****************************************'); +console.log('This E2E test developed for Hollaex-kit"'); +console.log('****************************************'); + +console.log('*****************'); +console.log('Login and log out'); +console.log('****************'); +require('./onboarding/logIn.js'); +require('./onboarding/logOut.js'); + +console.log('***************'); +console.log('signUp New user'); +console.log('***************'); +require('./onboarding/signUp.js'); + +console.log('*************'); +console.log('Reset Stories'); +console.log('*************'); +require('./onboarding/resetPassword.js'); +require('./onboarding/resendVerificationEmail.js'); + +console.log('*****'); +console.log('Trade'); +console.log('*****'); +require('./trade/trade.js'); +require('./trade/tradeWithStop.js'); +//require('./trade/cancelOrders.js'); + +console.log('******'); +console.log('Wallet'); +console.log('******'); +require('./wallet/DW_flow.js'); +require('./wallet/wallet.js'); \ No newline at end of file diff --git a/test/package-lock.json b/test/package-lock.json new file mode 100644 index 0000000000..ce1dec05a3 --- /dev/null +++ b/test/package-lock.json @@ -0,0 +1,7798 @@ +{ + "name": "selenes", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "selenes", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "dotenv": "^10.0.0", + "package.json": "^2.0.1", + "randomstring": "^1.2.1", + "selenium-webdriver": "4.0.0-beta.3" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^4.27.0", + "@typescript-eslint/parser": "^4.27.0", + "chai": "4.3.4", + "eslint": "^7.29.0", + "eslint-config-airbnb-base": "^14.2.1", + "eslint-config-google": "^0.14.0", + "eslint-plugin-import": "^2.23.4", + "eslint-plugin-react": "^7.24.0", + "mocha": "8.4.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", + "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.27.0.tgz", + "integrity": "sha512-DsLqxeUfLVNp3AO7PC3JyaddmEHTtI9qTSAs+RB6ja27QvIM0TA8Cizn1qcS6vOu+WDLFJzkwkgweiyFhssDdQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.27.0", + "@typescript-eslint/scope-manager": "4.27.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.21", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.27.0.tgz", + "integrity": "sha512-n5NlbnmzT2MXlyT+Y0Jf0gsmAQzCnQSWXKy4RGSXVStjDvS5we9IWbh7qRVKdGcxT0WYlgcCYUK/HRg7xFhvjQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.27.0", + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/typescript-estree": "4.27.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.27.0.tgz", + "integrity": "sha512-XpbxL+M+gClmJcJ5kHnUpBGmlGdgNvy6cehgR6ufyxkEJMGP25tZKCaKyC0W/JVpuhU3VU1RBn7SYUPKSMqQvQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "4.27.0", + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/typescript-estree": "4.27.0", + "debug": "^4.3.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.27.0.tgz", + "integrity": "sha512-DY73jK6SEH6UDdzc6maF19AHQJBFVRf6fgAXHPXCGEmpqD4vYgPEzqpFz1lf/daSbOcMpPPj9tyXXDPW2XReAw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/visitor-keys": "4.27.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.27.0.tgz", + "integrity": "sha512-I4ps3SCPFCKclRcvnsVA/7sWzh7naaM/b4pBO2hVxnM3wrU51Lveybdw5WoIktU/V4KfXrTt94V9b065b/0+wA==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.27.0.tgz", + "integrity": "sha512-KH03GUsUj41sRLLEy2JHstnezgpS5VNhrJouRdmh6yNdQ+yl8w5LrSwBkExM+jWwCJa7Ct2c8yl8NdtNRyQO6g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/visitor-keys": "4.27.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.27.0.tgz", + "integrity": "sha512-es0GRYNZp0ieckZ938cEANfEhsfHrzuLrePukLKtY3/KPXcq1Xd555Mno9/GOgXhKzn0QfkDLVgqWO3dGY80bg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.27.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/abs": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/abs/-/abs-1.3.14.tgz", + "integrity": "sha512-PrS26IzwKLWwuURpiKl8wRmJ2KdR/azaVrLEBWG/TALwT20Y7qjtYp1qcMLHA4206hBHY5phv3w4pjf9NPv4Vw==", + "dependencies": { + "ul": "^5.0.0" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", + "integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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/cliui/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "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": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dependencies": { + "capture-stack-trace": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/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/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/deffy": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.2.4.tgz", + "integrity": "sha512-pLc9lsbsWjr6RxmJ2OLyvm+9l4j1yK69h+TML/gUit/t3vTijpkNGh8LioaJYTGO7F25m6HZndADcUOo2PsiUg==", + "dependencies": { + "typpy": "^2.0.0" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "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/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/err": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/err/-/err-1.1.1.tgz", + "integrity": "sha1-65KOLhGjFmSPeCgz0PlyWLpDwvg=", + "dependencies": { + "typpy": "^2.2.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", + "eslint-plugin-import": "^2.22.1" + } + }, + "node_modules/eslint-config-google": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", + "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/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/eslint-plugin-import": { + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.4.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-plugin-import/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz", + "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.5" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exec-limiter": { + "version": "3.2.13", + "resolved": "https://registry.npmjs.org/exec-limiter/-/exec-limiter-3.2.13.tgz", + "integrity": "sha512-86Ri699bwiHZVBzTzNj8gspqAhCPchg70zPVWIh3qzUOA1pUMcb272Em3LPk8AE0mS95B9yMJhtqF8vFJAn0dA==", + "dependencies": { + "limit-it": "^3.0.0", + "typpy": "^2.1.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/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/flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.name": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/function.name/-/function.name-1.0.13.tgz", + "integrity": "sha512-mVrqdoy5npWZyoXl4DxCeuVF6delDcQjVS9aPdvLYlBxtMTZDR2B5GVEQEoM1jJyspCqg3C0v4ABkLE7tp9xFA==", + "dependencies": { + "noop6": "^1.0.1" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/git-package-json": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/git-package-json/-/git-package-json-1.4.10.tgz", + "integrity": "sha512-DRAcvbzd2SxGK7w8OgYfvKqhFliT5keX0lmSmVdgScgf1kkl5tbbo7Pam6uYoCa1liOiipKxQZG8quCtGWl/fA==", + "dependencies": { + "deffy": "^2.2.1", + "err": "^1.1.1", + "gry": "^5.0.0", + "normalize-package-data": "^2.3.5", + "oargv": "^3.4.1", + "one-by-one": "^3.1.0", + "r-json": "^1.2.1", + "r-package-json": "^1.0.0", + "tmp": "0.0.28" + } + }, + "node_modules/git-source": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/git-source/-/git-source-1.1.10.tgz", + "integrity": "sha512-XZZ7ZgnLL35oLgM/xjnLYgtlKlxJG0FohC1kWDvGkU7s1VKGXK0pFF/g1itQEwQ3D+uTQzBnzPi8XbqOv7Wc1Q==", + "dependencies": { + "git-url-parse": "^5.0.1" + } + }, + "node_modules/git-up": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-1.2.1.tgz", + "integrity": "sha1-JkSAoAax2EJhrB/gmjpRacV+oZ0=", + "dependencies": { + "is-ssh": "^1.0.0", + "parse-url": "^1.0.0" + } + }, + "node_modules/git-url-parse": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-5.0.1.tgz", + "integrity": "sha1-/j15xnRq4FBIz6UIyB553du6OEM=", + "dependencies": { + "git-up": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/got": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-5.6.0.tgz", + "integrity": "sha1-ux1+4WO3gIK7yOuDbz85UATqb78=", + "dependencies": { + "create-error-class": "^3.0.1", + "duplexer2": "^0.1.4", + "is-plain-obj": "^1.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "node-status-codes": "^1.0.0", + "object-assign": "^4.0.1", + "parse-json": "^2.1.0", + "pinkie-promise": "^2.0.0", + "read-all-stream": "^3.0.0", + "readable-stream": "^2.0.5", + "timed-out": "^2.0.0", + "unzip-response": "^1.0.0", + "url-parse-lax": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/gry": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/gry/-/gry-5.0.8.tgz", + "integrity": "sha512-meq9ZjYVpLzZh3ojhTg7IMad9grGsx6rUUKHLqPnhLXzJkRQvEL2U3tQpS5/WentYTtHtxkT3Ew/mb10D6F6/g==", + "dependencies": { + "abs": "^1.2.1", + "exec-limiter": "^3.0.0", + "one-by-one": "^3.0.0", + "ul": "^5.0.0" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "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==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "node_modules/is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-ssh": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.3.tgz", + "integrity": "sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ==", + "dependencies": { + "protocols": "^1.1.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/iterate-object": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz", + "integrity": "sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", + "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.2", + "object.assign": "^4.1.2" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jszip": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz", + "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/limit-it": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/limit-it/-/limit-it-3.2.10.tgz", + "integrity": "sha512-T0NK99pHnkimldr1WUqvbGV1oWDku/xC9J/OqzJFsV1jeOS6Bwl8W7vkeQIBqwiON9dTALws+rX/XPMQqWerDQ==", + "dependencies": { + "typpy": "^2.0.0" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "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/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mocha": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 10.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/node-status-codes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/noop6": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.9.tgz", + "integrity": "sha512-DB3Hwyd89dPr5HqEPg3YHjzvwh/mCqizC1zZ8vyofqc+TQRyPDnT4wgXXbLGF4z9YAzwwTLi8pNLhGqcbSjgkA==" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oargv": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/oargv/-/oargv-3.4.10.tgz", + "integrity": "sha512-SXaMANv9sr7S/dP0vj0+Ybipa47UE1ntTWQ2rpPRhC6Bsvfl+Jg03Xif7jfL0sWKOYWK8oPjcZ5eJ82t8AP/8g==", + "dependencies": { + "iterate-object": "^1.1.0", + "ul": "^5.0.0" + } + }, + "node_modules/obj-def": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/obj-def/-/obj-def-1.0.9.tgz", + "integrity": "sha512-bQ4ya3VYD6FAA1+s6mEhaURRHSmw4+sKaXE6UyXZ1XDYc5D+c7look25dFdydmLd18epUegh398gdDkMUZI9xg==", + "dependencies": { + "deffy": "^2.2.2" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-by-one": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/one-by-one/-/one-by-one-3.2.8.tgz", + "integrity": "sha512-HR/pSzZdm46Xqj58K+Bu64kMbSTw8/u77AwWvV+rprO/OsuR++pPlkUJn+SmwqBGRgHKwSKQ974V3uls7crIeQ==", + "dependencies": { + "obj-def": "^1.0.0", + "sliced": "^1.0.1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", + "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=", + "dependencies": { + "got": "^5.0.0", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/package-json-path/-/package-json-path-1.0.9.tgz", + "integrity": "sha512-uNu7f6Ef7tQHZRnkyVnCtzdSYVN9uBtge/sG7wzcUaawFWkPYUq67iXxRGrQSg/q0tzxIB8jSyIYUKjG2Jn//A==", + "dependencies": { + "abs": "^1.2.1" + } + }, + "node_modules/package.json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/package.json/-/package.json-2.0.1.tgz", + "integrity": "sha1-+IYFnSpJ7QduZIg2ldc7K0bSHW0=", + "deprecated": "Use pkg.json instead.", + "dependencies": { + "git-package-json": "^1.4.0", + "git-source": "^1.1.0", + "package-json": "^2.3.1" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-url": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-1.3.11.tgz", + "integrity": "sha1-V8FUKKuKiSsfQ4aWRccR0OFEtVQ=", + "dependencies": { + "is-ssh": "^1.3.0", + "protocols": "^1.4.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "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/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/protocols": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", + "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==" + }, + "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/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/r-json": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/r-json/-/r-json-1.2.10.tgz", + "integrity": "sha512-hu9vyLjSlHXT62NAS7DjI9WazDlvjN0lgp3n431dCVnirVcLkZIpzSwA3orhZEKzdDD2jqNYI+w0yG0aFf4kpA==" + }, + "node_modules/r-package-json": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/r-package-json/-/r-package-json-1.0.9.tgz", + "integrity": "sha512-G4Vpf1KImWmmPFGdtWQTU0L9zk0SjqEC4qs/jE7AQ+Ylmr5kizMzGeC4wnHp5+ijPqNN+2ZPpvyjVNdN1CDVcg==", + "dependencies": { + "package-json-path": "^1.0.0", + "r-json": "^1.2.1" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomstring": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.2.1.tgz", + "integrity": "sha512-eMnfell9XuU3jfCx3f4xCaFAt0YMFPZhx9R3PSStmLarDKg5j5vivqKhf/8pvG+VX/YkxsckHK/VPUrKa5V07A==", + "dependencies": { + "array-uniq": "1.0.2", + "randombytes": "2.0.3" + }, + "bin": { + "randomstring": "bin/randomstring" + }, + "engines": { + "node": "*" + } + }, + "node_modules/randomstring/node_modules/randombytes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", + "integrity": "sha1-Z0yZdgkBw8QRJ3GjHlIdw0nMCew=" + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/read-all-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", + "dependencies": { + "pinkie-promise": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/selenium-webdriver": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-beta.3.tgz", + "integrity": "sha512-R0mGHpQkSKgIWiPgcKDcckh4A6aaK0KTyWxs5ieuiI7zsXQ+Kb6neph+dNoeqq3jSBGyv3ONo2w3oohoL4D/Rg==", + "dependencies": { + "jszip": "^3.5.0", + "rimraf": "^2.7.1", + "tmp": "^0.2.1", + "ws": "^7.3.1" + }, + "engines": { + "node": ">= 10.15.0" + } + }, + "node_modules/selenium-webdriver/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/selenium-webdriver/node_modules/tmp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "engines": { + "node": ">=0.10.0" + } + }, + "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/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/slice-ansi/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/sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/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/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/timed-out": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", + "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tmp": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", + "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=", + "dependencies": { + "os-tmpdir": "~1.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", + "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/typpy": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.3.13.tgz", + "integrity": "sha512-vOxIcQz9sxHi+rT09SJ5aDgVgrPppQjwnnayTrMye1ODaU8gIZTDM19t9TxmEElbMihx2Nq/0/b/MtyKfayRqA==", + "dependencies": { + "function.name": "^1.0.3" + } + }, + "node_modules/ul": { + "version": "5.2.15", + "resolved": "https://registry.npmjs.org/ul/-/ul-5.2.15.tgz", + "integrity": "sha512-svLEUy8xSCip5IWnsRa0UOg+2zP0Wsj4qlbjTmX6GJSmvKMHADBuHOm1dpNkWqWPIGuVSqzUkV3Cris5JrlTRQ==", + "dependencies": { + "deffy": "^2.2.2", + "typpy": "^2.3.4" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.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/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "dev": true + }, + "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/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/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/wrap-ansi/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/ws": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", + "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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/yargs/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", + "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.27.0.tgz", + "integrity": "sha512-DsLqxeUfLVNp3AO7PC3JyaddmEHTtI9qTSAs+RB6ja27QvIM0TA8Cizn1qcS6vOu+WDLFJzkwkgweiyFhssDdQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.27.0", + "@typescript-eslint/scope-manager": "4.27.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.21", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.27.0.tgz", + "integrity": "sha512-n5NlbnmzT2MXlyT+Y0Jf0gsmAQzCnQSWXKy4RGSXVStjDvS5we9IWbh7qRVKdGcxT0WYlgcCYUK/HRg7xFhvjQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.27.0", + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/typescript-estree": "4.27.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.27.0.tgz", + "integrity": "sha512-XpbxL+M+gClmJcJ5kHnUpBGmlGdgNvy6cehgR6ufyxkEJMGP25tZKCaKyC0W/JVpuhU3VU1RBn7SYUPKSMqQvQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.27.0", + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/typescript-estree": "4.27.0", + "debug": "^4.3.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.27.0.tgz", + "integrity": "sha512-DY73jK6SEH6UDdzc6maF19AHQJBFVRf6fgAXHPXCGEmpqD4vYgPEzqpFz1lf/daSbOcMpPPj9tyXXDPW2XReAw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/visitor-keys": "4.27.0" + } + }, + "@typescript-eslint/types": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.27.0.tgz", + "integrity": "sha512-I4ps3SCPFCKclRcvnsVA/7sWzh7naaM/b4pBO2hVxnM3wrU51Lveybdw5WoIktU/V4KfXrTt94V9b065b/0+wA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.27.0.tgz", + "integrity": "sha512-KH03GUsUj41sRLLEy2JHstnezgpS5VNhrJouRdmh6yNdQ+yl8w5LrSwBkExM+jWwCJa7Ct2c8yl8NdtNRyQO6g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/visitor-keys": "4.27.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.27.0.tgz", + "integrity": "sha512-es0GRYNZp0ieckZ938cEANfEhsfHrzuLrePukLKtY3/KPXcq1Xd555Mno9/GOgXhKzn0QfkDLVgqWO3dGY80bg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.27.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "abs": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/abs/-/abs-1.3.14.tgz", + "integrity": "sha512-PrS26IzwKLWwuURpiKl8wRmJ2KdR/azaVrLEBWG/TALwT20Y7qjtYp1qcMLHA4206hBHY5phv3w4pjf9NPv4Vw==", + "requires": { + "ul": "^5.0.0" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-uniq": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", + "integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0=" + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "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 + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "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==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" + }, + "chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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 + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.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 + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "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": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "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" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "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 + } + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deffy": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.2.4.tgz", + "integrity": "sha512-pLc9lsbsWjr6RxmJ2OLyvm+9l4j1yK69h+TML/gUit/t3vTijpkNGh8LioaJYTGO7F25m6HZndADcUOo2PsiUg==", + "requires": { + "typpy": "^2.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "^2.0.2" + } + }, + "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 + }, + "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" + } + }, + "err": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/err/-/err-1.1.1.tgz", + "integrity": "sha1-65KOLhGjFmSPeCgz0PlyWLpDwvg=", + "requires": { + "typpy": "^2.2.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "eslint-config-airbnb-base": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + } + }, + "eslint-config-google": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", + "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "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" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.4.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "eslint-plugin-react": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz", + "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.5" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "exec-limiter": { + "version": "3.2.13", + "resolved": "https://registry.npmjs.org/exec-limiter/-/exec-limiter-3.2.13.tgz", + "integrity": "sha512-86Ri699bwiHZVBzTzNj8gspqAhCPchg70zPVWIh3qzUOA1pUMcb272Em3LPk8AE0mS95B9yMJhtqF8vFJAn0dA==", + "requires": { + "limit-it": "^3.0.0", + "typpy": "^2.1.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "dependencies": { + "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" + } + } + } + }, + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.name": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/function.name/-/function.name-1.0.13.tgz", + "integrity": "sha512-mVrqdoy5npWZyoXl4DxCeuVF6delDcQjVS9aPdvLYlBxtMTZDR2B5GVEQEoM1jJyspCqg3C0v4ABkLE7tp9xFA==", + "requires": { + "noop6": "^1.0.1" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "git-package-json": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/git-package-json/-/git-package-json-1.4.10.tgz", + "integrity": "sha512-DRAcvbzd2SxGK7w8OgYfvKqhFliT5keX0lmSmVdgScgf1kkl5tbbo7Pam6uYoCa1liOiipKxQZG8quCtGWl/fA==", + "requires": { + "deffy": "^2.2.1", + "err": "^1.1.1", + "gry": "^5.0.0", + "normalize-package-data": "^2.3.5", + "oargv": "^3.4.1", + "one-by-one": "^3.1.0", + "r-json": "^1.2.1", + "r-package-json": "^1.0.0", + "tmp": "0.0.28" + } + }, + "git-source": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/git-source/-/git-source-1.1.10.tgz", + "integrity": "sha512-XZZ7ZgnLL35oLgM/xjnLYgtlKlxJG0FohC1kWDvGkU7s1VKGXK0pFF/g1itQEwQ3D+uTQzBnzPi8XbqOv7Wc1Q==", + "requires": { + "git-url-parse": "^5.0.1" + } + }, + "git-up": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-1.2.1.tgz", + "integrity": "sha1-JkSAoAax2EJhrB/gmjpRacV+oZ0=", + "requires": { + "is-ssh": "^1.0.0", + "parse-url": "^1.0.0" + } + }, + "git-url-parse": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-5.0.1.tgz", + "integrity": "sha1-/j15xnRq4FBIz6UIyB553du6OEM=", + "requires": { + "git-up": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } + } + }, + "got": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-5.6.0.tgz", + "integrity": "sha1-ux1+4WO3gIK7yOuDbz85UATqb78=", + "requires": { + "create-error-class": "^3.0.1", + "duplexer2": "^0.1.4", + "is-plain-obj": "^1.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "node-status-codes": "^1.0.0", + "object-assign": "^4.0.1", + "parse-json": "^2.1.0", + "pinkie-promise": "^2.0.0", + "read-all-stream": "^3.0.0", + "readable-stream": "^2.0.5", + "timed-out": "^2.0.0", + "unzip-response": "^1.0.0", + "url-parse-lax": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "gry": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/gry/-/gry-5.0.8.tgz", + "integrity": "sha512-meq9ZjYVpLzZh3ojhTg7IMad9grGsx6rUUKHLqPnhLXzJkRQvEL2U3tQpS5/WentYTtHtxkT3Ew/mb10D6F6/g==", + "requires": { + "abs": "^1.2.1", + "exec-limiter": "^3.0.0", + "one-by-one": "^3.0.0", + "ul": "^5.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "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 + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "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==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + }, + "is-ssh": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.3.tgz", + "integrity": "sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ==", + "requires": { + "protocols": "^1.1.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "iterate-object": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz", + "integrity": "sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsx-ast-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", + "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "dev": true, + "requires": { + "array-includes": "^3.1.2", + "object.assign": "^4.1.2" + } + }, + "jszip": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz", + "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, + "limit-it": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/limit-it/-/limit-it-3.2.10.tgz", + "integrity": "sha512-T0NK99pHnkimldr1WUqvbGV1oWDku/xC9J/OqzJFsV1jeOS6Bwl8W7vkeQIBqwiON9dTALws+rX/XPMQqWerDQ==", + "requires": { + "typpy": "^2.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.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.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "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" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mocha": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-status-codes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=" + }, + "noop6": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.9.tgz", + "integrity": "sha512-DB3Hwyd89dPr5HqEPg3YHjzvwh/mCqizC1zZ8vyofqc+TQRyPDnT4wgXXbLGF4z9YAzwwTLi8pNLhGqcbSjgkA==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "oargv": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/oargv/-/oargv-3.4.10.tgz", + "integrity": "sha512-SXaMANv9sr7S/dP0vj0+Ybipa47UE1ntTWQ2rpPRhC6Bsvfl+Jg03Xif7jfL0sWKOYWK8oPjcZ5eJ82t8AP/8g==", + "requires": { + "iterate-object": "^1.1.0", + "ul": "^5.0.0" + } + }, + "obj-def": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/obj-def/-/obj-def-1.0.9.tgz", + "integrity": "sha512-bQ4ya3VYD6FAA1+s6mEhaURRHSmw4+sKaXE6UyXZ1XDYc5D+c7look25dFdydmLd18epUegh398gdDkMUZI9xg==", + "requires": { + "deffy": "^2.2.2" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, + "object.fromentries": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + } + }, + "object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "one-by-one": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/one-by-one/-/one-by-one-3.2.8.tgz", + "integrity": "sha512-HR/pSzZdm46Xqj58K+Bu64kMbSTw8/u77AwWvV+rprO/OsuR++pPlkUJn+SmwqBGRgHKwSKQ974V3uls7crIeQ==", + "requires": { + "obj-def": "^1.0.0", + "sliced": "^1.0.1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-json": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", + "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=", + "requires": { + "got": "^5.0.0", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "package-json-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/package-json-path/-/package-json-path-1.0.9.tgz", + "integrity": "sha512-uNu7f6Ef7tQHZRnkyVnCtzdSYVN9uBtge/sG7wzcUaawFWkPYUq67iXxRGrQSg/q0tzxIB8jSyIYUKjG2Jn//A==", + "requires": { + "abs": "^1.2.1" + } + }, + "package.json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/package.json/-/package.json-2.0.1.tgz", + "integrity": "sha1-+IYFnSpJ7QduZIg2ldc7K0bSHW0=", + "requires": { + "git-package-json": "^1.4.0", + "git-source": "^1.1.0", + "package-json": "^2.3.1" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-url": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-1.3.11.tgz", + "integrity": "sha1-V8FUKKuKiSsfQ4aWRccR0OFEtVQ=", + "requires": { + "is-ssh": "^1.3.0", + "protocols": "^1.4.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "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 + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "protocols": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", + "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==" + }, + "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 + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "r-json": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/r-json/-/r-json-1.2.10.tgz", + "integrity": "sha512-hu9vyLjSlHXT62NAS7DjI9WazDlvjN0lgp3n431dCVnirVcLkZIpzSwA3orhZEKzdDD2jqNYI+w0yG0aFf4kpA==" + }, + "r-package-json": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/r-package-json/-/r-package-json-1.0.9.tgz", + "integrity": "sha512-G4Vpf1KImWmmPFGdtWQTU0L9zk0SjqEC4qs/jE7AQ+Ylmr5kizMzGeC4wnHp5+ijPqNN+2ZPpvyjVNdN1CDVcg==", + "requires": { + "package-json-path": "^1.0.0", + "r-json": "^1.2.1" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomstring": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.2.1.tgz", + "integrity": "sha512-eMnfell9XuU3jfCx3f4xCaFAt0YMFPZhx9R3PSStmLarDKg5j5vivqKhf/8pvG+VX/YkxsckHK/VPUrKa5V07A==", + "requires": { + "array-uniq": "1.0.2", + "randombytes": "2.0.3" + }, + "dependencies": { + "randombytes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", + "integrity": "sha1-Z0yZdgkBw8QRJ3GjHlIdw0nMCew=" + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + } + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "read-all-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", + "requires": { + "pinkie-promise": "^2.0.0", + "readable-stream": "^2.0.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + } + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "requires": { + "rc": "^1.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "selenium-webdriver": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-beta.3.tgz", + "integrity": "sha512-R0mGHpQkSKgIWiPgcKDcckh4A6aaK0KTyWxs5ieuiI7zsXQ+Kb6neph+dNoeqq3jSBGyv3ONo2w3oohoL4D/Rg==", + "requires": { + "jszip": "^3.5.0", + "rimraf": "^2.7.1", + "tmp": "^0.2.1", + "ws": "^7.3.1" + }, + "dependencies": { + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "requires": { + "rimraf": "^3.0.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } + } + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "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 + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string.prototype.matchall": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "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" + } + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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 + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "timed-out": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", + "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=" + }, + "tmp": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", + "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=", + "requires": { + "os-tmpdir": "~1.0.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typescript": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", + "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", + "dev": true, + "peer": true + }, + "typpy": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.3.13.tgz", + "integrity": "sha512-vOxIcQz9sxHi+rT09SJ5aDgVgrPppQjwnnayTrMye1ODaU8gIZTDM19t9TxmEElbMihx2Nq/0/b/MtyKfayRqA==", + "requires": { + "function.name": "^1.0.3" + } + }, + "ul": { + "version": "5.2.15", + "resolved": "https://registry.npmjs.org/ul/-/ul-5.2.15.tgz", + "integrity": "sha512-svLEUy8xSCip5IWnsRa0UOg+2zP0Wsj4qlbjTmX6GJSmvKMHADBuHOm1dpNkWqWPIGuVSqzUkV3Cris5JrlTRQ==", + "requires": { + "deffy": "^2.2.2", + "typpy": "^2.3.4" + } + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "^1.0.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.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" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "dev": true + }, + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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 + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", + "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", + "requires": {} + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "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 + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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 + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + } + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/test/package.json b/test/package.json index beee6acda8..d8b855a377 100644 --- a/test/package.json +++ b/test/package.json @@ -4,16 +4,33 @@ "description": "Test Selenuim on JS", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "mocha index.js" }, "author": "Mahdi", "license": "MIT", "keywords": [], "dependencies": { +<<<<<<< HEAD + "dotenv": "^10.0.0", + "package.json": "^2.0.1", + "randomstring": "^1.2.1", "selenium-webdriver": "4.0.0-beta.3" }, "devDependencies": { + "@typescript-eslint/eslint-plugin": "^4.27.0", + "@typescript-eslint/parser": "^4.27.0", "chai": "4.3.4", + "eslint": "^7.29.0", + "eslint-config-airbnb-base": "^14.2.1", + "eslint-config-google": "^0.14.0", + "eslint-plugin-import": "^2.23.4", + "eslint-plugin-react": "^7.24.0", +======= + "selenium-webdriver": "4.0.0-beta.3" + }, + "devDependencies": { + "chai": "4.3.4", +>>>>>>> 13a04954aa1b9c5082241f53ea2dcc00d45c4294 "mocha": "8.4.0" } } From f9625111461a6cbd61aeaf5dd7a7a80e78e23e52 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Thu, 24 Jun 2021 01:42:30 +0800 Subject: [PATCH 015/222] the verification link can be retrieved --- test/.env | 11 +- test/.gitignore | 1 + test/Onboarding/SignUp.js | 10 +- test/Onboarding/scraper.js | 33 + test/package-lock.json | 3127 +++++++++++++++++++++++++++++++++++- test/package.json | 13 +- 6 files changed, 3090 insertions(+), 105 deletions(-) create mode 100644 test/Onboarding/scraper.js diff --git a/test/.env b/test/.env index 3a19e54d3d..5b1b590b32 100644 --- a/test/.env +++ b/test/.env @@ -1,18 +1,13 @@ -<<<<<<< HEAD NODE_ENV = USER_NAME = ADMIN_USER = ADMIN_PASS = NEW_USER = PASSWORD = -WEBSITE = +WEBSITE = LOGIN_PAGE = SIGN_UP_PAGE = EMAIL_PAGE = Email_ADMIN_USERNAME = -ALICE = -BOB = -======= -EMAIL= -PASSWORD= ->>>>>>> 13a04954aa1b9c5082241f53ea2dcc00d45c4294 +ALICE = +BOB = diff --git a/test/.gitignore b/test/.gitignore index c37ece228b..8613e5055d 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -1 +1,2 @@ .env.example +txt.txt diff --git a/test/Onboarding/SignUp.js b/test/Onboarding/SignUp.js index 096a7b0eab..c5bcad930c 100644 --- a/test/Onboarding/SignUp.js +++ b/test/Onboarding/SignUp.js @@ -1,6 +1,8 @@ //testing the login function of Hollaex Kit //Using Selenium webderiver and Mocha/Chai //given, when and then + +const scrap = require('./scraper'); const { Builder, By, until } = require('selenium-webdriver'); const assert = require('assert'); const { expect } = require('chai'); @@ -102,10 +104,11 @@ describe('NewUserRequest', function() { await sleep(10000); console.log('12 | storeText | xpath=/html/body/pre/a[22] | content'); vars['content'] = await driver.findElement(By.xpath('/html/body/pre/a[22]')).getText(); + const emailCont = await driver.findElement(By.css('pre')).getText(); console.log('13 | echo | ${content} | '); console.log(vars['content']); console.log('14 | assertText | xpath=/html/body/pre/a[22] | ${content}'); - expect(vars['content']).to.equal(newUser.toLowerCase()); + // expect(vars['content']).to.equal(newUser.toLowerCase()); console.log('15 | storeAttribute | xpath=/html/body/pre/a[26]@href | mytextlink'); { @@ -117,7 +120,10 @@ describe('NewUserRequest', function() { console.log('17 | echo | \'xpath=/html/body/pre/a[26]\' | '); console.log('\'xpath=/html/body/pre/a[26]\''); console.log('18 | open | ${mytextlink} | '); - await driver.get(vars['mytextlink']); + + const completedLink = await scrap.addRest(emailCont,vars['mytextlink']); + await console.log(completedLink); + await driver.get(completedLink); console.log('19 | selectFrame | relative=parent | '); await sleep(1000); await driver.switchTo().defaultContent(); diff --git a/test/Onboarding/scraper.js b/test/Onboarding/scraper.js new file mode 100644 index 0000000000..8d98c6fb75 --- /dev/null +++ b/test/Onboarding/scraper.js @@ -0,0 +1,33 @@ +// const fs = require("fs"); +// const fileContents = fs.readFileSync('txt.txt').toString(); + +function chunkCleaner(str){ + return str.replace(/(=\\r\\n|\\n|\\r|\\t)/gm,""); +} +function getURLsFromString(str) { + var re = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www\.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%\/.\w-]*)?\??(?:[-+=&;%@.\w]*)#?\w*)?)/gm; + var m; + var arr = []; + while ((m = re.exec(str)) !== null) { + if (m.index === re.lastIndex) { + re.lastIndex++; + } + arr.push(m[0]); + } + return arr; +} +function contains(a, obj) { + for (var i = 0; i < a.length; i++) { + if (String(a[i]).startsWith(obj)) { + //console.log(a[i],i); + return (a[i]); + } + } + return false; +} +function addRest(str,txt){ + let UrlList = getURLsFromString(chunkCleaner(str)) + return contains(UrlList,txt); +} +module.exports = {addRest}; +// addRest(fileContents,"https://sandbox.hollaex.com/verify/"); diff --git a/test/package-lock.json b/test/package-lock.json index ce1dec05a3..6a40e88595 100644 --- a/test/package-lock.json +++ b/test/package-lock.json @@ -10,9 +10,13 @@ "license": "MIT", "dependencies": { "dotenv": "^10.0.0", + "get-urls": "^10.0.0", + "normalize-url": "^5.3.1", "package.json": "^2.0.1", "randomstring": "^1.2.1", - "selenium-webdriver": "4.0.0-beta.3" + "selenium-webdriver": "4.0.0-beta.3", + "tokenize-file": "^0.1.7", + "url-regex-safe": "^1.0.2" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^4.27.0", @@ -206,6 +210,40 @@ "node": ">= 8" } }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, "node_modules/@types/json-schema": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", @@ -218,6 +256,11 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "node_modules/@types/node": { + "version": "15.12.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz", + "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "4.27.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.27.0.tgz", @@ -411,6 +454,11 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/abs": { "version": "1.3.14", "resolved": "https://registry.npmjs.org/abs/-/abs-1.3.14.tgz", @@ -440,6 +488,69 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/adler-32": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.0.tgz", + "integrity": "sha512-f5nltvjl+PRUh6YNfUstRaXwJxtfnKEWhAWWlmKvh+Y3J2+98a0KKVYDEhz6NdKGqswLhjNGznxfSsZGOvOd9g==", + "dependencies": { + "printj": "~1.2.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "engines": { + "node": ">=0.3.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.4.tgz", + "integrity": "sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ==", + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aggregate-error/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==", + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -469,7 +580,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, "engines": { "node": ">=4" } @@ -502,12 +612,45 @@ "node": ">= 8" } }, + "node_modules/apparatus": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/apparatus/-/apparatus-0.0.10.tgz", + "integrity": "sha512-KLy/ugo33KZA7nugtQ7O0E1c8kQ52N3IvD/XgIh4w/Nr28ypfkwDfA67F1ev4N1m5D+BOk1+b2dEJDfpj/VvZg==", + "dependencies": { + "sylvester": ">= 0.0.8" + }, + "engines": { + "node": ">=0.2.6" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array-includes": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", @@ -597,6 +740,12 @@ "node": ">=8" } }, + "node_modules/babyparse": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/babyparse/-/babyparse-0.2.1.tgz", + "integrity": "sha1-Bp8DXfP9zm86RV3V2vx1F43PN2A=", + "deprecated": "Deprecated in favour of PapaParse, which now supports Node.js" + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -611,6 +760,25 @@ "node": ">=8" } }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -638,6 +806,60 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "node_modules/cacache": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", + "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", + "dependencies": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -672,6 +894,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/capture-stack-trace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", @@ -680,6 +922,20 @@ "node": ">=0.10.0" } }, + "node_modules/cfb": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-0.11.1.tgz", + "integrity": "sha1-qW248nKmw/uZ27sj70EiP0i+Hqc=", + "dependencies": { + "commander": "" + }, + "bin": { + "cfb": "bin/cfb.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/chai": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", @@ -734,6 +990,22 @@ "node": "*" } }, + "node_modules/cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/chokidar": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", @@ -755,6 +1027,22 @@ "fsevents": "~2.3.1" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "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==", + "engines": { + "node": ">=6" + } + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -810,6 +1098,34 @@ "node": ">=8" } }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/codepage": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz", + "integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=", + "dependencies": { + "commander": "~2.14.1", + "exit-on-epipe": "~1.0.1" + }, + "bin": { + "codepage": "bin/codepage.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/codepage/node_modules/commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -828,22 +1144,96 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/confusing-browser-globals": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", "dev": true }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, "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": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "node_modules/crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "dependencies": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + }, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc-32/node_modules/printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", + "bin": { + "printj": "bin/printj.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/create-error-class": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", @@ -869,11 +1259,40 @@ "node": ">= 8" } }, + "node_modules/css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "node_modules/css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "engines": { + "node": "*" + } + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -889,8 +1308,7 @@ "node_modules/debug/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 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/decamelize": { "version": "4.0.0", @@ -950,6 +1368,19 @@ "node": ">= 0.4" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -983,6 +1414,37 @@ "node": ">=6.0.0" } }, + "node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, "node_modules/dotenv": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", @@ -1005,6 +1467,27 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -1017,6 +1500,29 @@ "node": ">=8.6" } }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/epub2": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/epub2/-/epub2-1.3.4.tgz", + "integrity": "sha512-KSkxyVaIDZfez+epxNVr9ALql4TxAuyJeweBFJ/bQ8J+bLALb5qZdfe16T7ZbyuC1GXlyUMVDkSUP7SB95pc/A==", + "dependencies": { + "adm-zip": "^0.4.4", + "bluebird": "^3.5.1", + "xml2js": "^0.4.4" + } + }, "node_modules/err": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/err/-/err-1.1.1.tgz", @@ -1025,6 +1531,11 @@ "typpy": "^2.2.0" } }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -1626,6 +2137,14 @@ "typpy": "^2.1.0" } }, + "node_modules/exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1670,6 +2189,14 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -1682,6 +2209,12 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1753,7 +2286,26 @@ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, - "node_modules/fs.realpath": { + "node_modules/frac": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/frac/-/frac-0.3.1.tgz", + "integrity": "sha1-V3Z3t/3L5vr3xGHxgB00E3zaQ1Q=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" @@ -1791,6 +2343,64 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1823,6 +2433,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-urls": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/get-urls/-/get-urls-10.0.0.tgz", + "integrity": "sha512-ssCMAvuD5A8PzcYCdeyodjbf1v8XF2lMuhSCQbgsvCC7Uha0S8xGwBG/5/afMWsdBR7jOry/kd8Iq5P1ML5tww==", + "dependencies": { + "normalize-url": "^5.1.0", + "url-regex-safe": "^1.0.2" + }, + "engines": { + "node": ">=10.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/git-package-json": { "version": "1.4.10", "resolved": "https://registry.npmjs.org/git-package-json/-/git-package-json-1.4.10.tgz", @@ -1940,13 +2573,12 @@ } }, "node_modules/got": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-5.6.0.tgz", - "integrity": "sha1-ux1+4WO3gIK7yOuDbz85UATqb78=", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", + "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", "dependencies": { "create-error-class": "^3.0.1", "duplexer2": "^0.1.4", - "is-plain-obj": "^1.0.0", "is-redirect": "^1.0.0", "is-retry-allowed": "^1.0.0", "is-stream": "^1.0.0", @@ -1957,19 +2589,18 @@ "pinkie-promise": "^2.0.0", "read-all-stream": "^3.0.0", "readable-stream": "^2.0.5", - "timed-out": "^2.0.0", - "unzip-response": "^1.0.0", + "timed-out": "^3.0.0", + "unzip-response": "^1.0.2", "url-parse-lax": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0 <7" } }, "node_modules/graceful-fs": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" }, "node_modules/growl": { "version": "1.10.5", @@ -1991,6 +2622,21 @@ "ul": "^5.0.0" } }, + "node_modules/harb": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/harb/-/harb-0.0.7.tgz", + "integrity": "sha1-2lFvQalUrF4XCTwAGFuKeJyE4Jo=", + "deprecated": "harb has been merged into xlsx", + "dependencies": { + "babyparse": "0.2.1", + "codepage": "", + "commander": "", + "ssf": "0.8.2" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -2032,6 +2678,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -2046,6 +2697,86 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, + "node_modules/html-entities": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.0.tgz", + "integrity": "sha1-QZSMr4XOgv7Tbk5qDtNxpmZDeeI=", + "engines": [ + "node >= 0.4.0" + ] + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/htmlparser2/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -2080,11 +2811,26 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, "engines": { "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2104,6 +2850,15 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, + "node_modules/install-artifact-from-github": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/install-artifact-from-github/-/install-artifact-from-github-1.2.0.tgz", + "integrity": "sha512-3OxCPcY55XlVM3kkfIpeCgmoSKnMsz2A3Dbhsq0RXpIknKQmrX1YiznCeW9cD2ItFmDxziA3w6Eg8d80AoL3oA==", + "bin": { + "install-from-cache": "bin/install-from-cache.js", + "save-to-github-cache": "bin/save-to-github-cache.js" + } + }, "node_modules/internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -2118,6 +2873,19 @@ "node": ">= 0.4" } }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -2203,11 +2971,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, "engines": { "node": ">=4" } @@ -2224,6 +3002,11 @@ "node": ">=0.10.0" } }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=" + }, "node_modules/is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", @@ -2257,14 +3040,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", @@ -2340,6 +3115,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -2348,14 +3128,39 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "node_modules/iterate-object": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz", "integrity": "sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw==" }, + "node_modules/j": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/j/-/j-0.4.3.tgz", + "integrity": "sha1-bPZDVBvZ9douzGGVerF1f9ItaDU=", + "dependencies": { + "commander": "", + "concat-stream": "", + "harb": "~0.0.5", + "xlsjs": "~0.7.1", + "xlsx": "~0.7.11" + }, + "bin": { + "j": "bin/j.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/jeezy": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/jeezy/-/jeezy-1.13.1.tgz", + "integrity": "sha512-y0x3fmBoXQOlE9yEyN9JU4Ed1sQAK9a2ce1DybyqUvn77eEGgHqo+HrelAIQy4tNjrrK1woGPeQznM1o4Nyj0w==", + "engines": { + "node": ">=4.2.4" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2374,6 +3179,14 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jschardet": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.4.1.tgz", + "integrity": "sha1-Xg+JZt2+iX9tKH4hlr/gzzoAkOw=", + "engines": { + "node": "*" + } + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -2503,8 +3316,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.clonedeep": { "version": "4.5.0", @@ -2548,6 +3360,18 @@ "loose-envify": "cli.js" } }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -2560,7 +3384,6 @@ "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" }, @@ -2568,6 +3391,173 @@ "node": ">=10" } }, + "node_modules/make-fetch-happen": { + "version": "8.0.14", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz", + "integrity": "sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ==", + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.0.5", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/marked": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz", + "integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==", + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2590,6 +3580,17 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.0.tgz", + "integrity": "sha512-0Qz9uF1ATtl8RKJG4VRfOymh7PyEor6NbrI/61lRfuRe4vx9SNATrvAeTj2EWVRKjEQGskrzWkJBBY5NbaVHIA==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -2606,6 +3607,100 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.3.tgz", + "integrity": "sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ==", + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mocha": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", @@ -2653,8 +3748,12 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" }, "node_modules/nanoid": { "version": "3.1.20", @@ -2662,18 +3761,85 @@ "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", "dev": true, "bin": { - "nanoid": "bin/nanoid.cjs" + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/natural/-/natural-0.5.6.tgz", + "integrity": "sha1-8hUrYfNr78b+Dta8gR+0mebp3M0=", + "dependencies": { + "apparatus": ">= 0.0.9", + "sylvester": ">= 0.0.12", + "underscore": ">=1.3.1" + }, + "engines": { + "node": ">=0.4.10" + }, + "optionalDependencies": { + "webworker-threads": ">=0.6.2" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/node-gyp": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.1.0.tgz", + "integrity": "sha512-o2elh1qt7YUp3lkMwY3/l4KF3j/A3fI/Qt4NH+CQQgPJdqGE9y7qnP84cjIWN27Q0jJkrSAhCVDg+wBVNBYdBg==", + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^8.0.14", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.0", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=10" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, "node_modules/node-status-codes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", @@ -2687,6 +3853,20 @@ "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.9.tgz", "integrity": "sha512-DB3Hwyd89dPr5HqEPg3YHjzvwh/mCqizC1zZ8vyofqc+TQRyPDnT4wgXXbLGF4z9YAzwwTLi8pNLhGqcbSjgkA==" }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -2707,6 +3887,44 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-url": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-5.3.1.tgz", + "integrity": "sha512-K1c7+vaAP+Yh5bOGmA10PGPpp+6h7WZrl7GwqKhUflBc9flU9pzG27DDeB9+iuhZkE3BJZOcgN1P/2sS5pqrWw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/oargv": { "version": "3.4.10", "resolved": "https://registry.npmjs.org/oargv/-/oargv-3.4.10.tgz", @@ -2889,6 +4107,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", @@ -2968,6 +4200,14 @@ "protocols": "^1.4.0" } }, + "node_modules/parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3017,6 +4257,27 @@ "node": "*" } }, + "node_modules/pdf-text-extract": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pdf-text-extract/-/pdf-text-extract-1.3.1.tgz", + "integrity": "sha1-pbIyrZhQlJ13xDXl9E/g0QVDWEA=", + "dependencies": { + "yargs": "^1.2.5" + }, + "bin": { + "pdf-text-extract": "bin/pdf-text-extract.js" + } + }, + "node_modules/pdf-text-extract/node_modules/yargs": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.3.3.tgz", + "integrity": "sha1-BU3oth8i7v23IHBZ6u+da4P7kxo=" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, "node_modules/picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -3214,6 +4475,17 @@ "node": ">=0.10.0" } }, + "node_modules/printj": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.2.2.tgz", + "integrity": "sha512-dx9nIry0Z12s5oebhenDCFQjj/IMVotLMbvFP6OJ+C3v+EV30mtYoj6QtaulFo+DbWCbpEeaqcLYMh6CRuVjsA==", + "bin": { + "printj": "bin/printj.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -3228,6 +4500,23 @@ "node": ">=0.4.0" } }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prop-types": { "version": "15.7.2", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", @@ -3338,6 +4627,17 @@ "node": ">=0.10.0" } }, + "node_modules/re2": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/re2/-/re2-1.16.0.tgz", + "integrity": "sha512-eizTZL2ZO0ZseLqfD4t3Qd0M3b3Nr0MBWpX81EbPMIud/1d/CSfUIx2GQK8fWiAeHoSekO5EOeFib2udTZLwYw==", + "hasInstallScript": true, + "dependencies": { + "install-artifact-from-github": "^1.2.0", + "nan": "^2.14.2", + "node-gyp": "^8.0.0" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -3479,6 +4779,18 @@ "node": ">=8.10.0" } }, + "node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", @@ -3527,6 +4839,17 @@ "node": ">=0.10.0" } }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3566,6 +4889,14 @@ "node": ">=4" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -3615,6 +4946,17 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "optional": true + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "node_modules/selenium-webdriver": { "version": "4.0.0-beta.3", "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-beta.3.tgz", @@ -3671,6 +5013,11 @@ "randombytes": "^2.1.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, "node_modules/set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", @@ -3714,6 +5061,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -3754,6 +5106,41 @@ "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" }, + "node_modules/smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", + "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==", + "dependencies": { + "ip": "^1.1.5", + "smart-buffer": "^4.1.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -3788,6 +5175,33 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "node_modules/ssf": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.8.2.tgz", + "integrity": "sha1-udTcahwbz3b4q/qW19dlb7Kr7NY=", + "dependencies": { + "colors": "0.6.2", + "frac": "0.3.1", + "voc": "" + }, + "bin": { + "ssf": "bin/ssf.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3800,7 +5214,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -3858,7 +5271,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "dependencies": { "ansi-regex": "^3.0.0" }, @@ -3875,6 +5287,20 @@ "node": ">=4" } }, + "node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3902,6 +5328,14 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/sylvester": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/sylvester/-/sylvester-0.0.21.tgz", + "integrity": "sha1-KYexzivS84sNzio0OIiEv6RADqc=", + "engines": { + "node": ">=0.2.6" + } + }, "node_modules/table": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", @@ -3985,20 +5419,71 @@ "node": ">=8" } }, + "node_modules/tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "node_modules/textract": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/textract/-/textract-2.5.0.tgz", + "integrity": "sha512-sSic0+fZMx9jxfqQVpGlHPzxv/3VTp95o7r/reMNMXq8DWqimDLqO+NvoZVihHYyOBHbF22NlUx+6ZveFzNHiA==", + "dependencies": { + "cheerio": "1.0.0-rc.2", + "epub2": "1.3.4", + "got": "5.7.1", + "html-entities": "1.2.0", + "iconv-lite": "0.4.15", + "j": "0.4.3", + "jschardet": "1.4.1", + "marked": "0.6.2", + "meow": "3.7.0", + "mime": "2.2.0", + "pdf-text-extract": "1.3.1", + "xmldom": "0.1.27", + "xpath": "0.0.23", + "yauzl": "2.7.0" + }, + "bin": { + "textract": "bin/textract" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/timed-out": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", - "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", + "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", "engines": { "node": ">=0.10.0" } }, + "node_modules/tlds": { + "version": "1.221.1", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.221.1.tgz", + "integrity": "sha512-N1Afn/SLeOQRpxMwHBuNFJ3GvGrdtY4XPXKPFcx8he0U9Jg9ZkvTKE1k3jQDtCmlFn44UxjVtouF6PT4rEGd3Q==", + "bin": { + "tlds": "bin.js" + } + }, "node_modules/tmp": { "version": "0.0.28", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", @@ -4022,6 +5507,24 @@ "node": ">=8.0" } }, + "node_modules/tokenize-file": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/tokenize-file/-/tokenize-file-0.1.7.tgz", + "integrity": "sha512-e20mbirMlKvZ2/8/tOUAWOWRwHF9pUD8ebeXgKMme4BqC1V8p3Eq7RQrDeHKtuAPhDj1vder/hom+imDvB5Emw==", + "dependencies": { + "jeezy": "^1.12.13", + "natural": "^0.5.6", + "textract": "^2.2.0" + } + }, + "node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/tsconfig-paths": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", @@ -4088,6 +5591,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, "node_modules/typescript": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", @@ -4134,6 +5642,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, "node_modules/unzip-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", @@ -4162,6 +5691,19 @@ "node": ">=0.10.0" } }, + "node_modules/url-regex-safe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/url-regex-safe/-/url-regex-safe-1.0.2.tgz", + "integrity": "sha512-t1doIKbYDBRyqXZz7A98AXH/zimKmYapxFjBZwcz3BmqjB921rUPEUokAaShKyenaX3McOM8FbkWLvFvX3Jsyw==", + "dependencies": { + "ip-regex": "^4.1.0", + "re2": "^1.15.4", + "tlds": "^1.209.0" + }, + "engines": { + "node": ">= 10.12.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -4182,11 +5724,35 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/voc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/voc/-/voc-1.2.0.tgz", + "integrity": "sha512-BOuDjFFYvJdZO6e/N65AlaDItXo2TgyLjeyRYcqgAPkXpp5yTJcvkL2n+syO1r9Qc5g96tfBD2tuiMhYDmaGcA==", + "bin": { + "voc": "voc.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/webworker-threads": { + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/webworker-threads/-/webworker-threads-0.7.17.tgz", + "integrity": "sha512-Y2w2aXBbDLk9IzTEb9u+MsODC3s4YlGI7g4h0t+1OAwIO8yBI9rQL35ZYlyayiCuWu1dZMH/P7kGU8OwW7YsyA==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "bindings": "^1.3.0", + "nan": "^2.11.0" + }, + "engines": { + "node": ">= 0.10.16" + } + }, "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" }, @@ -4217,7 +5783,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, "dependencies": { "string-width": "^1.0.2 || 2" } @@ -4323,6 +5888,111 @@ } } }, + "node_modules/xlsjs": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/xlsjs/-/xlsjs-0.7.6.tgz", + "integrity": "sha1-2IdUVpqrz47qcMwjlhtGJjSklWU=", + "deprecated": "xlsjs has been merged into xlsx", + "dependencies": { + "cfb": "~0.11.0", + "codepage": "", + "commander": "", + "exit-on-epipe": "", + "ssf": "~0.8.1" + }, + "bin": { + "xls": "bin/xls.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xlsx": { + "version": "0.7.12", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.7.12.tgz", + "integrity": "sha1-cUSDHY7NScBiFB98SJddGkAJiOQ=", + "dependencies": { + "adler-32": "", + "cfb": ">=0.10.0", + "codepage": "~1.3.6", + "commander": "", + "crc-32": "", + "jszip": "2.4.0", + "ssf": "~0.8.1" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xlsx/node_modules/codepage": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.3.8.tgz", + "integrity": "sha1-Ty5dfAl13ij4hJgFjcta/KtqX3E=", + "dependencies": { + "commander": "", + "concat-stream": "", + "voc": "" + }, + "bin": { + "codepage": "bin/codepage.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xlsx/node_modules/jszip": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.4.0.tgz", + "integrity": "sha1-SHqTt2w7/6bLCFzWHrk06r4tKU8=", + "dependencies": { + "pako": "~0.2.5" + } + }, + "node_modules/xlsx/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0", + "engines": { + "node": ">=0.1" + } + }, + "node_modules/xpath": { + "version": "0.0.23", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.23.tgz", + "integrity": "sha1-9ej9xr3H5yiFsyNPQMuiZpWAqvo=", + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -4335,8 +6005,7 @@ "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 + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yargs": { "version": "16.2.0", @@ -4433,6 +6102,15 @@ "node": ">=8" } }, + "node_modules/yauzl": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.7.0.tgz", + "integrity": "sha1-4h2EeGi0lvwp6uwj7of90z6bK84=", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.0.1" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -4595,6 +6273,30 @@ "fastq": "^1.6.0" } }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, "@types/json-schema": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", @@ -4607,6 +6309,11 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "@types/node": { + "version": "15.12.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz", + "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==" + }, "@typescript-eslint/eslint-plugin": { "version": "4.27.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.27.0.tgz", @@ -4718,6 +6425,11 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "abs": { "version": "1.3.14", "resolved": "https://registry.npmjs.org/abs/-/abs-1.3.14.tgz", @@ -4739,6 +6451,53 @@ "dev": true, "requires": {} }, + "adler-32": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.0.tgz", + "integrity": "sha512-f5nltvjl+PRUh6YNfUstRaXwJxtfnKEWhAWWlmKvh+Y3J2+98a0KKVYDEhz6NdKGqswLhjNGznxfSsZGOvOd9g==", + "requires": { + "printj": "~1.2.2" + } + }, + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.4.tgz", + "integrity": "sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ==", + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "dependencies": { + "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==" + } + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -4760,8 +6519,7 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "ansi-styles": { "version": "4.3.0", @@ -4782,12 +6540,39 @@ "picomatch": "^2.0.4" } }, + "apparatus": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/apparatus/-/apparatus-0.0.10.tgz", + "integrity": "sha512-KLy/ugo33KZA7nugtQ7O0E1c8kQ52N3IvD/XgIh4w/Nr28ypfkwDfA67F1ev4N1m5D+BOk1+b2dEJDfpj/VvZg==", + "requires": { + "sylvester": ">= 0.0.8" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, "array-includes": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", @@ -4847,6 +6632,11 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, + "babyparse": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/babyparse/-/babyparse-0.2.1.tgz", + "integrity": "sha1-Bp8DXfP9zm86RV3V2vx1F43PN2A=" + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4858,6 +6648,25 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4882,6 +6691,50 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "cacache": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", + "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -4904,11 +6757,35 @@ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + } + } + }, "capture-stack-trace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" }, + "cfb": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-0.11.1.tgz", + "integrity": "sha1-qW248nKmw/uZ27sj70EiP0i+Hqc=", + "requires": { + "commander": "" + } + }, "chai": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", @@ -4950,6 +6827,19 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + } + }, "chokidar": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", @@ -4966,6 +6856,16 @@ "readdirp": "~3.5.0" } }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -5011,6 +6911,27 @@ } } }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "codepage": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz", + "integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=", + "requires": { + "commander": "~2.14.1", + "exit-on-epipe": "~1.0.1" + }, + "dependencies": { + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" + } + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -5026,22 +6947,76 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=" + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "confusing-browser-globals": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", "dev": true }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + }, + "dependencies": { + "printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" + } + } + }, "create-error-class": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", @@ -5061,11 +7036,34 @@ "which": "^2.0.1" } }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, "requires": { "ms": "2.1.2" }, @@ -5073,8 +7071,7 @@ "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 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -5121,6 +7118,16 @@ "object-keys": "^1.0.12" } }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -5145,6 +7152,37 @@ "esutils": "^2.0.2" } }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, "dotenv": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", @@ -5164,6 +7202,26 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -5173,6 +7231,26 @@ "ansi-colors": "^4.1.1" } }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + }, + "epub2": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/epub2/-/epub2-1.3.4.tgz", + "integrity": "sha512-KSkxyVaIDZfez+epxNVr9ALql4TxAuyJeweBFJ/bQ8J+bLALb5qZdfe16T7ZbyuC1GXlyUMVDkSUP7SB95pc/A==", + "requires": { + "adm-zip": "^0.4.4", + "bluebird": "^3.5.1", + "xml2js": "^0.4.4" + } + }, "err": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/err/-/err-1.1.1.tgz", @@ -5181,6 +7259,11 @@ "typpy": "^2.2.0" } }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -5649,6 +7732,11 @@ "typpy": "^2.1.0" } }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5690,6 +7778,14 @@ "reusify": "^1.0.4" } }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "requires": { + "pend": "~1.2.0" + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -5699,6 +7795,12 @@ "flat-cache": "^3.0.4" } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -5751,6 +7853,19 @@ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, + "frac": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/frac/-/frac-0.3.1.tgz", + "integrity": "sha1-V3Z3t/3L5vr3xGHxgB00E3zaQ1Q=" + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -5782,6 +7897,54 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5805,6 +7968,20 @@ "has-symbols": "^1.0.1" } }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-urls": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/get-urls/-/get-urls-10.0.0.tgz", + "integrity": "sha512-ssCMAvuD5A8PzcYCdeyodjbf1v8XF2lMuhSCQbgsvCC7Uha0S8xGwBG/5/afMWsdBR7jOry/kd8Iq5P1ML5tww==", + "requires": { + "normalize-url": "^5.1.0", + "url-regex-safe": "^1.0.2" + } + }, "git-package-json": { "version": "1.4.10", "resolved": "https://registry.npmjs.org/git-package-json/-/git-package-json-1.4.10.tgz", @@ -5900,13 +8077,12 @@ } }, "got": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-5.6.0.tgz", - "integrity": "sha1-ux1+4WO3gIK7yOuDbz85UATqb78=", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", + "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", "requires": { "create-error-class": "^3.0.1", "duplexer2": "^0.1.4", - "is-plain-obj": "^1.0.0", "is-redirect": "^1.0.0", "is-retry-allowed": "^1.0.0", "is-stream": "^1.0.0", @@ -5917,16 +8093,15 @@ "pinkie-promise": "^2.0.0", "read-all-stream": "^3.0.0", "readable-stream": "^2.0.5", - "timed-out": "^2.0.0", - "unzip-response": "^1.0.0", + "timed-out": "^3.0.0", + "unzip-response": "^1.0.2", "url-parse-lax": "^1.0.0" } }, "graceful-fs": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" }, "growl": { "version": "1.10.5", @@ -5945,6 +8120,17 @@ "ul": "^5.0.0" } }, + "harb": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/harb/-/harb-0.0.7.tgz", + "integrity": "sha1-2lFvQalUrF4XCTwAGFuKeJyE4Jo=", + "requires": { + "babyparse": "0.2.1", + "codepage": "", + "commander": "", + "ssf": "0.8.2" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -5971,6 +8157,11 @@ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -5982,6 +8173,73 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, + "html-entities": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.0.tgz", + "integrity": "sha1-QZSMr4XOgv7Tbk5qDtNxpmZDeeI=" + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -6006,8 +8264,20 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "inflight": { "version": "1.0.6", @@ -6028,6 +8298,11 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, + "install-artifact-from-github": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/install-artifact-from-github/-/install-artifact-from-github-1.2.0.tgz", + "integrity": "sha512-3OxCPcY55XlVM3kkfIpeCgmoSKnMsz2A3Dbhsq0RXpIknKQmrX1YiznCeW9cD2ItFmDxziA3w6Eg8d80AoL3oA==" + }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -6039,6 +8314,16 @@ "side-channel": "^1.0.4" } }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==" + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -6094,11 +8379,15 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-glob": { "version": "4.0.1", @@ -6109,6 +8398,11 @@ "is-extglob": "^2.1.1" } }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=" + }, "is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", @@ -6127,11 +8421,6 @@ "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", "dev": true }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", @@ -6180,6 +8469,11 @@ "has-symbols": "^1.0.2" } }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -6188,14 +8482,30 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "iterate-object": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz", "integrity": "sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw==" }, + "j": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/j/-/j-0.4.3.tgz", + "integrity": "sha1-bPZDVBvZ9douzGGVerF1f9ItaDU=", + "requires": { + "commander": "", + "concat-stream": "", + "harb": "~0.0.5", + "xlsjs": "~0.7.1", + "xlsx": "~0.7.11" + } + }, + "jeezy": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/jeezy/-/jeezy-1.13.1.tgz", + "integrity": "sha512-y0x3fmBoXQOlE9yEyN9JU4Ed1sQAK9a2ce1DybyqUvn77eEGgHqo+HrelAIQy4tNjrrK1woGPeQznM1o4Nyj0w==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6211,6 +8521,11 @@ "argparse": "^2.0.1" } }, + "jschardet": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.4.1.tgz", + "integrity": "sha1-Xg+JZt2+iX9tKH4hlr/gzzoAkOw=" + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -6321,8 +8636,7 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash.clonedeep": { "version": "4.5.0", @@ -6360,6 +8674,15 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -6369,11 +8692,137 @@ "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" } }, + "make-fetch-happen": { + "version": "8.0.14", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz", + "integrity": "sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ==", + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.0.5", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "marked": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz", + "integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==" + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -6390,6 +8839,11 @@ "picomatch": "^2.2.3" } }, + "mime": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.0.tgz", + "integrity": "sha512-0Qz9uF1ATtl8RKJG4VRfOymh7PyEor6NbrI/61lRfuRe4vx9SNATrvAeTj2EWVRKjEQGskrzWkJBBY5NbaVHIA==" + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -6403,6 +8857,71 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.3.tgz", + "integrity": "sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ==", + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, "mocha": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", @@ -6439,8 +8958,12 @@ "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" }, "nanoid": { "version": "3.1.20", @@ -6448,12 +8971,58 @@ "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", "dev": true }, + "natural": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/natural/-/natural-0.5.6.tgz", + "integrity": "sha1-8hUrYfNr78b+Dta8gR+0mebp3M0=", + "requires": { + "apparatus": ">= 0.0.9", + "sylvester": ">= 0.0.12", + "underscore": ">=1.3.1", + "webworker-threads": ">=0.6.2" + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "node-gyp": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.1.0.tgz", + "integrity": "sha512-o2elh1qt7YUp3lkMwY3/l4KF3j/A3fI/Qt4NH+CQQgPJdqGE9y7qnP84cjIWN27Q0jJkrSAhCVDg+wBVNBYdBg==", + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^8.0.14", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.0", + "which": "^2.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "node-status-codes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", @@ -6464,6 +9033,14 @@ "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.9.tgz", "integrity": "sha512-DB3Hwyd89dPr5HqEPg3YHjzvwh/mCqizC1zZ8vyofqc+TQRyPDnT4wgXXbLGF4z9YAzwwTLi8pNLhGqcbSjgkA==" }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -6481,6 +9058,35 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "normalize-url": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-5.3.1.tgz", + "integrity": "sha512-K1c7+vaAP+Yh5bOGmA10PGPpp+6h7WZrl7GwqKhUflBc9flU9pzG27DDeB9+iuhZkE3BJZOcgN1P/2sS5pqrWw==" + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, "oargv": { "version": "3.4.10", "resolved": "https://registry.npmjs.org/oargv/-/oargv-3.4.10.tgz", @@ -6615,6 +9221,14 @@ "p-limit": "^3.0.2" } }, + "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==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", @@ -6681,6 +9295,14 @@ "protocols": "^1.4.0" } }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "requires": { + "@types/node": "*" + } + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6715,6 +9337,26 @@ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, + "pdf-text-extract": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pdf-text-extract/-/pdf-text-extract-1.3.1.tgz", + "integrity": "sha1-pbIyrZhQlJ13xDXl9E/g0QVDWEA=", + "requires": { + "yargs": "^1.2.5" + }, + "dependencies": { + "yargs": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.3.3.tgz", + "integrity": "sha1-BU3oth8i7v23IHBZ6u+da4P7kxo=" + } + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -6859,6 +9501,11 @@ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, + "printj": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.2.2.tgz", + "integrity": "sha512-dx9nIry0Z12s5oebhenDCFQjj/IMVotLMbvFP6OJ+C3v+EV30mtYoj6QtaulFo+DbWCbpEeaqcLYMh6CRuVjsA==" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -6870,6 +9517,20 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, "prop-types": { "version": "15.7.2", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", @@ -6955,6 +9616,16 @@ } } }, + "re2": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/re2/-/re2-1.16.0.tgz", + "integrity": "sha512-eizTZL2ZO0ZseLqfD4t3Qd0M3b3Nr0MBWpX81EbPMIud/1d/CSfUIx2GQK8fWiAeHoSekO5EOeFib2udTZLwYw==", + "requires": { + "install-artifact-from-github": "^1.2.0", + "nan": "^2.14.2", + "node-gyp": "^8.0.0" + } + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -7070,6 +9741,15 @@ "picomatch": "^2.2.1" } }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, "regexp.prototype.flags": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", @@ -7103,6 +9783,14 @@ "rc": "^1.0.1" } }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -7130,6 +9818,11 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -7158,6 +9851,17 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "optional": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "selenium-webdriver": { "version": "4.0.0-beta.3", "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-beta.3.tgz", @@ -7203,6 +9907,11 @@ "randombytes": "^2.1.0" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, "set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", @@ -7234,6 +9943,11 @@ "object-inspect": "^1.9.0" } }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -7264,6 +9978,30 @@ "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" + }, + "socks": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", + "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==", + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "requires": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + } + }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -7298,6 +10036,24 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "ssf": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.8.2.tgz", + "integrity": "sha1-udTcahwbz3b4q/qW19dlb7Kr7NY=", + "requires": { + "colors": "0.6.2", + "frac": "0.3.1", + "voc": "" + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "requires": { + "minipass": "^3.1.1" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -7310,7 +10066,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -7356,7 +10111,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -7367,6 +10121,14 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -7382,6 +10144,11 @@ "has-flag": "^4.0.0" } }, + "sylvester": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/sylvester/-/sylvester-0.0.21.tgz", + "integrity": "sha1-KYexzivS84sNzio0OIiEv6RADqc=" + }, "table": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", @@ -7448,16 +10215,55 @@ } } }, + "tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "textract": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/textract/-/textract-2.5.0.tgz", + "integrity": "sha512-sSic0+fZMx9jxfqQVpGlHPzxv/3VTp95o7r/reMNMXq8DWqimDLqO+NvoZVihHYyOBHbF22NlUx+6ZveFzNHiA==", + "requires": { + "cheerio": "1.0.0-rc.2", + "epub2": "1.3.4", + "got": "5.7.1", + "html-entities": "1.2.0", + "iconv-lite": "0.4.15", + "j": "0.4.3", + "jschardet": "1.4.1", + "marked": "0.6.2", + "meow": "3.7.0", + "mime": "2.2.0", + "pdf-text-extract": "1.3.1", + "xmldom": "0.1.27", + "xpath": "0.0.23", + "yauzl": "2.7.0" + } + }, "timed-out": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", - "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", + "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=" + }, + "tlds": { + "version": "1.221.1", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.221.1.tgz", + "integrity": "sha512-N1Afn/SLeOQRpxMwHBuNFJ3GvGrdtY4XPXKPFcx8he0U9Jg9ZkvTKE1k3jQDtCmlFn44UxjVtouF6PT4rEGd3Q==" }, "tmp": { "version": "0.0.28", @@ -7476,6 +10282,21 @@ "is-number": "^7.0.0" } }, + "tokenize-file": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/tokenize-file/-/tokenize-file-0.1.7.tgz", + "integrity": "sha512-e20mbirMlKvZ2/8/tOUAWOWRwHF9pUD8ebeXgKMme4BqC1V8p3Eq7RQrDeHKtuAPhDj1vder/hom+imDvB5Emw==", + "requires": { + "jeezy": "^1.12.13", + "natural": "^0.5.6", + "textract": "^2.2.0" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, "tsconfig-paths": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", @@ -7524,6 +10345,11 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, "typescript": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", @@ -7560,6 +10386,27 @@ "which-boxed-primitive": "^1.0.2" } }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, "unzip-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", @@ -7582,6 +10429,16 @@ "prepend-http": "^1.0.1" } }, + "url-regex-safe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/url-regex-safe/-/url-regex-safe-1.0.2.tgz", + "integrity": "sha512-t1doIKbYDBRyqXZz7A98AXH/zimKmYapxFjBZwcz3BmqjB921rUPEUokAaShKyenaX3McOM8FbkWLvFvX3Jsyw==", + "requires": { + "ip-regex": "^4.1.0", + "re2": "^1.15.4", + "tlds": "^1.209.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -7602,11 +10459,25 @@ "spdx-expression-parse": "^3.0.0" } }, + "voc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/voc/-/voc-1.2.0.tgz", + "integrity": "sha512-BOuDjFFYvJdZO6e/N65AlaDItXo2TgyLjeyRYcqgAPkXpp5yTJcvkL2n+syO1r9Qc5g96tfBD2tuiMhYDmaGcA==" + }, + "webworker-threads": { + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/webworker-threads/-/webworker-threads-0.7.17.tgz", + "integrity": "sha512-Y2w2aXBbDLk9IzTEb9u+MsODC3s4YlGI7g4h0t+1OAwIO8yBI9rQL35ZYlyayiCuWu1dZMH/P7kGU8OwW7YsyA==", + "optional": true, + "requires": { + "bindings": "^1.3.0", + "nan": "^2.11.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" } @@ -7628,7 +10499,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, "requires": { "string-width": "^1.0.2 || 2" } @@ -7701,6 +10571,81 @@ "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", "requires": {} }, + "xlsjs": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/xlsjs/-/xlsjs-0.7.6.tgz", + "integrity": "sha1-2IdUVpqrz47qcMwjlhtGJjSklWU=", + "requires": { + "cfb": "~0.11.0", + "codepage": "", + "commander": "", + "exit-on-epipe": "", + "ssf": "~0.8.1" + } + }, + "xlsx": { + "version": "0.7.12", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.7.12.tgz", + "integrity": "sha1-cUSDHY7NScBiFB98SJddGkAJiOQ=", + "requires": { + "adler-32": "", + "cfb": ">=0.10.0", + "codepage": "~1.3.6", + "commander": "", + "crc-32": "", + "jszip": "2.4.0", + "ssf": "~0.8.1" + }, + "dependencies": { + "codepage": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.3.8.tgz", + "integrity": "sha1-Ty5dfAl13ij4hJgFjcta/KtqX3E=", + "requires": { + "commander": "", + "concat-stream": "", + "voc": "" + } + }, + "jszip": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.4.0.tgz", + "integrity": "sha1-SHqTt2w7/6bLCFzWHrk06r4tKU8=", + "requires": { + "pako": "~0.2.5" + } + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + } + } + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" + }, + "xpath": { + "version": "0.0.23", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.23.tgz", + "integrity": "sha1-9ej9xr3H5yiFsyNPQMuiZpWAqvo=" + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -7710,8 +10655,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { "version": "16.2.0", @@ -7788,6 +10732,15 @@ } } }, + "yauzl": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.7.0.tgz", + "integrity": "sha1-4h2EeGi0lvwp6uwj7of90z6bK84=", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.0.1" + } + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/test/package.json b/test/package.json index d8b855a377..1987e4709e 100644 --- a/test/package.json +++ b/test/package.json @@ -10,11 +10,14 @@ "license": "MIT", "keywords": [], "dependencies": { -<<<<<<< HEAD "dotenv": "^10.0.0", + "get-urls": "^10.0.0", + "normalize-url": "^5.3.1", "package.json": "^2.0.1", "randomstring": "^1.2.1", - "selenium-webdriver": "4.0.0-beta.3" + "selenium-webdriver": "4.0.0-beta.3", + "tokenize-file": "^0.1.7", + "url-regex-safe": "^1.0.2" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^4.27.0", @@ -25,12 +28,6 @@ "eslint-config-google": "^0.14.0", "eslint-plugin-import": "^2.23.4", "eslint-plugin-react": "^7.24.0", -======= - "selenium-webdriver": "4.0.0-beta.3" - }, - "devDependencies": { - "chai": "4.3.4", ->>>>>>> 13a04954aa1b9c5082241f53ea2dcc00d45c4294 "mocha": "8.4.0" } } From 5505f56f6c3118ed599e8bc54e678b617140a629 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Thu, 24 Jun 2021 17:54:38 +0800 Subject: [PATCH 016/222] Updated --- test/.env | 13 -- test/.gitignore | 2 + test/Onboarding/ResendVerificationEmail.js | 97 ++++++------ test/Onboarding/ResetPassword.js | 166 +++++++++++---------- test/Onboarding/SignUp.js | 27 +--- test/Onboarding/newUser.js | 114 ++++++++++++++ test/Onboarding/scraper.js | 6 +- test/gmailLogin.js | 50 +++++++ test/package-lock.json | 53 +++++++ test/package.json | 1 + test/scratch/NewUser | 1 + 11 files changed, 367 insertions(+), 163 deletions(-) create mode 100644 test/Onboarding/newUser.js create mode 100644 test/scratch/NewUser diff --git a/test/.env b/test/.env index 5b1b590b32..e69de29bb2 100644 --- a/test/.env +++ b/test/.env @@ -1,13 +0,0 @@ -NODE_ENV = -USER_NAME = -ADMIN_USER = -ADMIN_PASS = -NEW_USER = -PASSWORD = -WEBSITE = -LOGIN_PAGE = -SIGN_UP_PAGE = -EMAIL_PAGE = -Email_ADMIN_USERNAME = -ALICE = -BOB = diff --git a/test/.gitignore b/test/.gitignore index 8613e5055d..1a370ce688 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -1,2 +1,4 @@ .env.example txt.txt +.env + diff --git a/test/Onboarding/ResendVerificationEmail.js b/test/Onboarding/ResendVerificationEmail.js index d391f9ed02..01b2a8997a 100644 --- a/test/Onboarding/ResendVerificationEmail.js +++ b/test/Onboarding/ResendVerificationEmail.js @@ -1,15 +1,21 @@ //testing the login function of Hollaex Kit //Using Selenium webderiver and Mocha/Chai //given, when and then -const { Builder, By, Key, until } = require('selenium-webdriver'); +const scrap = require('./scraper'); +const defNewUser = require('./newUser'); +const { Builder, By, until } = require('selenium-webdriver'); +const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); +var randomstring = require('randomstring'); const dotenv = require('dotenv'); dotenv.config(); -let userName = process.env.USER_NAME; + +let userName = defNewUser.getNewUser(); +//let userName = process.env.USER_NAME; let passWord = process.env.PASSWORD; let webSite = process.env.WEBSITE; - +let emailAdmin =process.env.Email_ADMIN_USERNAME; if (process.env.NODE_ENV == 'test') { console.log('Variables are defined'); } @@ -63,53 +69,52 @@ describe('NewUserRequest', function() { console.log('assertText | css=.icon_title-text | Resent Email'); expect(await driver.findElement(By.css('.icon_title-text')).getText()).to.equal('Resent Email'); - console.log('Test name: New User Email Confirmation'); + }); + it('Email Confirmation', async function() { + console.log('Test name: Confirmation'); console.log('Step # | name | target | value'); - console.log('1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |'); - await driver.get('https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin'); - - console.log('2 | setWindowSize | 1050x660 | '); - await driver.manage().window().setRect(1050, 660); - - console.log('3 | type&Enter | id=identifierId | youremail@gmail.com'); - await driver.findElement(By.id('identifierId')).sendKeys(userName); - await driver.findElement(By.id('identifierId')).sendKeys(Key.ENTER); - - console.log('4 | wait | name=password | Holla!'); - await driver.wait(until.elementsLocated(By.name('password'),30000,'wait', 5000)); - console.log('sleep well for 10'); - await sleep(5000); - - console.log('5 | type&Enter | id=password| your password!'); - await driver.findElement(By.name('password')).sendKeys(passWord); - await driver.findElement(By.name('password')).sendKeys(Key.ENTER); - - console.log('sleep well for 5'); - await sleep(5000); - - console.log('6 | click | linkText=Refresh | '); - await driver.findElement(By.linkText('Refresh')).click(); - - console.log('7 | click | css=.ts | '); - await driver.findElement(By.css('.ts')).click(); - await driver.findElement(By.css('.h td')).click(); - - console.log(' 8 | assertText | css=h2 b | sandbox Sign Up'); - expect(await driver.findElement(By.css('h2 b')).getText()).to.equal('sandbox Sign Up'); - console.log(' 9 | click | css=button | '); - vars['windowHandles'] = await driver.getAllWindowHandles(); - console.log('10 | selectWindow | handle=${win9509} | '); - await driver.findElement(By.css('button')).click(); - console.log(' 11 | click | css=.icon_title-wrapper | '); - vars['win9509'] = await waitForWindow(5000); - console.log('12 | assertNotText | css=.icon_title-text | Error'); - await driver.switchTo().window(vars['win9509']); + await defNewUser.emailLogIn(driver,emailAdmin,passWord); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1)'))), 50000); + await driver.findElement(By.css('.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1)')).click(); + console.log('9 | doubleClick | css=.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1) | '); + { + const element = await driver.findElement(By.css('.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1)')); + await driver.actions({ bridge: true}).doubleClick(element).perform(); + } + console.log('10 | selectFrame | index=1 | '); + await driver.switchTo().frame(1); + await sleep(10000); + console.log('12 | storeText | xpath=/html/body/pre/a[22] | content'); + vars['content'] = await driver.findElement(By.xpath('/html/body/pre/a[22]')).getText(); + const emailCont = await driver.findElement(By.css('pre')).getText(); + console.log('13 | echo | ${content} | '); + console.log(vars['content']); + console.log('14 | assertText | xpath=/html/body/pre/a[22] | ${content}'); + expect(vars['content']).to.equal(userName.toLowerCase()); + + console.log('15 | storeAttribute | xpath=/html/body/pre/a[26]@href | mytextlink'); + { + const attribute = await driver.findElement(By.xpath('/html/body/pre/a[26]')).getAttribute('href'); + vars['mytextlink'] = attribute; + } + console.log('16 | echo | ${mytextlink} | '); + console.log(vars['mytextlink']); + console.log('17 | echo | \'xpath=/html/body/pre/a[26]\' | '); + console.log('\'xpath=/html/body/pre/a[26]\''); + console.log('18 | open | ${mytextlink} | '); + + const completedLink = await scrap.addRest(emailCont,vars['mytextlink']); + await console.log(completedLink); + await driver.get(completedLink); + console.log('19 | selectFrame | relative=parent | '); + await sleep(1000); + await driver.switchTo().defaultContent(); + console.log('20 | click | css=.icon_title-wrapper | '); await driver.findElement(By.css('.icon_title-wrapper')).click(); + console.log('21 | assertNotText | css=.icon_title-text | Error'); { const text = await driver.findElement(By.css('.icon_title-text')).getText(); - expect(text).to.not.equal('Error'); + assert(text !== 'Error'); } - - }); }); \ No newline at end of file diff --git a/test/Onboarding/ResetPassword.js b/test/Onboarding/ResetPassword.js index d5ceb26f83..370387bd19 100644 --- a/test/Onboarding/ResetPassword.js +++ b/test/Onboarding/ResetPassword.js @@ -1,15 +1,20 @@ //testing the login function of Hollaex Kit //Using Selenium webderiver and Mocha/Chai //given, when and then -const { Builder, By, Key, until } = require('selenium-webdriver'); +const scrap = require('./scraper'); +const defNewUser = require('./newUser'); +const { Builder, By, until } = require('selenium-webdriver'); const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); const dotenv = require('dotenv'); dotenv.config(); -let userName = process.env.USER_NAME; -let passWord = process.env.PASSWORD; +let userName = defNewUser.getNewUser(); +//let userName = process.env.USER_NAME; +let passWord = process.env.PASSWORD; +let webSite = process.env.WEBSITE; +let emailAdmin =process.env.Email_ADMIN_USERNAME; if (process.env.NODE_ENV == 'test') { console.log('Variables are defined'); } @@ -24,15 +29,7 @@ describe('NewUserRequest', function() { setTimeout(resolve, ms); }); } - async function waitForWindow(timeout = 2) { - await driver.sleep(timeout); - const handlesThen = vars['windowHandles']; - const handlesNow = await driver.getAllWindowHandles(); - if (handlesNow.length > handlesThen.length) { - return handlesNow.find(handle => (!handlesThen.includes(handle))); - } - throw new Error('New window did not appear before timeout'); - } + beforeEach(async function() { driver = await new Builder().forBrowser('chrome').build(); vars = {}; @@ -40,79 +37,88 @@ describe('NewUserRequest', function() { afterEach(async function() { await driver.quit(); }); - it('Rest Password', async function() { - console.log('// Test name: Reset Password'); - console.log(' Step # | name | target | value'); - console.log(' 1 | open | https://sandbox.hollaex.com/reset-password | '); - await driver.get('https://sandbox.hollaex.com/reset-password'); - console.log(' 2 | setWindowSize | 1050x660 | '); - await driver.manage().window().setRect(1050, 660); - console.log(' 3 | click | name=email | '); - await sleep(5000); - await driver.findElement(By.name('email')).click(); - console.log(' 4 | type | name=email | bob@gmail.com'); - await driver.findElement(By.name('email')).sendKeys(userName); - console.log(' 5 | click | css=.holla-button | '); - await sleep(5000); - await driver.findElement(By.css('.holla-button')).click(); - console.log(' 6 | click | css=.icon_title-wrapper | '); - await sleep(5000); - //console.log("await driver.findElement(By.css(".icon_title-wrapper")).click()"); - console.log(' 7 | assertText | css=.icon_title-text | Password Reset Sent'); - assert(await driver.findElement(By.css('.icon_title-text')).getText() == 'Password Reset Sent'); - console.log(' 8 | click | css=.holla-button:nth-child(1) | '); - driver.close(); - await sleep(10000); - driver = await new Builder().forBrowser('chrome').build(); - await sleep(10000); - console.log('Test name: New User Email Confirmation'); + // it('Rest Password', async function() { + // console.log('// Test name: Reset Password'); + // console.log(' Step # | name | target | value'); + // console.log(' 1 | open | https://sandbox.hollaex.com/reset-password | '); + // await driver.get(webSite+'reset-password'); + // console.log(' 2 | setWindowSize | 1050x660 | '); + // await driver.manage().window().setRect(1050, 660); + // console.log(' 3 | click | name=email | '); + // await sleep(5000); + // await driver.findElement(By.name('email')).click(); + // console.log(' 4 | type | name=email | bob@gmail.com'); + // await driver.findElement(By.name('email')).sendKeys(userName); + // console.log(' 5 | click | css=.holla-button | '); + // await sleep(5000); + // await driver.findElement(By.css('.holla-button')).click(); + // console.log(' 6 | click | css=.icon_title-wrapper | '); + // await sleep(5000); + // //console.log("await driver.findElement(By.css(".icon_title-wrapper")).click()"); + // console.log(' 7 | assertText | css=.icon_title-text | Password Reset Sent'); + // assert(await driver.findElement(By.css('.icon_title-text')).getText() == 'Password Reset Sent'); + // console.log(' 8 | click | css=.holla-button:nth-child(1) | '); + // driver.close(); + // await sleep(10000); + // }); + + it('Email Confirmation', async function() { + console.log('Test name: Confirmation'); console.log('Step # | name | target | value'); - console.log('1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |'); - await driver.get('https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin'); - - console.log('2 | setWindowSize | 1050x660 | '); - await driver.manage().window().setRect(1050, 660); - - console.log('3 | type&Enter | id=identifierId | youremail@gmail.com'); - - await driver.findElement(By.id('identifierId')).sendKeys(userName); + await defNewUser.emailLogIn(driver,emailAdmin,passWord); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1)'))), 50000); + await driver.findElement(By.css('.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1)')).click(); + console.log('9 | doubleClick | css=.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1) | '); + { + const element = await driver.findElement(By.css('.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1)')); + await driver.actions({ bridge: true}).doubleClick(element).perform(); + } + console.log('10 | selectFrame | index=1 | '); + await driver.switchTo().frame(1); await sleep(10000); - await driver.findElement(By.id('identifierId')).sendKeys(Key.ENTER); - - console.log('4 | wait | name=password | Holla!'); - await driver.wait(until.elementsLocated(By.name('password'),30000,'wait', 5000)); - console.log('sleep well for 10'); - await sleep(5000); - - console.log('5 | type&Enter | id=password| your password!'); - await driver.findElement(By.name('password')).sendKeys(passWord); - await driver.findElement(By.name('password')).sendKeys(Key.ENTER); - - console.log('sleep well for 5'); - await sleep(5000); - - console.log('6 | click | linkText=Refresh | '); - await driver.findElement(By.linkText('Refresh')).click(); - - console.log('7 | click | css=.ts | '); - await driver.findElement(By.css('.ts')).click(); - await driver.findElement(By.css('.h td')).click(); - - assert(await driver.findElement(By.css('h2 b')).getText() == 'sandbox Reset Password Request'); - console.log(' 6 | click | css=.gmail_attr | '); - await driver.findElement(By.css('.gmail_attr')).click(); - console.log(' 7 | click | css=button | '); - vars['windowHandles'] = await driver.getAllWindowHandles(); - console.log(' 8 | selectWindow | handle=${win3601} | '); - await driver.findElement(By.css('button')).click(); + console.log('12 | storeText | xpath=/html/body/pre/a[16] | content'); + vars['content'] = await driver.findElement(By.xpath('/html/body/pre/a[16]')).getText(); + const emailCont = await driver.findElement(By.css('pre')).getText(); + console.log('13 | echo | ${content} | '); + console.log(vars['content']); + console.log('14 | assertText | xpath=/html/body/pre/a[16] | ${content}'); + expect(vars['content']).to.equal(userName.toLowerCase()); + + console.log('15 | storeAttribute | yourwebsite/reset-password | mytextlink'); + { + const attribute = webSite+'reset-password' + vars['mytextlink'] = attribute; + } + console.log('16 | echo | ${mytextlink} | '); + console.log(vars['mytextlink']); + console.log('link starts with'+ webSite+'reset-password'); + console.log(webSite+'reset-password'); + console.log('18 | open | ${mytextlink} | '); + + const completedLink = await scrap.addRest(emailCont,vars['mytextlink']); + await console.log(completedLink); + await driver.get(completedLink); + console.log('19 | selectFrame | relative=parent | '); + await sleep(1000); + // await driver.switchTo().defaultContent(); + // console.log('20 | click | css=.icon_title-wrapper | '); + // await driver.findElement(By.css('.icon_title-wrapper')).click(); + // console.log('21 | assertNotText | css=.icon_title-text | Error'); + // { + // const text = await driver.findElement(By.css('.icon_title-text')).getText(); + // assert(text !== 'Error'); + // } + console.log(' 9 | type | name=password | password!'); - vars['win3601'] = await waitForWindow(2000); - console.log(' 10 | type | name=password_repeat | password'); - await driver.switchTo().window(vars['win3601']); - console.log(' 11 | click | css=.holla-button | '); await driver.findElement(By.name('password')).sendKeys(passWord); + console.log(' 10 | type | name=password_repeat | password'); await driver.findElement(By.name('password_repeat')).sendKeys(passWord); + await sleep(2000); + console.log(' 11 | click | css=.holla-button | '); await driver.findElement(By.css('.holla-button')).click(); - console.log('logIN'); + await sleep(4000); + await driver.findElement(By.css(".icon_title-wrapper")).click() + console.log("12 | assertText | css=.icon_title-text | Success"); + assert(await driver.findElement(By.css(".icon_title-text")).getText() == "Success") }); }); diff --git a/test/Onboarding/SignUp.js b/test/Onboarding/SignUp.js index c5bcad930c..b6fc67acf4 100644 --- a/test/Onboarding/SignUp.js +++ b/test/Onboarding/SignUp.js @@ -3,18 +3,19 @@ //given, when and then const scrap = require('./scraper'); +const defNewUser = require('./newUser'); const { Builder, By, until } = require('selenium-webdriver'); const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); -var randomstring = require('randomstring'); const dotenv = require('dotenv'); dotenv.config(); let User = process.env.NEW_USER; let passWord = process.env.PASSWORD; let signUpPage = process.env.SIGN_UP_PAGE; let emailAdmin =process.env.Email_ADMIN_USERNAME; -const newUser = randomstring.generate(4)+'@'+User ; + +const newUser = defNewUser.defineNewUser(User,4) ; console.log(newUser); describe('NewUserRequest', function() { @@ -75,24 +76,8 @@ describe('NewUserRequest', function() { it('Email Confirmation', async function() { console.log('Test name: Confirmation'); console.log('Step # | name | target | value'); - console.log('1 | open | /auth/?client_id=4534a10755c6fd46&redirect_uri=https%3A%2F%2Fwebmail.mail.us-west-2.awsapps.com%2Fworkmail%2F | '); - await driver.get('https://sahlabadi-website.awsapps.com/auth/?client_id=4534a10755c6fd46&redirect_uri=https%3A%2F%2Fwebmail.mail.us-west-2.awsapps.com%2Fworkmail%2F'); - console.log('2 | setWindowSize | 1280x680 |'); - await driver.manage().window().setRect(1280, 680); - console.log('3 | click | id=wdc_username |'); - await sleep(10000); - await driver.findElement(By.id('wdc_username')).click(); - console.log('4 | type | id=wdc_username | QA'); - await driver.findElement(By.id('wdc_username')).sendKeys(emailAdmin); - console.log('5 | click | id=wdc_password | '); - await driver.findElement(By.id('wdc_password')).click(); - console.log('6 | type | id=wdc_password | Password!'); - await driver.findElement(By.id('wdc_password')).sendKeys(passWord); - console.log('7 | click | id=wdc_login_button | '); - await driver.findElement(By.id('wdc_login_button')).click(); - console.log('8 | click | css=.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1) | '); - await driver.manage().window().maximize(); - await sleep(10000); + await defNewUser.emailLogIn(driver,emailAdmin,passWord); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1)'))), 50000); await driver.findElement(By.css('.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1)')).click(); console.log('9 | doubleClick | css=.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1) | '); { @@ -108,7 +93,7 @@ describe('NewUserRequest', function() { console.log('13 | echo | ${content} | '); console.log(vars['content']); console.log('14 | assertText | xpath=/html/body/pre/a[22] | ${content}'); - // expect(vars['content']).to.equal(newUser.toLowerCase()); + expect(vars['content']).to.equal(newUser.toLowerCase()); console.log('15 | storeAttribute | xpath=/html/body/pre/a[26]@href | mytextlink'); { diff --git a/test/Onboarding/newUser.js b/test/Onboarding/newUser.js new file mode 100644 index 0000000000..0559cc292a --- /dev/null +++ b/test/Onboarding/newUser.js @@ -0,0 +1,114 @@ + +//testing the login function of Hollaex Kit +//Using Selenium webderiver and Mocha/Chai +//given, when and then +const { Builder, By, until } = require('selenium-webdriver'); +const { expect } = require('chai'); +const { Console } = require('console'); +const dotenv = require('dotenv'); +dotenv.config(); +const assert = require('assert'); +let logInPage = process.env.LOGIN_PAGE; +let emailPage =process.env.EMAIL_PAGE; +var randomstring = require('randomstring'); + +function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +} +function defineNewUser(User,i){ + const newUser = randomstring.generate(i)+'@'+User ; + //console.log(newUser); + + if (typeof localStorage === "undefined" || localStorage === null) { + var LocalStorage = require('node-localstorage').LocalStorage; + localStorage = new LocalStorage('./scratch'); + } + + localStorage.setItem('NewUser', newUser); + //console.log(localStorage.getItem('NewUser')); + return localStorage.getItem('NewUser'); +} +function getNewUser(){ + if (typeof localStorage === "undefined" || localStorage === null) { + var LocalStorage = require('node-localstorage').LocalStorage; + localStorage = new LocalStorage('./scratch'); + } + + return localStorage.getItem('NewUser'); +} +async function kitLogIn(driver,userName,passWord){ + + //let driver = await new Builder().forBrowser('chrome').build(); + + + //Given User's data + console.log(' Log in your hollaex Kit :',userName); + console.log(logInPage); + await driver.get(logInPage); + await driver.sleep(5000); + const title = await driver.getTitle(); + console.log(title); + expect(title).to.equal(title); + console.log('entring', logInPage); + console.log(' Step # | action | target | value'); + + console.log(' 1 | type | name=email |', userName); + await driver.wait(until.elementLocated(By.name('email')), 5000); + await driver.findElement(By.name('email')).sendKeys(userName); + + console.log(' 2 | type | name=password | PASSWORD'); + await driver.wait(until.elementLocated(By.name('password')), 5000); + await driver.findElement(By.name('password')).sendKeys(passWord); + + console.log(' 3 | click | css=.auth_wrapper | '); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.auth_wrapper'))), 5000); + await driver.findElement(By.css('.auth_wrapper')).click(); + console.log(' 4 | verifyElementPresent | css=.holla-button |'); + { + const elements = await driver.findElements(By.css('.holla-button')); + // assert(elements.length); + expect(elements.length); + } + //when login + console.log(' 5 | click | css=.holla-button | '); + await driver.findElement(By.css('.holla-button')).click(); + await sleep(5000); + //then the username should be as same as entered + console.log(' 6 | assertText | css=.app-bar-account-content > div:nth-child(2) |',userName); + await driver.wait(until.elementLocated(By.css('.app-bar-account-content > div:nth-child(2)')), 20000); + await console.log(await driver.findElement(By.css('.app-bar-account-content > div:nth-child(2)')).getText()); + expect(await driver.findElement(By.css('.app-bar-account-content > div:nth-child(2)')).getText()).to.equal(userName); + + console.log(' you suceccefully loged in ',userName); + + + +} +async function emailLogIn(driver, emailAdmin,passWord){ + + // let driver = await new Builder().forBrowser('chrome').build(); + console.log('Entering username and password'); + console.log(emailPage); + await driver.get(emailPage); + console.log('2 | setWindowSize | 1280x680 |'); + await driver.manage().window().setRect(1280, 680); + console.log('3 | click | id=wdc_username |'); + await sleep(10000); + await driver.findElement(By.id('wdc_username')).click(); + console.log('4 | type | id=wdc_username | QA'); + await driver.findElement(By.id('wdc_username')).sendKeys(emailAdmin); + console.log('5 | click | id=wdc_password | '); + await driver.findElement(By.id('wdc_password')).click(); + console.log('6 | type | id=wdc_password | Password!'); + await driver.findElement(By.id('wdc_password')).sendKeys(passWord); + console.log('7 | click | id=wdc_login_button | '); + await driver.findElement(By.id('wdc_login_button')).click(); + console.log('8 | click | css=.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1) | '); + await driver.manage().window().maximize(); + await sleep(10000); +} +module.exports = {defineNewUser,emailLogIn,kitLogIn,getNewUser}; + + diff --git a/test/Onboarding/scraper.js b/test/Onboarding/scraper.js index 8d98c6fb75..a113720b15 100644 --- a/test/Onboarding/scraper.js +++ b/test/Onboarding/scraper.js @@ -1,5 +1,5 @@ -// const fs = require("fs"); -// const fileContents = fs.readFileSync('txt.txt').toString(); +const fs = require("fs"); +const fileContents = fs.readFileSync('txt.txt').toString(); function chunkCleaner(str){ return str.replace(/(=\\r\\n|\\n|\\r|\\t)/gm,""); @@ -30,4 +30,4 @@ function addRest(str,txt){ return contains(UrlList,txt); } module.exports = {addRest}; -// addRest(fileContents,"https://sandbox.hollaex.com/verify/"); + console.log(addRest(fileContents,"https://sandbox.hollaex.com/reset-password/")); diff --git a/test/gmailLogin.js b/test/gmailLogin.js index b8b143d89e..919617d133 100644 --- a/test/gmailLogin.js +++ b/test/gmailLogin.js @@ -22,6 +22,7 @@ describe('NewUserRequest', function() { } throw new Error('New window did not appear before timeout'); } + beforeEach(async function() { driver = await new Builder().forBrowser('chrome').build(); vars = {}; @@ -122,4 +123,53 @@ describe('NewUserRequest', function() { }); + it('NewUserRequest', async function() { + driver = await new Builder().forBrowser('chrome').build(); + await sleep(10000); + console.log('Test name: New User Email Confirmation'); + console.log('Step # | name | target | value'); + console.log('1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |'); + await driver.get('https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin'); + + console.log('2 | setWindowSize | 1050x660 | '); + await driver.manage().window().setRect(1050, 660); + + console.log('3 | type&Enter | id=identifierId | youremail@gmail.com'); + + await driver.findElement(By.id('identifierId')).sendKeys(userName); + await sleep(10000); + await driver.findElement(By.id('identifierId')).sendKeys(Key.ENTER); + + console.log('4 | wait | name=password | Holla!'); + await driver.wait(until.elementsLocated(By.name('password'),30000,'wait', 5000)); + console.log('sleep well for 10'); + await sleep(5000); + + console.log('5 | type&Enter | id=password| your password!'); + await driver.findElement(By.name('password')).sendKeys(passWord); + await driver.findElement(By.name('password')).sendKeys(Key.ENTER); + + console.log('sleep well for 5'); + await sleep(5000); + + console.log('6 | click | linkText=Refresh | '); + await driver.findElement(By.linkText('Refresh')).click(); + + console.log('7 | click | css=.ts | '); + await driver.findElement(By.css('.ts')).click(); + await driver.findElement(By.css('.h td')).click(); + + assert(await driver.findElement(By.css('h2 b')).getText() == 'sandbox Reset Password Request'); + console.log(' 6 | click | css=.gmail_attr | '); + await driver.findElement(By.css('.gmail_attr')).click(); + console.log(' 7 | click | css=button | '); + vars['windowHandles'] = await driver.getAllWindowHandles(); + console.log(' 8 | selectWindow | handle=${win3601} | '); + await driver.findElement(By.css('button')).click(); + console.log(' 9 | type | name=password | password!'); + vars['win3601'] = await waitForWindow(2000); + console.log(' 10 | type | name=password_repeat | password'); + await driver.switchTo().window(vars['win3601']); + }); + }); \ No newline at end of file diff --git a/test/package-lock.json b/test/package-lock.json index 6a40e88595..e4554b0c2a 100644 --- a/test/package-lock.json +++ b/test/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "dotenv": "^10.0.0", "get-urls": "^10.0.0", + "node-localstorage": "^2.2.1", "normalize-url": "^5.3.1", "package.json": "^2.0.1", "randomstring": "^1.2.1", @@ -3840,6 +3841,17 @@ "node": ">=10" } }, + "node_modules/node-localstorage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-2.2.1.tgz", + "integrity": "sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw==", + "dependencies": { + "write-file-atomic": "^1.1.4" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/node-status-codes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", @@ -5106,6 +5118,14 @@ "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" }, + "node_modules/slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "engines": { + "node": "*" + } + }, "node_modules/smart-buffer": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", @@ -5868,6 +5888,16 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "node_modules/write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, "node_modules/ws": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", @@ -9023,6 +9053,14 @@ } } }, + "node-localstorage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-2.2.1.tgz", + "integrity": "sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw==", + "requires": { + "write-file-atomic": "^1.1.4" + } + }, "node-status-codes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", @@ -9978,6 +10016,11 @@ "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + }, "smart-buffer": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", @@ -10565,6 +10608,16 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, "ws": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", diff --git a/test/package.json b/test/package.json index 1987e4709e..393e08e271 100644 --- a/test/package.json +++ b/test/package.json @@ -12,6 +12,7 @@ "dependencies": { "dotenv": "^10.0.0", "get-urls": "^10.0.0", + "node-localstorage": "^2.2.1", "normalize-url": "^5.3.1", "package.json": "^2.0.1", "randomstring": "^1.2.1", diff --git a/test/scratch/NewUser b/test/scratch/NewUser new file mode 100644 index 0000000000..1b97932287 --- /dev/null +++ b/test/scratch/NewUser @@ -0,0 +1 @@ +K4I5@testsae.com \ No newline at end of file From bd97d62819738cdc6c9c991c10d822254c564d0c Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Thu, 24 Jun 2021 18:01:35 +0800 Subject: [PATCH 017/222] Updated --- test/Onboarding/scraper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Onboarding/scraper.js b/test/Onboarding/scraper.js index a113720b15..5ab7a65536 100644 --- a/test/Onboarding/scraper.js +++ b/test/Onboarding/scraper.js @@ -30,4 +30,4 @@ function addRest(str,txt){ return contains(UrlList,txt); } module.exports = {addRest}; - console.log(addRest(fileContents,"https://sandbox.hollaex.com/reset-password/")); + //console.log(addRest(fileContents,"https://sandbox.hollaex.com/reset-password/")); From 39672e31e34c07cbfd9adaade5ecedb98f162ae6 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Tue, 29 Jun 2021 14:15:35 +0800 Subject: [PATCH 018/222] Trade part Update --- test/Onboarding/newUser.js | 6 +- test/Onboarding/scraper.js | 8 +- test/Trade/smartTrade.js | 231 +++++++++++++++++++ test/Trade/time.js | 50 +++++ test/Trade/trade.js | 428 ++++++++++++++++++++++++++++++++++-- test/Trade/tradeWithStop.js | 327 ++++++++++++++++++++++++++- test/Wallet/log.js | 64 ++++++ test/Wallet/wallet.js | 69 +++--- test/package-lock.json | 14 ++ test/package.json | 1 + test/scratch/NewUser | 1 - test/scratch/Timestampe | 0 12 files changed, 1128 insertions(+), 71 deletions(-) create mode 100644 test/Trade/smartTrade.js create mode 100644 test/Trade/time.js create mode 100644 test/Wallet/log.js create mode 100644 test/scratch/Timestampe diff --git a/test/Onboarding/newUser.js b/test/Onboarding/newUser.js index 0559cc292a..f6ee2721f7 100644 --- a/test/Onboarding/newUser.js +++ b/test/Onboarding/newUser.js @@ -31,12 +31,12 @@ function defineNewUser(User,i){ return localStorage.getItem('NewUser'); } function getNewUser(){ - if (typeof localStorage === "undefined" || localStorage === null) { + if (typeof localStorage === "undefined" || localStorage === null) { var LocalStorage = require('node-localstorage').LocalStorage; localStorage = new LocalStorage('./scratch'); } - return localStorage.getItem('NewUser'); + return localStorage.getItem('NewUser'); } async function kitLogIn(driver,userName,passWord){ @@ -81,7 +81,7 @@ async function kitLogIn(driver,userName,passWord){ await console.log(await driver.findElement(By.css('.app-bar-account-content > div:nth-child(2)')).getText()); expect(await driver.findElement(By.css('.app-bar-account-content > div:nth-child(2)')).getText()).to.equal(userName); - console.log(' you suceccefully loged in ',userName); + console.log(' you suceccefully logged in ',userName); diff --git a/test/Onboarding/scraper.js b/test/Onboarding/scraper.js index 5ab7a65536..c8dd3ccb31 100644 --- a/test/Onboarding/scraper.js +++ b/test/Onboarding/scraper.js @@ -1,8 +1,8 @@ -const fs = require("fs"); -const fileContents = fs.readFileSync('txt.txt').toString(); +// const fs = require("fs"); +// const fileContents = fs.readFileSync('txt.txt').toString(); function chunkCleaner(str){ - return str.replace(/(=\\r\\n|\\n|\\r|\\t)/gm,""); + return str.replace(/(=\\r\\n|\\n|\\r|\\t)/gm,""); } function getURLsFromString(str) { var re = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www\.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%\/.\w-]*)?\??(?:[-+=&;%@.\w]*)#?\w*)?)/gm; @@ -30,4 +30,4 @@ function addRest(str,txt){ return contains(UrlList,txt); } module.exports = {addRest}; - //console.log(addRest(fileContents,"https://sandbox.hollaex.com/reset-password/")); +//console.log(addRest(fileContents,"https://sandbox.hollaex.com/reset-password/")); diff --git a/test/Trade/smartTrade.js b/test/Trade/smartTrade.js new file mode 100644 index 0000000000..937c2d10b8 --- /dev/null +++ b/test/Trade/smartTrade.js @@ -0,0 +1,231 @@ +// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const hollaTime = require('./time') +const defNewUser = require('./../Onboarding/newUser.js'); +const dotenv = require('dotenv'); +const { expect } = require('chai'); + +dotenv.config(); +let adminUser = process.env.ADMIN_USER; +let passWord = process.env.ADMIN_PASS; +let website = process.env.WEBSITE; +describe('smartTrade', function() { + this.timeout(300000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + defNewUser.kitLogIn(driver,adminUser,passWord); + }); + afterEach(async function() { + // await driver.quit(); + }); + it('smartTrade', async function() { + + await sleep(15000); + console.log(' Test name: smartTrade'); + console.log(' Step # | name | target | value'); + console.log(' 1 | open | /trade/xht-usdt | '); + await driver.get(website+ 'trade/xht-usdt'); + await sleep(5000); + await driver.findElement(By.css('.text-center:nth-child(1)')).click(); + console.log(' 2 | click | css=.trade-col_side_wrapper > .trade_block-wrapper:nth-child(1) | '); + await driver.findElement(By.css('.trade-col_side_wrapper > .trade_block-wrapper:nth-child(1)')).click(); + await sleep(5000); + await driver.findElement(By.name('size')).clear(); + await driver.findElement(By.name('size')).sendKeys('1'); + console.log(' 3 | storeText | css=.trade-col_side_wrapper > .trade_block-wrapper:nth-child(1) .trade_block-title-currency-xht | pair'); + vars['pair'] = await driver.findElement(By.css('.trade-col_side_wrapper > .trade_block-wrapper:nth-child(1) .trade_block-title-currency-xht')).getText(); + console.log(' 4 | setWindowSize | maximize| '); + await driver.manage().window().maximize() ; + console.log(' 5 | echo | ${pair} | '); + console.log('The Pair is: '+vars['pair']); + console.log(' 6 | click | css=.text-center:nth-child(1) | '); + await driver.findElement(By.css('.text-center:nth-child(1)')).click(); + await sleep(5000); + vars['USDT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + console.log(' 7 | storeText | css=.accordion_section:nth-child(2) .wallet_section-title-amount | HXT AMOUNT'); + vars['HXT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + console.log(' 8 | echo | ${USDT AMOUNT}, ${XHT AMOUNT} | '); + console.log('${USDT AMOUNT} : '+vars['USDT AMOUNT'], '${XHT AMOUNT} : '+vars['HXT AMOUNT']); + console.log(' 9 | storeValue | name=size | size'); + vars['size'] = await driver.findElement(By.name('size')).getAttribute('value'); + + console.log(' 10 | click | css=.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1)'); + vars['market'] = await driver.findElement(By.css('.text-center:nth-child(1)')).getText(); + console.log(' 11 | echo | ${market} | '); + console.log('Market/Limit: '+vars['market']); + console.log(' 12 | click | css=.trade_orderbook-spread-text | '); + await driver.findElement(By.css('.trade_orderbook-spread-text')).click(); + console.log(' 13| storeText | css=.trade_orderbook-spread-text | spread'); + vars['spread'] = await driver.findElement(By.css('.trade_orderbook-spread-text')).getText(); + console.log(' 14 | echo | ${spread} | '); + console.log('Spread: '+vars['spread']); + console.log(' 15 | type | name=size | 1'); + let coinSize = parseInt(vars['size'],10); + vars['Balance'] = await driver.findElement(By.css('div:nth-child(2) > .blue-link:nth-child(1)')).getText(); + let walletBalance = parseInt(vars['Balance'] ,10); + vars['EstimatedPrice'] = await driver.findElement(By.css('.d-flex:nth-child(1) > .text-price')).getText(); + let estimatedSize = parseInt(vars['EstimatedPrice'] ,10); + while (estimatedSize < walletBalance) { + coinSize = coinSize+(walletBalance*0.1); + + await driver.findElement(By.name('size')).clear(); + await driver.findElement(By.name('size')).sendKeys(String(coinSize)); + console.log('Size is: '+String(coinSize)); + await driver.findElement(By.css('.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1)')).click(); + vars['Balance'] = await driver.findElement(By.css('div:nth-child(2) > .blue-link:nth-child(1)')).getText(); + vars['EstimatedPrice'] = await driver.findElement(By.css('.d-flex:nth-child(1) > .text-price')).getText(); + estimatedSize = parseInt(vars['EstimatedPrice'] ,10); + console.log('Wallet Balance: '+vars['Balance']); + console.log('Estimated Price: '+vars['EstimatedPrice']); + { + const elements = await driver.findElements(By.css('.form-error')); + assert(!elements.length); + } + //console.log(' 21 | verifyNotText | css=.form-error | Insufficient balance'); + // { + // const text = await driver.findElement(By.css(".form-error")).getText() + // assert(text !== "Insufficient balance") + // } + } + await driver.findElement(By.css('.justify-content-end > .pointer')).click(); + await driver.findElement(By.css('.text-center:nth-child(1)')).click() + // 4 | click | css=div:nth-child(2) > .blue-link:nth-child(1) | + await driver.findElement(By.css('div:nth-child(2) > .blue-link:nth-child(1)')).click() + // 5 | click | css=.trade-col_action_wrapper | + await driver.findElement(By.css('.trade-col_action_wrapper')).click() + // 6 | storeText | css=.d-flex:nth-child(1) > .text-price | BalanceEstimated + vars['BalanceEstimated'] = await driver.findElement(By.css('.d-flex:nth-child(1) > .text-price')).getText() + // 7 | storeValue | name=size | totalSize + vars['totalSize'] = await driver.findElement(By.name('size')).getAttribute('value') + // 8 | echo | ${BalanceEstimated},${totalSize} | + console.log(vars['BalanceEstimated'] + ' should be less than ' + vars['totalSize']) + let BalanceEstimated = parseFloat(vars['BalanceEstimated']) + let totalSize = parseFloat(['totalSize']) + expect(totalSize - BalanceEstimated).to.be.above(0); + }); + it('1xht buying', async function() { + console.log(' Test name: 1xht buying'); + console.log(' Step # | name | target | value'); + await sleep(15000); + await driver.manage().window().maximize() ; + console.log(' Test name: smartTrade'); + console.log(' Step # | name | target | value'); + console.log(' 1 | open | /trade/xht-usdt | '); + await driver.get(website+ 'trade/xht-usdt'); + await sleep(5000); + //itrating on elms + let elms = await driver.findElements(By.className('f-1 trade_orderbook-cell trade_orderbook-cell_total pointer')); + for (var elm in elms){} + await driver.findElement(By.css('.text-center:nth-child(1)')).click(); + console.log(' 2 | click | css=.trade-col_side_wrapper > .trade_block-wrapper:nth-child(1) | '); + await driver.findElement(By.css('.trade-col_side_wrapper > .trade_block-wrapper:nth-child(1)')).click(); + await sleep(5000); + console.log(' 2 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDT AMOUNT'); + vars['USDT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountBefore = parseFloat(vars['USDT AMOUNT']); + console.log(' 3 | storeText | css=.accordion_section:nth-child(2) .wallet_section-title-amount | HXT AMOUNT'); + vars['XHT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountBefore =parseFloat(vars['XHT AMOUNT']); + console.log(' 4 | echo | ${USDT AMOUNT}, ${XHT AMOUNT}'); + console.log('${USDT AMOUNT}:'+vars['USDT AMOUNT']+ ';${XHT AMOUNT} : '+vars['XHT AMOUNT']); + console.log('USDT and XHT',String(XHTAmountBefore),typeof XHTAmountBefore,String(USDTAmountBefore),typeof USDTAmountBefore); + console.log(' 5 | click | css=.text-center:nth-child(1) | '); + await driver.findElement(By.css('.text-center:nth-child(1)')).click(); + console.log(' 6 | click | name=size | '); + await driver.findElement(By.name('size')).click(); + console.log(' 7 | type | name=size | 1'); + await driver.findElement(By.name('size')).clear(); + await driver.findElement(By.name('size')).sendKeys('1'); + console.log(' 8 | click | css=.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1) | '); + await driver.findElement(By.css('.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1)')).click(); + console.log(' 9 | storeText | css=.d-flex:nth-child(1) > .text-price | USDT'); + vars['USDT'] = await driver.findElement(By.css('.d-flex:nth-child(1) > .text-price')).getText(); + let EstimatedPrice = parseFloat(vars['USDT']); + console.log('EstimatedPrice',String(EstimatedPrice),typeof EstimatedPrice ); + console.log(' 10 | echo | ${USDT} | '); + console.log(vars['USDT']); + console.log(' 11 | click | css=.holla-button | '); + await driver.findElement(By.css('.holla-button')).click(); + console.log(' 12 | click | css=.notification-content-information > .d-flex:nth-child(1) | '); + await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(1)')).click(); + console.log(' 13 | verifyText | css=.text-capitalize | Market Buy'); + assert(await driver.findElement(By.css('.text-capitalize')).getText() == 'Market Buy'); + console.log(' 14 | click | css=.notification-content-information > .d-flex:nth-child(2) | '); + await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(2)')).click(); + console.log(' 15 | verifyText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT'); + assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)')).getText() == '1 XHT'); + console.log(' 16 | click | css=.d-flex > .holla-button:nth-child(3) | '); + await driver.findElement(By.css('.d-flex > .holla-button:nth-child(3)')).click(); + hollaTime.Hollatimestampe(); + console.log('Timestamp : '+String(hollaTime.GetHollatimestampe())); + console.log(' 17 | click | css=.trade-col_action_wrapper > .f-1 | '); + await sleep(3000); + await driver.findElement(By.css('.trade-col_action_wrapper > .f-1')).click(); + await sleep(3000); + console.log(' 18 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDTAFTER'); + vars['USDTAFTER'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountAfter = parseFloat(vars['USDTAFTER']); + console.log(vars['USDTAFTER'],typeof USDTAmountAfter,String(USDTAmountAfter)); + //console.log(' 20 | click | css=.accordion_section:nth-child(2) > .accordion_section_title | '); + //await driver.findElement(By.css('.accordion_section:nth-child(2) > .accordion_section_title')).click(); + console.log(' 19 | storeText | css=.accordion_section--open > .wallet_section-title-amount | XHTAFTER'); + vars['XHTAFTER'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountAfter = parseFloat(vars['XHTAFTER']); + console.log(' 20 echo | ${XHTAFTER} | '); + console.log(vars['XHTAFTER'],typeof XHTAmountAfter,String(XHTAmountAfter)); + console.log(vars['XHTAFTER']+' - '+vars['XHT AMOUNT'],String(XHTAmountBefore - XHTAmountAfter)); + console.log(vars['USDTAFTER']+' - '+vars['USDT AMOUNT'], String(USDTAmountBefore - USDTAmountAfter)); + + + + await driver.get(website + 'transactions' ); + await driver.manage().window().maximize() ; + await sleep(10000); + //await driver.findElement(By.css(".trade_block-wrapper:nth-child(2) .action_notification-text")).click() + + // 2 | click | css=.table_body-row:nth-child(1) > td:nth-child(7) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(7)')).click() + // 3 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(7) | timestamp + vars['timestamp'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(7)')).getText() + // 4 | click | css=.table_body-row:nth-child(1) > .text-uppercase | + await driver.findElement(By.css('.table_body-row:nth-child(1) > .text-uppercase')).click() + // 5 | storeText | css=.table_body-row:nth-child(1) > .text-uppercase | Pair + vars['Pair'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > .text-uppercase')).getText() + // 6 | click | css=.table_body-row:nth-child(1) | + await driver.findElement(By.css('.table_body-row:nth-child(1)')).click() + // 7 | storeText | css=.table_body-row:nth-child(1) .buy | side + vars['side'] = await driver.findElement(By.css('.table_body-row:nth-child(1) .buy')).getText() + // 8 | click | css=.table_body-row:nth-child(1) > td:nth-child(3) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(3)')).click() + // 9 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(3) | size + vars['size'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(3)')).getText() + // 10 | click | css=.table_body-row:nth-child(1) > td:nth-child(4) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(4)')).click() + // 11 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(4) | price + vars['price'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(4)')).getText() + // 12 | click | css=.table_body-row:nth-child(1) > td:nth-child(5) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(5)')).click() + // 13 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(5) | amount + vars['amount'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(5)')).getText() + // 14 | click | css=.table_body-row:nth-child(1) | + await driver.findElement(By.css('.table_body-row:nth-child(1)')).click() + // 15 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(6) | fee + vars['fee'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(6)')).getText() + // 16 | echo | ${Pair},${timestamp},${side},${size},${price},${amount},${fee}}} | + console.log(vars['Pair'],vars['timestamp'],vars['side'],vars['size'],vars['price'],vars['amount'],vars['fee']) + expect(vars['timestamp']).to.equal(hollaTime.GetHollatimestampe()); + }); + +// }); +}); + + diff --git a/test/Trade/time.js b/test/Trade/time.js new file mode 100644 index 0000000000..8a771a3988 --- /dev/null +++ b/test/Trade/time.js @@ -0,0 +1,50 @@ + +function Hollatimestampe(){ + const timestamp = require('time-stamp'); + + console.log(timestamp('YYYY/MM/DD HH:mm:ss')); + const tmStamp = timestamp('YYYY/MM/DD HH:mm:ss') ; + //console.log(newUser); + + if (typeof localStorage === 'undefined' || localStorage === null) { + var LocalStorage = require('node-localstorage').LocalStorage; + localStorage = new LocalStorage('./scratch'); + } + + localStorage.setItem('Timestampe', tmStamp); + //console.log(localStorage.getItem('NewUser')); + return localStorage.getItem('Timestampe'); +} +function Hollatimestampe(){ + const timestamp = require('time-stamp'); + + // console.log(timestamp('YYYY/MM/DD HH:mm:ss')); + const tmStamp = timestamp('YYYY/MM/DD HH:mm:ss') ; + //console.log(newUser); + + if (typeof localStorage === 'undefined' || localStorage === null) { + var LocalStorage = require('node-localstorage').LocalStorage; + localStorage = new LocalStorage('./scratch'); + } + + localStorage.setItem('Timestampe', tmStamp); + //console.log(localStorage.getItem('NewUser')); + return localStorage.getItem('Timestampe'); +} +function GetHollatimestampe(){ + + //console.log(newUser); + + if (typeof localStorage === 'undefined' || localStorage === null) { + var LocalStorage = require('node-localstorage').LocalStorage; + localStorage = new LocalStorage('./scratch'); + } + + return localStorage.getItem('Timestampe'); +} +function getHollaTime(){ + var str = String(GetHollatimestampe()); + var res = str.substring(11, 19); + return res; +} +module.exports = {Hollatimestampe,GetHollatimestampe, getHollaTime}; diff --git a/test/Trade/trade.js b/test/Trade/trade.js index c041edf0cd..c392a27c54 100644 --- a/test/Trade/trade.js +++ b/test/Trade/trade.js @@ -6,11 +6,13 @@ const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); const dotenv = require('dotenv'); +const hollaTime = require('./time'); const { addConsoleHandler } = require('selenium-webdriver/lib/logging'); dotenv.config(); let userName = process.env.ADMIN_USER; let passWord = process.env.ADMIN_PASS; let logInPage = process.env.LOGIN_PAGE; +let website = process.env.WEBSITE; @@ -68,6 +70,31 @@ describe('Trade', function() { await driver.findElement(By.name('size')).click(); // 10 | type | name=size | 1 | await driver.findElement(By.name('size')).sendKeys('1'); + + await driver.manage().window().maximize() ; + console.log(' 1 | open | /trade/xht-usdt | '); + //await driver.get(website+ 'trade/xht-usdt'); + await sleep(5000); + //itrating on elms + // let elms = await driver.findElements(By.className("f-1 trade_orderbook-cell trade_orderbook-cell_total pointer")); + // for (var elm in elms){} + console.log(' 2 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDT AMOUNT'); + vars['USDT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountBefore = parseFloat(vars['USDT AMOUNT']); + console.log(' 3 | storeText | css=.accordion_section:nth-child(2) .wallet_section-title-amount | HXT AMOUNT'); + vars['XHT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountBefore =parseFloat(vars['XHT AMOUNT']); + console.log(' 4 | echo | ${USDT AMOUNT}, ${XHT AMOUNT}'); + console.log('${USDT AMOUNT}:'+vars['USDT AMOUNT']+ ';${XHT AMOUNT} : '+vars['XHT AMOUNT']); + console.log('USDT and XHT',String(XHTAmountBefore),typeof XHTAmountBefore,String(USDTAmountBefore),typeof USDTAmountBefore); + console.log(' 9 | storeText | css=.d-flex:nth-child(1) > .text-price | USDT'); + vars['USDT'] = await driver.findElement(By.css('.d-flex:nth-child(1) > .text-price')).getText(); + let EstimatedPrice = parseFloat(vars['USDT']); + console.log('EstimatedPrice',String(EstimatedPrice),typeof EstimatedPrice ); + console.log(' 10 | echo | ${USDT} | '); + console.log(vars['USDT']); + console.log(' 11 | click | css=.holla-button | '); + // 11 | click | css=.holla-button | | await driver.findElement(By.css('.holla-button')).click(); // 12 | click | css=.notification-content-information > .d-flex:nth-child(1) | | @@ -77,16 +104,88 @@ describe('Trade', function() { // 14 | click | css=.d-flex > .holla-button:nth-child(3) | | await driver.findElement(By.css('.d-flex > .holla-button:nth-child(3)')).click(); // 15 | click | css=.w-100 .ant-select-selection-item | | + hollaTime.Hollatimestampe(); + console.log("Timestamp : "+String(hollaTime.GetHollatimestampe())); + await driver.findElement(By.css('.w-100 .ant-select-selection-item')).click(); // 16 | click | css=.ant-select-item-option-active > .ant-select-item-option-content | | await driver.findElement(By.css('.ant-select-item-option-active > .ant-select-item-option-content')).click(); // 17 | click | name=stop | | + console.log(' 18 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDTAFTER'); + vars['USDTAFTER'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountAfter = parseFloat(vars['USDTAFTER']); + console.log(vars['USDTAFTER'],typeof USDTAmountAfter,String(USDTAmountAfter)); + //console.log(' 20 | click | css=.accordion_section:nth-child(2) > .accordion_section_title | '); + //await driver.findElement(By.css('.accordion_section:nth-child(2) > .accordion_section_title')).click(); + console.log(' 19 | storeText | css=.accordion_section--open > .wallet_section-title-amount | XHTAFTER'); + vars['XHTAFTER'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountAfter = parseFloat(vars['XHTAFTER']); + console.log(' 20 echo | ${XHTAFTER} | '); + console.log(vars['XHTAFTER'],typeof XHTAmountAfter,String(XHTAmountAfter)); + console.log(vars['XHTAFTER']+' - '+vars['XHT AMOUNT'],String(XHTAmountBefore - XHTAmountAfter)); + console.log(vars['USDTAFTER']+' - '+vars['USDT AMOUNT'], String(USDTAmountBefore - USDTAmountAfter)); + + // wallet check + + await driver.get(website + 'transactions' ); + await driver.manage().window().maximize() ; + await sleep(10000); + //await driver.findElement(By.css(".trade_block-wrapper:nth-child(2) .action_notification-text")).click() + + // 2 | click | css=.table_body-row:nth-child(1) > td:nth-child(7) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(7)')).click(); + // 3 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(7) | timestamp + vars['timestamp'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(7)')).getText(); + // 4 | click | css=.table_body-row:nth-child(1) > .text-uppercase | + await driver.findElement(By.css('.table_body-row:nth-child(1) > .text-uppercase')).click(); + // 5 | storeText | css=.table_body-row:nth-child(1) > .text-uppercase | Pair + vars['Pair'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > .text-uppercase')).getText(); + // 6 | click | css=.table_body-row:nth-child(1) | + await driver.findElement(By.css('.table_body-row:nth-child(1)')).click(); + // 7 | storeText | css=.table_body-row:nth-child(1) .buy | side + vars['side'] = await driver.findElement(By.css('.table_body-row:nth-child(1) .buy')).getText(); + // 8 | click | css=.table_body-row:nth-child(1) > td:nth-child(3) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(3)')).click(); + // 9 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(3) | size + vars['size'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(3)')).getText(); + // 10 | click | css=.table_body-row:nth-child(1) > td:nth-child(4) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(4)')).click(); + // 11 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(4) | price + vars['price'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(4)')).getText(); + // 12 | click | css=.table_body-row:nth-child(1) > td:nth-child(5) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(5)')).click(); + // 13 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(5) | amount + vars['amount'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(5)')).getText(); + // 14 | click | css=.table_body-row:nth-child(1) | + await driver.findElement(By.css('.table_body-row:nth-child(1)')).click(); + // 15 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(6) | fee + vars['fee'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(6)')).getText(); + // 16 | echo | ${Pair},${timestamp},${side},${size},${price},${amount},${fee}}} | + console.log(vars['Pair'],vars['timestamp'],vars['side'],vars['size'],vars['price'],vars['amount'],vars['fee']); + console.log(vars['timestamp']+" should be "+hollaTime.GetHollatimestampe()); + expect(vars['timestamp']).to.equal(hollaTime.GetHollatimestampe()); + + await sleep(2000); + // 1 | open | /trade/xht-usdt | + await driver.get(website+"trade/xht-usdt"); + await sleep (5000); + // 2 | storeText | css=.display_table-cell:nth-child(1) > .f-1:nth-child(3) > .trade_history-row | LiveSaleTime + vars["LiveSaleTime"] = await driver.findElement(By.css(".display_table-cell:nth-child(1) > .f-1:nth-child(3) > .trade_history-row")).getText(); + // 3 | click | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | + await driver.findElement(By.css(".trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)")).click(); + // 4 | storeText | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | ActivityOrderTime + vars["ActivityOrderTime"] = await driver.findElement(By.css(".trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)")).getText(); + console.log(" Activity order time : "+vars["ActivityOrderTime"]+"Live sale time : "+vars["LiveSaleTime"] ); + expect(vars["LiveSaleTime"] ).to.equal(hollaTime.GetHollatimestampe()); + expect(vars["ActivityOrderTime"]).to.equal(hollaTime.GetHollatimestampe()); + + }); it('Limit Sell', async function() { // 2 | setWindowSize | 1050x660 | - // await driver.manage().window().setRect(1050, 660) + await driver.manage().window().maximize() ; await sleep(4000); // 3 | click | css=.home_app_bar > .pointer | // await driver.findElement(By.css(".home_app_bar > .pointer")).click() @@ -108,6 +207,26 @@ describe('Trade', function() { // 11 | type | name=size | 1 await driver.findElement(By.name('size')).sendKeys('1'); // 12 | click | css=.holla-button | + + console.log(' 2 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDT AMOUNT'); + vars['USDT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountBefore = parseFloat(vars['USDT AMOUNT']); + console.log(' 3 | storeText | css=.accordion_section:nth-child(2) .wallet_section-title-amount | HXT AMOUNT'); + vars['XHT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountBefore =parseFloat(vars['XHT AMOUNT']); + console.log(' 4 | echo | ${USDT AMOUNT}, ${XHT AMOUNT}'); + console.log('${USDT AMOUNT}:'+vars['USDT AMOUNT']+ ';${XHT AMOUNT} : '+vars['XHT AMOUNT']); + console.log('USDT and XHT',String(XHTAmountBefore),typeof XHTAmountBefore,String(USDTAmountBefore),typeof USDTAmountBefore); + // + console.log(' 9 | storeText | css=.d-flex:nth-child(1) > .text-price | USDT'); + vars['USDT'] = await driver.findElement(By.css('.d-flex:nth-child(1) > .text-price')).getText(); + let EstimatedPrice = parseFloat(vars['USDT']); + console.log('EstimatedPrice',String(EstimatedPrice),typeof EstimatedPrice ); + console.log(' 10 | echo | ${USDT} | '); + console.log(vars['USDT']); + console.log(' 11 | click | css=.holla-button | '); + + await driver.findElement(By.css('.holla-button')).click(); // 13 | click | css=.text-capitalize | await driver.findElement(By.css('.text-capitalize')).click(); @@ -123,41 +242,215 @@ describe('Trade', function() { assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)')).getText() == '1 USDT'); // 19 | click | css=.d-flex > .holla-button:nth-child(3) | await driver.findElement(By.css('.d-flex > .holla-button:nth-child(3)')).click(); + + hollaTime.Hollatimestampe(); + console.log("Timestamp : "+String(hollaTime.GetHollatimestampe())); + + // 20 | click | css=.table_body-row:nth-child(1) .action_notification-text | await driver.findElement(By.css('.table_body-row:nth-child(1) .action_notification-text')).click(); + + console.log(' 18 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDTAFTER'); + vars['USDTAFTER'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountAfter = parseFloat(vars['USDTAFTER']); + console.log(vars['USDTAFTER'],typeof USDTAmountAfter,String(USDTAmountAfter)); + //console.log(' 20 | click | css=.accordion_section:nth-child(2) > .accordion_section_title | '); + //await driver.findElement(By.css('.accordion_section:nth-child(2) > .accordion_section_title')).click(); + console.log(' 19 | storeText | css=.accordion_section--open > .wallet_section-title-amount | XHTAFTER'); + vars['XHTAFTER'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountAfter = parseFloat(vars['XHTAFTER']); + console.log(' 20 echo | ${XHTAFTER} | '); + console.log(vars['XHTAFTER'],typeof XHTAmountAfter,String(XHTAmountAfter)); + console.log(vars['XHTAFTER']+' - '+vars['XHT AMOUNT'],String(XHTAmountBefore - XHTAmountAfter)); + console.log(vars['USDTAFTER']+' - '+vars['USDT AMOUNT'], String(USDTAmountBefore - USDTAmountAfter)); + + // + await driver.get(website + 'transactions' ); + await driver.manage().window().maximize() ; + await sleep(10000); + //await driver.findElement(By.css(".trade_block-wrapper:nth-child(2) .action_notification-text")).click() + + // 2 | click | css=.table_body-row:nth-child(1) > td:nth-child(7) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(7)')).click(); + // 3 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(7) | timestamp + vars['timestamp'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(7)')).getText(); + // 4 | click | css=.table_body-row:nth-child(1) > .text-uppercase | + await driver.findElement(By.css('.table_body-row:nth-child(1) > .text-uppercase')).click(); + // 5 | storeText | css=.table_body-row:nth-child(1) > .text-uppercase | Pair + vars['Pair'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > .text-uppercase')).getText(); + // 6 | click | css=.table_body-row:nth-child(1) | + await driver.findElement(By.css('.table_body-row:nth-child(1)')).click(); + // 7 | storeText | css=.table_body-row:nth-child(1) .buy | side + vars['side'] = await driver.findElement(By.css('.table_body-row:nth-child(1) .buy')).getText(); + // 8 | click | css=.table_body-row:nth-child(1) > td:nth-child(3) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(3)')).click(); + // 9 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(3) | size + vars['size'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(3)')).getText(); + // 10 | click | css=.table_body-row:nth-child(1) > td:nth-child(4) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(4)')).click(); + // 11 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(4) | price + vars['price'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(4)')).getText(); + // 12 | click | css=.table_body-row:nth-child(1) > td:nth-child(5) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(5)')).click(); + // 13 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(5) | amount + vars['amount'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(5)')).getText(); + // 14 | click | css=.table_body-row:nth-child(1) | + await driver.findElement(By.css('.table_body-row:nth-child(1)')).click(); + // 15 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(6) | fee + vars['fee'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(6)')).getText(); + // 16 | echo | ${Pair},${timestamp},${side},${size},${price},${amount},${fee}}} | + console.log(vars['Pair'],vars['timestamp'],vars['side'],vars['size'],vars['price'],vars['amount'],vars['fee']); + console.log(vars['timestamp']+" should be "+hollaTime.GetHollatimestampe()); + expect(vars['timestamp']).to.equal(hollaTime.GetHollatimestampe()); + + await sleep(2000); + console.log("| open | /trade/xht-usdt | "); + await driver.get(website+"trade/xht-usdt"); + await sleep (5000); + // 2 | storeText | css=.display_table-cell:nth-child(1) > .f-1:nth-child(3) > .trade_history-row | LiveSaleTime + vars["LiveSaleTime"] = await driver.findElement(By.css(".display_table-cell:nth-child(1) > .f-1:nth-child(3) > .trade_history-row")).getText(); + // 3 | click | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | + await driver.findElement(By.css(".trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)")).click(); + // 4 | storeText | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | ActivityOrderTime + vars["ActivityOrderTime"] = await driver.findElement(By.css(".trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)")).getText(); + console.log(" Activity order time : "+vars["ActivityOrderTime"]+"Live sale time : "+vars["LiveSaleTime"] ); + expect(vars["LiveSaleTime"] ).to.equal(hollaTime.getHollaTime()); + expect(vars["ActivityOrderTime"]).to.equal(hollaTime.GetHollatimestampe()); + + + }); it('Market buy', async function(){ - // await driver.manage().window().setRect(1296, 696) - await sleep(2000); - // 3 | click | css=.app-menu-bar-content:nth-child(2) .edit-wrapper__container | - await driver.findElement(By.css('.app-menu-bar-content:nth-child(2) .edit-wrapper__container')).click(); - // 4 | click | name=Search Assets | - await driver.findElement(By.name('Search Assets')).click(); - // 5 | type | name=Search Assets | xht - await driver.findElement(By.name('Search Assets')).sendKeys('xht'); - // 6 | sendKeys | name=Search Assets | ${KEY_ENTER} - await driver.findElement(By.name('Search Assets')).sendKeys(Key.ENTER); - // 9 | click | css=.highcharts-background | - await driver.findElement(By.css('.highcharts-background')).click(); - // 10 | click | css=.text-center:nth-child(1) | + console.log(' Test name: 1xht buying'); + console.log(' Step # | name | target | value'); + await sleep(15000); + await driver.manage().window().maximize() ; + console.log(' Test name: smartTrade'); + console.log(' Step # | name | target | value'); + console.log(' 1 | open | /trade/xht-usdt | '); + await driver.get(website+ 'trade/xht-usdt'); + await sleep(5000); + //itrating on elms + let elms = await driver.findElements(By.className("f-1 trade_orderbook-cell trade_orderbook-cell_total pointer")); + for (var elm in elms){} + await driver.findElement(By.css('.text-center:nth-child(1)')).click(); + console.log(' 2 | click | css=.trade-col_side_wrapper > .trade_block-wrapper:nth-child(1) | '); + await driver.findElement(By.css('.trade-col_side_wrapper > .trade_block-wrapper:nth-child(1)')).click(); await sleep(5000); + console.log(' 2 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDT AMOUNT'); + vars['USDT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountBefore = parseFloat(vars['USDT AMOUNT']); + console.log(' 3 | storeText | css=.accordion_section:nth-child(2) .wallet_section-title-amount | HXT AMOUNT'); + vars['XHT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountBefore =parseFloat(vars['XHT AMOUNT']); + console.log(' 4 | echo | ${USDT AMOUNT}, ${XHT AMOUNT}'); + console.log('${USDT AMOUNT}:'+vars['USDT AMOUNT']+ ';${XHT AMOUNT} : '+vars['XHT AMOUNT']); + console.log('USDT and XHT',String(XHTAmountBefore),typeof XHTAmountBefore,String(USDTAmountBefore),typeof USDTAmountBefore); + console.log(' 5 | click | css=.text-center:nth-child(1) | '); await driver.findElement(By.css('.text-center:nth-child(1)')).click(); - // 11 | click&type 1 | name=size | + console.log(' 6 | click | name=size | '); await driver.findElement(By.name('size')).click(); + console.log(' 7 | type | name=size | 1'); + await driver.findElement(By.name('size')).clear(); await driver.findElement(By.name('size')).sendKeys('1'); - // 12 | click | css=.holla-button | + console.log(' 8 | click | css=.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1) | '); + await driver.findElement(By.css('.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1)')).click(); + console.log(' 9 | storeText | css=.d-flex:nth-child(1) > .text-price | USDT'); + vars['USDT'] = await driver.findElement(By.css('.d-flex:nth-child(1) > .text-price')).getText(); + let EstimatedPrice = parseFloat(vars['USDT']); + console.log('EstimatedPrice',String(EstimatedPrice),typeof EstimatedPrice ); + console.log(' 10 | echo | ${USDT} | '); + console.log(vars['USDT']); + console.log(' 11 | click | css=.holla-button | '); await driver.findElement(By.css('.holla-button')).click(); - // 15 | click | css=.text-capitalize | - await driver.findElement(By.css('.text-capitalize')).click(); - // 16 | assertText | css=.text-capitalize | Market Buy - assert(await driver.findElement(By.css('.text-capitalize')).getText() == 'Market Buy!'); - // 17 | click | css=.d-flex > .holla-button:nth-child(3) | + console.log(' 12 | click | css=.notification-content-information > .d-flex:nth-child(1) | '); + await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(1)')).click(); + console.log(' 13 | verifyText | css=.text-capitalize | Market Buy'); + assert(await driver.findElement(By.css('.text-capitalize')).getText() == 'Market Buy'); + console.log(' 14 | click | css=.notification-content-information > .d-flex:nth-child(2) | '); + await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(2)')).click(); + console.log(' 15 | verifyText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT'); + assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)')).getText() == '1 XHT'); + console.log(' 16 | click | css=.d-flex > .holla-button:nth-child(3) | '); await driver.findElement(By.css('.d-flex > .holla-button:nth-child(3)')).click(); + hollaTime.Hollatimestampe(); + console.log("Timestamp : "+String(hollaTime.GetHollatimestampe())); + console.log(' 17 | click | css=.trade-col_action_wrapper > .f-1 | '); + await sleep(3000); + await driver.findElement(By.css('.trade-col_action_wrapper > .f-1')).click(); + await sleep(3000); + console.log(' 18 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDTAFTER'); + vars['USDTAFTER'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountAfter = parseFloat(vars['USDTAFTER']); + console.log(vars['USDTAFTER'],typeof USDTAmountAfter,String(USDTAmountAfter)); + //console.log(' 20 | click | css=.accordion_section:nth-child(2) > .accordion_section_title | '); + //await driver.findElement(By.css('.accordion_section:nth-child(2) > .accordion_section_title')).click(); + console.log(' 19 | storeText | css=.accordion_section--open > .wallet_section-title-amount | XHTAFTER'); + vars['XHTAFTER'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountAfter = parseFloat(vars['XHTAFTER']); + console.log(' 20 echo | ${XHTAFTER} | '); + console.log(vars['XHTAFTER'],typeof XHTAmountAfter,String(XHTAmountAfter)); + console.log(vars['XHTAFTER']+' - '+vars['XHT AMOUNT'],String(XHTAmountBefore - XHTAmountAfter)); + console.log(vars['USDTAFTER']+' - '+vars['USDT AMOUNT'], String(USDTAmountBefore - USDTAmountAfter)); + + + + await driver.get(website + 'transactions' ); + await driver.manage().window().maximize() ; + await sleep(7000); + //await driver.findElement(By.css(".trade_block-wrapper:nth-child(2) .action_notification-text")).click() + + // 2 | click | css=.table_body-row:nth-child(1) > td:nth-child(7) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(7)')).click(); + // 3 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(7) | timestamp + vars['timestamp'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(7)')).getText(); + // 4 | click | css=.table_body-row:nth-child(1) > .text-uppercase | + await driver.findElement(By.css('.table_body-row:nth-child(1) > .text-uppercase')).click(); + // 5 | storeText | css=.table_body-row:nth-child(1) > .text-uppercase | Pair + vars['Pair'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > .text-uppercase')).getText(); + // 6 | click | css=.table_body-row:nth-child(1) | + await driver.findElement(By.css('.table_body-row:nth-child(1)')).click(); + // 7 | storeText | css=.table_body-row:nth-child(1) .buy | side + vars['side'] = await driver.findElement(By.css('.table_body-row:nth-child(1) .buy')).getText(); + // 8 | click | css=.table_body-row:nth-child(1) > td:nth-child(3) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(3)')).click(); + // 9 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(3) | size + vars['size'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(3)')).getText(); + // 10 | click | css=.table_body-row:nth-child(1) > td:nth-child(4) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(4)')).click(); + // 11 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(4) | price + vars['price'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(4)')).getText(); + // 12 | click | css=.table_body-row:nth-child(1) > td:nth-child(5) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(5)')).click(); + // 13 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(5) | amount + vars['amount'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(5)')).getText(); + // 14 | click | css=.table_body-row:nth-child(1) | + await driver.findElement(By.css('.table_body-row:nth-child(1)')).click(); + // 15 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(6) | fee + vars['fee'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(6)')).getText(); + // 16 | echo | ${Pair},${timestamp},${side},${size},${price},${amount},${fee}}} | + console.log(vars['Pair'],vars['timestamp'],vars['side'],vars['size'],vars['price'],vars['amount'],vars['fee']); + expect(vars['timestamp']).to.equal(hollaTime.GetHollatimestampe()); + + await sleep(5000); + // 1 | open | /trade/xht-usdt | + await driver.get(website+"trade/xht-usdt"); + await sleep (5000); + // 2 | storeText | css=.display_table-cell:nth-child(1) > .f-1:nth-child(3) > .trade_history-row | LiveSaleTime + vars["LiveSaleTime"] = await driver.findElement(By.css(".display_table-cell:nth-child(1) > .f-1:nth-child(3) > .trade_history-row")).getText(); + // 3 | click | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | + await driver.findElement(By.css(".trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)")).click(); + // 4 | storeText | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | ActivityOrderTime + vars["ActivityOrderTime"] = await driver.findElement(By.css(".trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)")).getText(); + console.log(" Activity order time : "+vars["ActivityOrderTime"]+"Live sale time : "+vars["LiveSaleTime"] ); + console.log("Time should be : "+hollaTime.getHollaTime()); + expect(vars["LiveSaleTime"] ).to.equal(hollaTime.getHollaTime()); + expect(vars["ActivityOrderTime"]).to.equal(hollaTime.GetHollatimestampe()); }); it('market sell', async function(){ - await driver.manage().window().setRect(1296, 696); + await driver.manage().window().maximize() ; await sleep(2000); // 3 | click | css=.app-menu-bar-content:nth-child(2) .edit-wrapper__container | await driver.findElement(By.css('.app-menu-bar-content:nth-child(2) .edit-wrapper__container')).click(); @@ -181,6 +474,26 @@ describe('Trade', function() { await driver.findElement(By.name('size')).click(); await driver.findElement(By.name('size')).sendKeys('1'); // 6 | click | css=.holla-button | + + console.log(' 2 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDT AMOUNT'); + vars['USDT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountBefore = parseFloat(vars['USDT AMOUNT']); + console.log(' 3 | storeText | css=.accordion_section:nth-child(2) .wallet_section-title-amount | HXT AMOUNT'); + vars['XHT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountBefore =parseFloat(vars['XHT AMOUNT']); + console.log(' 4 | echo | ${USDT AMOUNT}, ${XHT AMOUNT}'); + console.log('${USDT AMOUNT}:'+vars['USDT AMOUNT']+ ';${XHT AMOUNT} : '+vars['XHT AMOUNT']); + console.log('USDT and XHT',String(XHTAmountBefore),typeof XHTAmountBefore,String(USDTAmountBefore),typeof USDTAmountBefore); + + console.log(' 9 | storeText | css=.d-flex:nth-child(1) > .text-price | USDT'); + vars['USDT'] = await driver.findElement(By.css('.d-flex:nth-child(1) > .text-price')).getText(); + let EstimatedPrice = parseFloat(vars['USDT']); + console.log('EstimatedPrice',String(EstimatedPrice),typeof EstimatedPrice ); + console.log(' 10 | echo | ${USDT} | '); + console.log(vars['USDT']); + console.log(' 11 | click | css=.holla-button | '); + + await driver.findElement(By.css('.holla-button')).click(); // 7 | click | css=.text-capitalize | await driver.findElement(By.css('.text-capitalize')).click(); @@ -193,6 +506,77 @@ describe('Trade', function() { // 11 | click | css=.d-flex > .holla-button:nth-child(3) | await driver.findElement(By.css('.d-flex > .holla-button:nth-child(3)')).click(); + + hollaTime.Hollatimestampe(); + console.log("Timestamp : "+String(hollaTime.GetHollatimestampe())); + // + console.log(' 18 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDTAFTER'); + vars['USDTAFTER'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountAfter = parseFloat(vars['USDTAFTER']); + console.log(vars['USDTAFTER'],typeof USDTAmountAfter,String(USDTAmountAfter)); + //console.log(' 20 | click | css=.accordion_section:nth-child(2) > .accordion_section_title | '); + //await driver.findElement(By.css('.accordion_section:nth-child(2) > .accordion_section_title')).click(); + console.log(' 19 | storeText | css=.accordion_section--open > .wallet_section-title-amount | XHTAFTER'); + vars['XHTAFTER'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountAfter = parseFloat(vars['XHTAFTER']); + console.log(' 20 echo | ${XHTAFTER} | '); + console.log(vars['XHTAFTER'],typeof XHTAmountAfter,String(XHTAmountAfter)); + console.log(vars['XHTAFTER']+' - '+vars['XHT AMOUNT'],String(XHTAmountBefore - XHTAmountAfter)); + console.log(vars['USDTAFTER']+' - '+vars['USDT AMOUNT'], String(USDTAmountBefore - USDTAmountAfter)); + + // + await driver.get(website + 'transactions' ); + await driver.manage().window().maximize() ; + await sleep(10000); + //await driver.findElement(By.css(".trade_block-wrapper:nth-child(2) .action_notification-text")).click() + + // 2 | click | css=.table_body-row:nth-child(1) > td:nth-child(7) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(7)')).click(); + // 3 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(7) | timestamp + vars['timestamp'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(7)')).getText(); + // 4 | click | css=.table_body-row:nth-child(1) > .text-uppercase | + await driver.findElement(By.css('.table_body-row:nth-child(1) > .text-uppercase')).click(); + // 5 | storeText | css=.table_body-row:nth-child(1) > .text-uppercase | Pair + vars['Pair'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > .text-uppercase')).getText(); + // 6 | click | css=.table_body-row:nth-child(1) | + await driver.findElement(By.css('.table_body-row:nth-child(1)')).click(); + // 7 | storeText | css=.table_body-row:nth-child(1) .buy | side + vars['side'] = await driver.findElement(By.css('.table_body-row:nth-child(1) .sell')).getText(); + // 8 | click | css=.table_body-row:nth-child(1) > td:nth-child(3) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(3)')).click(); + // 9 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(3) | size + vars['size'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(3)')).getText(); + // 10 | click | css=.table_body-row:nth-child(1) > td:nth-child(4) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(4)')).click(); + // 11 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(4) | price + vars['price'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(4)')).getText(); + // 12 | click | css=.table_body-row:nth-child(1) > td:nth-child(5) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(5)')).click(); + // 13 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(5) | amount + vars['amount'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(5)')).getText(); + // 14 | click | css=.table_body-row:nth-child(1) | + await driver.findElement(By.css('.table_body-row:nth-child(1)')).click(); + // 15 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(6) | fee + vars['fee'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(6)')).getText(); + // 16 | echo | ${Pair},${timestamp},${side},${size},${price},${amount},${fee}}} | + console.log(vars['Pair'],vars['timestamp'],vars['side'],vars['size'],vars['price'],vars['amount'],vars['fee']); + console.log(vars['timestamp']+" should be "+hollaTime.GetHollatimestampe()); + expect(vars['timestamp']).to.equal(hollaTime.GetHollatimestampe()); + + await sleep(2000); + // 1 | open | /trade/xht-usdt | + await driver.get(website+"trade/xht-usdt"); + await sleep (5000); + // 2 | storeText | css=.display_table-cell:nth-child(1) > .f-1:nth-child(3) > .trade_history-row | LiveSaleTime + vars["LiveSaleTime"] = await driver.findElement(By.css(".display_table-cell:nth-child(1) > .f-1:nth-child(3) > .trade_history-row")).getText(); + // 3 | click | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | + await driver.findElement(By.css(".trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)")).click(); + // 4 | storeText | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | ActivityOrderTime + vars["ActivityOrderTime"] = await driver.findElement(By.css(".trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)")).getText(); + console.log(" Activity order time : "+vars["ActivityOrderTime"]+"Live sale time : "+vars["LiveSaleTime"] ); + expect(vars["LiveSaleTime"] ).to.equal(hollaTime.getHollaTime()); + expect(vars["ActivityOrderTime"]).to.equal(hollaTime.GetHollatimestampe()); + }); }); diff --git a/test/Trade/tradeWithStop.js b/test/Trade/tradeWithStop.js index 8b6327a687..9c82031cc4 100644 --- a/test/Trade/tradeWithStop.js +++ b/test/Trade/tradeWithStop.js @@ -6,11 +6,13 @@ const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); const dotenv = require('dotenv'); +const hollaTime = require('./time'); const { addConsoleHandler } = require('selenium-webdriver/lib/logging'); dotenv.config(); let userName = process.env.ADMIN_USER; let passWord = process.env.ADMIN_PASS; let logInPage = process.env.LOGIN_PAGE; +let website = process.env.WEBSITE; describe('Trade with stop', function() { this.timeout(300000); @@ -56,7 +58,7 @@ describe('Trade with stop', function() { // 9 | click | name=size | | await sleep(3000); - // await driver.manage().window().setRect(1050, 660) + await driver.manage().window().maximize(); // // 3 | click | css=.w-100 .ant-select-selection-item | await driver.findElement(By.css('.w-100 .ant-select-selection-item')).click(); @@ -75,7 +77,7 @@ describe('Trade with stop', function() { await sleep(1000); await driver.findElement(By.name('stop')).click(); // 4 | type | name=stop | 1 - await driver.findElement(By.name('stop')).sendKeys('1'); + await driver.findElement(By.name('stop')).sendKeys('1.1'); await sleep(1000); // 7 | type | name=price | 0.9 // await sleep(1000) @@ -84,6 +86,21 @@ describe('Trade with stop', function() { // 6 | type | name=size | 1 await driver.findElement(By.name('size')).sendKeys('1'); await sleep(3000); + + console.log(' 2 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDT AMOUNT'); + vars['USDT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountBefore = parseFloat(vars['USDT AMOUNT']); + console.log(' 3 | storeText | css=.accordion_section:nth-child(2) .wallet_section-title-amount | HXT AMOUNT'); + vars['XHT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountBefore =parseFloat(vars['XHT AMOUNT']); + console.log(' 4 | echo | ${USDT AMOUNT}, ${XHT AMOUNT}'); + console.log('${USDT AMOUNT}:'+vars['USDT AMOUNT']+ ';${XHT AMOUNT} : '+vars['XHT AMOUNT']); + console.log('USDT and XHT',String(XHTAmountBefore),typeof XHTAmountBefore,String(USDTAmountBefore),typeof USDTAmountBefore); + // 2 | storeValue | name=stop | TriggerPrice + vars['TriggerPrice'] = await driver.findElement(By.name('stop')).getAttribute('value'); + // 3 | echo | ${TriggerPrice} | + console.log('Stop is : '+vars['TriggerPrice']); + await driver.findElement(By.name('size')).sendKeys(Key.ENTER); // 10 | assertText | css=.text-capitalize | Limit Buy @@ -95,10 +112,89 @@ describe('Trade with stop', function() { // 13 | click | css=.notification-content-information > .d-flex:nth-child(3) | await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(3)')).click(); // 14 | assertText | css=.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2) | 0.9 USDT - assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)')).getText() == '0.9 USDT'); + assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)')).getText() == '1 USDT'); // 15 | click | css=.d-flex > .holla-button:nth-child(3) | - sleep(2000); + await sleep(2000); await driver.findElement(By.css('.d-flex > .holla-button:nth-child(3)')).click(); + hollaTime.Hollatimestampe(); + console.log('Timestamp : '+String(hollaTime.GetHollatimestampe())); + console.log(' 9 | storeText | css=.d-flex:nth-child(1) > .text-price | USDT'); + vars['USDT'] = await driver.findElement(By.css('.d-flex:nth-child(1) > .text-price')).getText(); + let EstimatedPrice = parseFloat(vars['USDT']); + console.log('EstimatedPrice',String(EstimatedPrice),typeof EstimatedPrice ); + console.log(' 10 | echo | ${USDT} | '); + console.log(vars['USDT']); + + // + + // + console.log(' 18 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDTAFTER'); + vars['USDTAFTER'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountAfter = parseFloat(vars['USDTAFTER']); + console.log(vars['USDTAFTER'],typeof USDTAmountAfter,String(USDTAmountAfter)); + //console.log(' 20 | click | css=.accordion_section:nth-child(2) > .accordion_section_title | '); + //await driver.findElement(By.css('.accordion_section:nth-child(2) > .accordion_section_title')).click(); + console.log(' 19 | storeText | css=.accordion_section--open > .wallet_section-title-amount | XHTAFTER'); + vars['XHTAFTER'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountAfter = parseFloat(vars['XHTAFTER']); + console.log(' 20 echo | ${XHTAFTER} | '); + console.log(vars['XHTAFTER'],typeof XHTAmountAfter,String(XHTAmountAfter)); + console.log(vars['XHTAFTER']+' - '+vars['XHT AMOUNT'],String(XHTAmountBefore - XHTAmountAfter)); + console.log(vars['USDTAFTER']+' - '+vars['USDT AMOUNT'], String(USDTAmountBefore - USDTAmountAfter)); + + // + + await driver.get(website + 'transactions' ); + await driver.manage().window().maximize() ; + await sleep(10000); + //await driver.findElement(By.css(".trade_block-wrapper:nth-child(2) .action_notification-text")).click() + + // 2 | click | css=.table_body-row:nth-child(1) > td:nth-child(7) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(7)')).click(); + // 3 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(7) | timestamp + vars['timestamp'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(7)')).getText(); + // 4 | click | css=.table_body-row:nth-child(1) > .text-uppercase | + await driver.findElement(By.css('.table_body-row:nth-child(1) > .text-uppercase')).click(); + // 5 | storeText | css=.table_body-row:nth-child(1) > .text-uppercase | Pair + vars['Pair'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > .text-uppercase')).getText(); + // 6 | click | css=.table_body-row:nth-child(1) | + await driver.findElement(By.css('.table_body-row:nth-child(1)')).click(); + // 7 | storeText | css=.table_body-row:nth-child(1) .buy | side + vars['side'] = await driver.findElement(By.css('.table_body-row:nth-child(1) .buy')).getText(); + // 8 | click | css=.table_body-row:nth-child(1) > td:nth-child(3) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(3)')).click(); + // 9 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(3) | size + vars['size'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(3)')).getText(); + // 10 | click | css=.table_body-row:nth-child(1) > td:nth-child(4) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(4)')).click(); + // 11 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(4) | price + vars['price'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(4)')).getText(); + // 12 | click | css=.table_body-row:nth-child(1) > td:nth-child(5) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(5)')).click(); + // 13 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(5) | amount + vars['amount'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(5)')).getText(); + // 14 | click | css=.table_body-row:nth-child(1) | + await driver.findElement(By.css('.table_body-row:nth-child(1)')).click(); + // 15 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(6) | fee + vars['fee'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(6)')).getText(); + // 16 | echo | ${Pair},${timestamp},${side},${size},${price},${amount},${fee}}} | + console.log(vars['Pair'],vars['timestamp'],vars['side'],vars['size'],vars['price'],vars['amount'],vars['fee']); + console.log(vars['timestamp']+' should be '+hollaTime.GetHollatimestampe()); + //expect(vars['timestamp']).to.equal(hollaTime.GetHollatimestampe()); + + await sleep(2000); + // 1 | open | /trade/xht-usdt | + await driver.get(website+'trade/xht-usdt'); + await sleep (5000); + // 2 | storeText | css=.display_table-cell:nth-child(1) > .f-1:nth-child(3) > .trade_history-row | LiveSaleTime + vars['LiveSaleTime'] = await driver.findElement(By.css('.display_table-cell:nth-child(1) > .f-1:nth-child(3) > .trade_history-row')).getText(); + // 3 | click | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | + await driver.findElement(By.css('.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)')).click(); + // 4 | storeText | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | ActivityOrderTime + vars['ActivityOrderTime'] = await driver.findElement(By.css('.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)')).getText(); + console.log(' Activity order time : '+vars['ActivityOrderTime']+'Live sale time : '+vars['LiveSaleTime'] ); + expect(vars['LiveSaleTime'] ).to.equal(hollaTime.getHollaTime()); + expect(vars['ActivityOrderTime']).to.equal(hollaTime.GetHollatimestampe()); }); it('Limit sell', async function(){ @@ -111,7 +207,7 @@ describe('Trade with stop', function() { // 2 | click | css=.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1) | await driver.findElement(By.css('.trade-col_action_wrapper > .trade_block-wrapper:nth-child(1)')).click(); // 3 | storeValue | name=price | value - value = await driver.findElement(By.name('price')).getAttribute('value'); + let value = await driver.findElement(By.name('price')).getAttribute('value'); // await console.log(typeof(value)); // await console.log(value) // 4 | click | name=stop | @@ -122,6 +218,29 @@ describe('Trade with stop', function() { await driver.findElement(By.name('size')).click(); await driver.findElement(By.name('size')).sendKeys(1); // 7 | sendKeys | name=size | ${KEY_ENTER} + + + console.log(' 2 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDT AMOUNT'); + vars['USDT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountBefore = parseFloat(vars['USDT AMOUNT']); + console.log(' 3 | storeText | css=.accordion_section:nth-child(2) .wallet_section-title-amount | HXT AMOUNT'); + vars['XHT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountBefore =parseFloat(vars['XHT AMOUNT']); + console.log(' 4 | echo | ${USDT AMOUNT}, ${XHT AMOUNT}'); + console.log('${USDT AMOUNT}:'+vars['USDT AMOUNT']+ ';${XHT AMOUNT} : '+vars['XHT AMOUNT']); + console.log('USDT and XHT',String(XHTAmountBefore),typeof XHTAmountBefore,String(USDTAmountBefore),typeof USDTAmountBefore); + // 2 | storeValue | name=stop | TriggerPrice + vars['TriggerPrice'] = await driver.findElement(By.name('stop')).getAttribute('value'); + // 3 | echo | ${TriggerPrice} | + console.log('Stop is : '+vars['TriggerPrice']); + + // + console.log(' 9 | storeText | css=.d-flex:nth-child(1) > .text-price | USDT'); + vars['USDT'] = await driver.findElement(By.css('.d-flex:nth-child(1) > .text-price')).getText(); + let EstimatedPrice = parseFloat(vars['USDT']); + console.log('EstimatedPrice',String(EstimatedPrice),typeof EstimatedPrice ); + console.log(' 10 | echo | ${USDT} | '); + console.log(vars['USDT']); await driver.findElement(By.name('size')).sendKeys(Key.ENTER); // // 8 | type | name=stop | 0.8 // await driver.findElement(By.name("stop")).sendKeys("0.8") @@ -136,9 +255,82 @@ describe('Trade with stop', function() { // 13 | click | css=.notification-content-information > .d-flex:nth-child(3) | await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(3)')).click(); // 14 | assertText | css=.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2) | 0.9 USDT - assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)')).getText() == '0.9 USDT'); + //assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(3) > .f-1:nth-child(2)')).getText() == '0.9 USDT'); // 15 | click | css=.d-flex > .holla-button:nth-child(3) | await driver.findElement(By.css('.d-flex > .holla-button:nth-child(3)')).click(); + + hollaTime.Hollatimestampe(); + console.log('Timestamp : '+String(hollaTime.GetHollatimestampe())); + // + console.log(' 18 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDTAFTER'); + vars['USDTAFTER'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountAfter = parseFloat(vars['USDTAFTER']); + console.log(vars['USDTAFTER'],typeof USDTAmountAfter,String(USDTAmountAfter)); + //console.log(' 20 | click | css=.accordion_section:nth-child(2) > .accordion_section_title | '); + //await driver.findElement(By.css('.accordion_section:nth-child(2) > .accordion_section_title')).click(); + console.log(' 19 | storeText | css=.accordion_section--open > .wallet_section-title-amount | XHTAFTER'); + vars['XHTAFTER'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountAfter = parseFloat(vars['XHTAFTER']); + console.log(' 20 echo | ${XHTAFTER} | '); + console.log(vars['XHTAFTER'],typeof XHTAmountAfter,String(XHTAmountAfter)); + console.log(vars['XHTAFTER']+' - '+vars['XHT AMOUNT'],String(XHTAmountBefore - XHTAmountAfter)); + console.log(vars['USDTAFTER']+' - '+vars['USDT AMOUNT'], String(USDTAmountBefore - USDTAmountAfter)); + + // + + await driver.get(website + 'transactions' ); + await driver.manage().window().maximize() ; + await sleep(10000); + //await driver.findElement(By.css(".trade_block-wrapper:nth-child(2) .action_notification-text")).click() + + // 2 | click | css=.table_body-row:nth-child(1) > td:nth-child(7) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(7)')).click(); + // 3 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(7) | timestamp + vars['timestamp'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(7)')).getText(); + // 4 | click | css=.table_body-row:nth-child(1) > .text-uppercase | + await driver.findElement(By.css('.table_body-row:nth-child(1) > .text-uppercase')).click(); + // 5 | storeText | css=.table_body-row:nth-child(1) > .text-uppercase | Pair + vars['Pair'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > .text-uppercase')).getText(); + // 6 | click | css=.table_body-row:nth-child(1) | + await driver.findElement(By.css('.table_body-row:nth-child(1)')).click(); + // 7 | storeText | css=.table_body-row:nth-child(1) .buy | side + //vars['side'] = await driver.findElement(By.css('.table_body-row:nth-child(1) .sell')).getText() + vars['side'] ='sell'; + // 8 | click | css=.table_body-row:nth-child(1) > td:nth-child(3) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(3)')).click(); + // 9 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(3) | size + vars['size'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(3)')).getText(); + // 10 | click | css=.table_body-row:nth-child(1) > td:nth-child(4) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(4)')).click(); + // 11 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(4) | price + vars['price'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(4)')).getText(); + // 12 | click | css=.table_body-row:nth-child(1) > td:nth-child(5) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(5)')).click(); + // 13 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(5) | amount + vars['amount'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(5)')).getText(); + // 14 | click | css=.table_body-row:nth-child(1) | + await driver.findElement(By.css('.table_body-row:nth-child(1)')).click(); + // 15 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(6) | fee + vars['fee'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(6)')).getText(); + // 16 | echo | ${Pair},${timestamp},${side},${size},${price},${amount},${fee}}} | + console.log(vars['Pair'],vars['timestamp'],vars['side'],vars['size'],vars['price'],vars['amount'],vars['fee']); + console.log(vars['timestamp']+' should be '+hollaTime.GetHollatimestampe()); + //expect(vars['timestamp']).to.equal(hollaTime.GetHollatimestampe()); + + await sleep(2000); + // 1 | open | /trade/xht-usdt | + await driver.get(website+'trade/xht-usdt'); + await sleep (5000); + // 2 | storeText | css=.display_table-cell:nth-child(1) > .f-1:nth-child(3) > .trade_history-row | LiveSaleTime + vars['LiveSaleTime'] = await driver.findElement(By.css('.display_table-cell:nth-child(1) > .f-1:nth-child(3) > .trade_history-row')).getText(); + // 3 | click | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | + await driver.findElement(By.css('.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)')).click(); + // 4 | storeText | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | ActivityOrderTime + vars['ActivityOrderTime'] = await driver.findElement(By.css('.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)')).getText(); + console.log(' Activity order time : '+vars['ActivityOrderTime']+'Live sale time : '+vars['LiveSaleTime'] ); + expect(vars['LiveSaleTime'] ).to.equal(hollaTime.getHollaTime()); + expect(vars['ActivityOrderTime']).to.equal(hollaTime.GetHollatimestampe()); + }); it('Market Buy', async function(){ @@ -148,13 +340,35 @@ describe('Trade with stop', function() { // 4 | click | name=stop | await driver.findElement(By.name('stop')).click(); // 5 | type | name=stop | 1 - await driver.findElement(By.name('stop')).sendKeys('1'); + await driver.findElement(By.name('stop')).sendKeys('1.1'); // 6 | click | name=size | await driver.findElement(By.name('size')).click(); // 8 | type | name=size | 1 await driver.findElement(By.name('size')).sendKeys('1'); // 9 | sendKeys | name=size | ${KEY_ENTER} await driver.findElement(By.name('size')).sendKeys(Key.ENTER); + + console.log(' 2 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDT AMOUNT'); + vars['USDT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountBefore = parseFloat(vars['USDT AMOUNT']); + console.log(' 3 | storeText | css=.accordion_section:nth-child(2) .wallet_section-title-amount | HXT AMOUNT'); + vars['XHT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountBefore =parseFloat(vars['XHT AMOUNT']); + console.log(' 4 | echo | ${USDT AMOUNT}, ${XHT AMOUNT}'); + console.log('${USDT AMOUNT}:'+vars['USDT AMOUNT']+ ';${XHT AMOUNT} : '+vars['XHT AMOUNT']); + console.log('USDT and XHT',String(XHTAmountBefore),typeof XHTAmountBefore,String(USDTAmountBefore),typeof USDTAmountBefore); + // 2 | storeValue | name=stop | TriggerPrice + vars['TriggerPrice'] = await driver.findElement(By.name('stop')).getAttribute('value'); + // 3 | echo | ${TriggerPrice} | + console.log('Stop is : '+vars['TriggerPrice']); + + // + console.log(' 9 | storeText | css=.d-flex:nth-child(1) > .text-price | USDT'); + vars['USDT'] = await driver.findElement(By.css('.d-flex:nth-child(1) > .text-price')).getText(); + let EstimatedPrice = parseFloat(vars['USDT']); + console.log('EstimatedPrice',String(EstimatedPrice),typeof EstimatedPrice ); + console.log(' 10 | echo | ${USDT} | '); + console.log(vars['USDT']); // 10 | click | css=.notification-content-information > .d-flex:nth-child(1) | await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(1)')).click(); // 11 | assertText | css=.text-capitalize | Market Buy @@ -182,15 +396,108 @@ describe('Trade with stop', function() { await driver.findElement(By.name('size')).click(); // 5 | type | name=size | 1 | await driver.findElement(By.name('size')).sendKeys('1'); - // 6 | sendKeys | name=size | ${KEY_ENTER} | - await driver.findElement(By.name('size')).sendKeys(Key.ENTER); - + + console.log(' 2 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDT AMOUNT'); + vars['USDT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountBefore = parseFloat(vars['USDT AMOUNT']); + console.log(' 3 | storeText | css=.accordion_section:nth-child(2) .wallet_section-title-amount | HXT AMOUNT'); + vars['XHT AMOUNT'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountBefore =parseFloat(vars['XHT AMOUNT']); + console.log(' 4 | echo | ${USDT AMOUNT}, ${XHT AMOUNT}'); + console.log('${USDT AMOUNT}:'+vars['USDT AMOUNT']+ ';${XHT AMOUNT} : '+vars['XHT AMOUNT']); + console.log('USDT and XHT',String(XHTAmountBefore),typeof XHTAmountBefore,String(USDTAmountBefore),typeof USDTAmountBefore); + // 2 | storeValue | name=stop | TriggerPrice + vars['TriggerPrice'] = await driver.findElement(By.name('stop')).getAttribute('value'); + // 3 | echo | ${TriggerPrice} | + console.log('Stop is : '+vars['TriggerPrice']); + + // + console.log(' 9 | storeText | css=.d-flex:nth-child(1) > .text-price | USDT'); + vars['USDT'] = await driver.findElement(By.css('.d-flex:nth-child(1) > .text-price')).getText(); + let EstimatedPrice = parseFloat(vars['USDT']); + console.log('EstimatedPrice',String(EstimatedPrice),typeof EstimatedPrice ); + console.log(' 10 | echo | ${USDT} | '); + console.log(vars['USDT']); + // 6 | sendKeys | name=size | ${KEY_ENTER} | + await driver.findElement(By.name('size')).sendKeys(Key.ENTER); +await sleep(2000); // 8 | verifyText | css=.text-capitalize | Market Sell | assert(await driver.findElement(By.css('.text-capitalize')).getText() == 'Market Sell'); // 9 | assertText | css=.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2) | 1 XHT | assert(await driver.findElement(By.css('.notification-content-information > .d-flex:nth-child(2) > .f-1:nth-child(2)')).getText() == '1 XHT'); // 10 | click | css=.d-flex > .holla-button:nth-child(3) | | await driver.findElement(By.css('.d-flex > .holla-button:nth-child(3)')).click(); + hollaTime.Hollatimestampe(); + console.log('Timestamp : '+String(hollaTime.GetHollatimestampe())); + // + console.log(' 18 | storeText | css=.accordion_section:nth-child(1) .wallet_section-title-amount | USDTAFTER'); + vars['USDTAFTER'] = await driver.findElement(By.css('.accordion_section:nth-child(1) .wallet_section-title-amount')).getText(); + let USDTAmountAfter = parseFloat(vars['USDTAFTER']); + console.log(vars['USDTAFTER'],typeof USDTAmountAfter,String(USDTAmountAfter)); + //console.log(' 20 | click | css=.accordion_section:nth-child(2) > .accordion_section_title | '); + //await driver.findElement(By.css('.accordion_section:nth-child(2) > .accordion_section_title')).click(); + console.log(' 19 | storeText | css=.accordion_section--open > .wallet_section-title-amount | XHTAFTER'); + vars['XHTAFTER'] = await driver.findElement(By.css('.accordion_section:nth-child(2) .wallet_section-title-amount')).getText(); + let XHTAmountAfter = parseFloat(vars['XHTAFTER']); + console.log(' 20 echo | ${XHTAFTER} | '); + console.log(vars['XHTAFTER'],typeof XHTAmountAfter,String(XHTAmountAfter)); + console.log(vars['XHTAFTER']+' - '+vars['XHT AMOUNT'],String(XHTAmountBefore - XHTAmountAfter)); + console.log(vars['USDTAFTER']+' - '+vars['USDT AMOUNT'], String(USDTAmountBefore - USDTAmountAfter)); + + // + + await driver.get(website + 'transactions' ); + await driver.manage().window().maximize() ; + await sleep(10000); + //await driver.findElement(By.css(".trade_block-wrapper:nth-child(2) .action_notification-text")).click() + + // 2 | click | css=.table_body-row:nth-child(1) > td:nth-child(7) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(7)')).click(); + // 3 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(7) | timestamp + vars['timestamp'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(7)')).getText(); + // 4 | click | css=.table_body-row:nth-child(1) > .text-uppercase | + await driver.findElement(By.css('.table_body-row:nth-child(1) > .text-uppercase')).click(); + // 5 | storeText | css=.table_body-row:nth-child(1) > .text-uppercase | Pair + vars['Pair'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > .text-uppercase')).getText(); + // 6 | click | css=.table_body-row:nth-child(1) | + await driver.findElement(By.css('.table_body-row:nth-child(1)')).click(); + // 7 | storeText | css=.table_body-row:nth-child(1) .buy | side + //vars['side'] = await driver.findElement(By.css('.table_body-row:nth-child(1) .sell')).getText() + vars['side'] ='sell'; + // 8 | click | css=.table_body-row:nth-child(1) > td:nth-child(3) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(3)')).click(); + // 9 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(3) | size + vars['size'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(3)')).getText(); + // 10 | click | css=.table_body-row:nth-child(1) > td:nth-child(4) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(4)')).click(); + // 11 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(4) | price + vars['price'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(4)')).getText(); + // 12 | click | css=.table_body-row:nth-child(1) > td:nth-child(5) | + await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(5)')).click(); + // 13 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(5) | amount + vars['amount'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(5)')).getText(); + // 14 | click | css=.table_body-row:nth-child(1) | + await driver.findElement(By.css('.table_body-row:nth-child(1)')).click(); + // 15 | storeText | css=.table_body-row:nth-child(1) > td:nth-child(6) | fee + vars['fee'] = await driver.findElement(By.css('.table_body-row:nth-child(1) > td:nth-child(6)')).getText(); + // 16 | echo | ${Pair},${timestamp},${side},${size},${price},${amount},${fee}}} | + console.log(vars['Pair'],vars['timestamp'],vars['side'],vars['size'],vars['price'],vars['amount'],vars['fee']); + console.log(vars['timestamp']+' should be '+hollaTime.GetHollatimestampe()); + //expect(vars['timestamp']).to.equal(hollaTime.GetHollatimestampe()); + + await sleep(2000); + // 1 | open | /trade/xht-usdt | + await driver.get(website+'trade/xht-usdt'); + await sleep (5000); + // 2 | storeText | css=.display_table-cell:nth-child(1) > .f-1:nth-child(3) > .trade_history-row | LiveSaleTime + vars['LiveSaleTime'] = await driver.findElement(By.css('.display_table-cell:nth-child(1) > .f-1:nth-child(3) > .trade_history-row')).getText(); + // 3 | click | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | + await driver.findElement(By.css('.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)')).click(); + // 4 | storeText | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | ActivityOrderTime + vars['ActivityOrderTime'] = await driver.findElement(By.css('.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)')).getText(); + console.log(' Activity order time : '+vars['ActivityOrderTime']+'Live sale time : '+vars['LiveSaleTime'] ); + expect(vars['LiveSaleTime'] ).to.equal(hollaTime.getHollaTime()); + expect(vars['ActivityOrderTime']).to.equal(hollaTime.GetHollatimestampe()); }); diff --git a/test/Wallet/log.js b/test/Wallet/log.js new file mode 100644 index 0000000000..4375c8fdf9 --- /dev/null +++ b/test/Wallet/log.js @@ -0,0 +1,64 @@ +//import the selenium web driver +const { Builder, By, Key, until } = require('selenium-webdriver'); +var webdriver = require('selenium-webdriver'); + +var chromeCapabilities = webdriver.Capabilities.chrome(); +//setting chrome options to start the browser fully maximized +var chromeOptions = { + 'args': ['--disable-web-security", "--headless","--user-data-dir=true", "--allow-running-insecure-content'] +}; +chromeCapabilities.set('chromeOptions', chromeOptions); +var driver = new webdriver.Builder().withCapabilities(chromeCapabilities).build(); +function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +} +async function startt() { + await console.log('1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |'); + await driver.get('https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin'); + + console.log('2 | setWindowSize | 1050x660 | '); + await driver.manage().window().setRect(1050, 660); + + console.log('3 | type&Enter | id=identifierId | youremail@gmail.com'); + await driver.findElement(By.id('identifierId')).sendKeys('alicebitholla@gmail.com'); + await driver.findElement(By.id('identifierId')).sendKeys(Key.ENTER); + + console.log('4 | wait | name=password | Holla!'); + await driver.wait(until.elementsLocated(By.name('password'),30000,'wait', 5000)); + console.log('sleep well for 10'); + await sleep(5000); + + console.log('5 | type&Enter | id=password| your password!'); + await driver.findElement(By.name('password')).sendKeys('Holla2021!'); + await driver.findElement(By.name('password')).sendKeys(Key.ENTER); + + console.log('sleep well for 5'); + await sleep(5000); + + console.log('6 | click | linkText=Refresh | '); + await driver.findElement(By.linkText('Refresh')).click(); + await driver.findElement(By.css('h3:nth-child(4) font')).click(); + // 4 | click | css=.ts > b | + await driver.findElement(By.css('.ts > b')).click(); + // 5 | click | css=td:nth-child(2) > table > tbody:nth-child(1) > tr > td:nth-child(2) | + await driver.findElement(By.css('td:nth-child(2) > table > tbody:nth-child(1) > tr > td:nth-child(2)')).click(); + // 6 | assertText | css=h2 b | sandbox XHT Withdrawal Request + assert(await driver.findElement(By.css('h2 b')).getText() == 'sandbox XHT Withdrawal Request'); + // 7 | click | css=div:nth-child(4) button | + vars['windowHandles'] = await driver.getAllWindowHandles(); + // 8 | selectWindow | handle=${win4296} | + await driver.findElement(By.css('div:nth-child(4) button')).click(); + // 9 | click | css=.app-bar-account-content > div:nth-child(2) | + vars['win4296'] = await waitForWindow(2000); + // 10 | click | css=.withdrawal-confirm-warpper | + await driver.switchTo().window(vars['win4296']); + // 11 | click | css=.app-bar-account-content > div:nth-child(2) | + await driver.findElement(By.css('.app-bar-account-content > div:nth-child(2)')).click(); + // 12 | click | css=.app-bar-account-menu-list:nth-child(11) > .edit-wrapper__container:nth-child(3) | + await driver.findElement(By.css('.withdrawal-confirm-warpper')).click(); + await driver.findElement(By.css('.icon_title-text')).click(); + assert(await driver.findElement(By.css('.icon_title-text')).getText() == 'Success'); +}; +startt(); \ No newline at end of file diff --git a/test/Wallet/wallet.js b/test/Wallet/wallet.js index 5986974136..a0bd489453 100644 --- a/test/Wallet/wallet.js +++ b/test/Wallet/wallet.js @@ -2,16 +2,19 @@ //Using Selenium webderiver and Mocha/Chai //given, when and then const { Builder, By, Key, until } = require('selenium-webdriver'); +const defNewUser = require('./../Onboarding/newUser.js'); const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); const dotenv = require('dotenv'); const { addConsoleHandler } = require('selenium-webdriver/lib/logging'); dotenv.config(); -let bob = process.env.BOB; +//let bob = process.env.BOB; + +let userName = defNewUser.getNewUser(); let passWord = process.env.PASSWORD; let logInPage = process.env.LOGIN_PAGE; -let webSite = process.nextTick.WEBSITE; +let webSite = process.env.WEBSITE; describe('LogIn', function() { this.timeout(30000); let driver; @@ -30,14 +33,14 @@ describe('LogIn', function() { const title = await driver.getTitle(); console.log(title); expect(title).to.equal(title); - console.log('entring sand box'); + console.log('entring sand box/your weibste'); console.log(' Step # | action | target | value'); - console.log(' 1 | type | name=email | bob@gmail.com'); + console.log(' 1 | type | name=email |newuser@gmail.com'); await driver.wait(until.elementLocated(By.name('email')), 5000); - await driver.findElement(By.name('email')).sendKeys(bob); + await driver.findElement(By.name('email')).sendKeys(userName); - console.log(' 2 | type | name=password | Holla!'); + console.log(' 2 | type | name=password | password!'); await driver.wait(until.elementLocated(By.name('password')), 5000); await driver.findElement(By.name('password')).sendKeys(passWord); @@ -60,60 +63,64 @@ describe('LogIn', function() { }); it('ETH', async function() { - - await driver.get(webSite,'wallet'); + console.log('opping the wallet'); + await driver.get(webSite+'wallet'); await sleep(5000); await driver.findElement(By.name('search-assets')).click(); - // 3 | type | name=search-assets | USDT + console.log('6 | type | name=search-assets | USDT'); await driver.findElement(By.name('search-assets')).sendKeys('USDT'); - // 4 | sendKeys | name=search-assets | ${KEY_ENTER} + console.log('7 | sendKeys | name=search-assets | ${KEY_ENTER}'); await driver.findElement(By.name('search-assets')).sendKeys(Key.ENTER); - // 5 | click | css=.action-button-wrapper:nth-child(1) > .action_notification-text | + console.log('8 | click | css=.action-button-wrapper:nth-child(1) > .action_notification-text | '); await driver.findElement(By.css('.action-button-wrapper:nth-child(1) > .action_notification-text')).click(); - // 6 | click | css=.dropdown-placeholder | + console.log('9 | click | css=.dropdown-placeholder | '); await driver.findElement(By.css('.dropdown-placeholder')).click(); - // 7 | click | id=network-eth-0 | + console.log('10 | click | id=network-eth-0 |'); await driver.findElement(By.id('network-eth-0')).click(); - // 8 | click | css=.holla-button | + console.log(' 8 | click | css=.holla-button | '); await driver.findElement(By.css('.holla-button')).click(); - // 9 | click | css=.font-weight-bold | + console.log(' 9 | click | css=.font-weight-bold | '); await driver.findElement(By.css('.font-weight-bold')).click(); - // 10 | assertText | css=.font-weight-bold > .edit-wrapper__container | Generate USD Tether Wallet + console.log(' 10 | assertText | css=.font-weight-bold > .edit-wrapper__container | Generate USD Tether Wallet'); assert(await driver.findElement(By.css('.font-weight-bold > .edit-wrapper__container')).getText() == 'Generate USD Tether Wallet'); - // 11 | click | css=.holla-button:nth-child(3) | + console.log(' 11 | click | css=.holla-button:nth-child(3) | '); await driver.findElement(By.css('.holla-button:nth-child(3)')).click(); - // 12 | click | css=.dumb-field-wrapper .field-label-wrapper > .d-flex | + await sleep(5000); + console.log(' 12 | click | css=.dumb-field-wrapper .field-label-wrapper > .d-flex | '); await driver.findElement(By.css('.dumb-field-wrapper .field-label-wrapper > .d-flex')).click(); - // 13 | assertText | css=.dumb-field-wrapper .d-flex > .field-label | Your USD Tether receiving address + await sleep(5000); + console.log(' 13 | assertText | css=.dumb-field-wrapper .d-flex > .field-label | Your USD Tether receiving address'); assert(await driver.findElement(By.css('.dumb-field-wrapper .d-flex > .field-label')).getText() == 'Your USD Tether receiving address'); }); it('TRX', async function() { - await driver.get(webSite,'wallet'); + await driver.get(webSite+'wallet'); await sleep(5000); await driver.findElement(By.name('search-assets')).click(); - // 3 | type | name=search-assets | USDT + console.log(' 3 | type | name=search-assets | USDT'); await driver.findElement(By.name('search-assets')).sendKeys('USDT'); - // 4 | sendKeys | name=search-assets | ${KEY_ENTER} + console.log(' 4 | sendKeys | name=search-assets | ${KEY_ENTER}'); await driver.findElement(By.name('search-assets')).sendKeys(Key.ENTER); - // 5 | click | css=.action-button-wrapper:nth-child(1) > .action_notification-text | + console.log(' 5 | click | css=.action-button-wrapper:nth-child(1) > .action_notification-text | '); await driver.findElement(By.css('.action-button-wrapper:nth-child(1) > .action_notification-text')).click(); - // 6 | click | css=.dropdown-placeholder | + console.log(' 6 | click | css=.dropdown-placeholder | '); await driver.findElement(By.css('.dropdown-placeholder')).click(); - // 7 | click | id=network-eth-0 | + console.log(' 7 | click | id=network-eth-0 | '); await driver.findElement(By.id('network-trx-1')).click(); - // 8 | click | css=.holla-button | + console.log(' 8 | click | css=.holla-button | '); await driver.findElement(By.css('.holla-button')).click(); - // 9 | click | css=.font-weight-bold | + console.log(' 9 | click | css=.font-weight-bold | '); await driver.findElement(By.css('.font-weight-bold')).click(); - // 10 | assertText | css=.font-weight-bold > .edit-wrapper__container | Generate USD Tether Wallet + console.log(' 10 | assertText | css=.font-weight-bold > .edit-wrapper__container | Generate USD Tether Wallet'); assert(await driver.findElement(By.css('.font-weight-bold > .edit-wrapper__container')).getText() == 'Generate USD Tether Wallet'); - // 11 | click | css=.holla-button:nth-child(3) | + console.log(' 11 | click | css=.holla-button:nth-child(3) | '); + await sleep(5000); await driver.findElement(By.css('.holla-button:nth-child(3)')).click(); - // 12 | click | css=.dumb-field-wrapper .field-label-wrapper > .d-flex | + console.log(' 12 | click | css=.dumb-field-wrapper .field-label-wrapper > .d-flex | '); + await sleep(5000); await driver.findElement(By.css('.dumb-field-wrapper .field-label-wrapper > .d-flex')).click(); - // 13 | assertText | css=.dumb-field-wrapper .d-flex > .field-label | Your USD Tether receiving address + console.log(' 13 | assertText | css=.dumb-field-wrapper .d-flex > .field-label | Your USD Tether receiving address'); assert(await driver.findElement(By.css('.dumb-field-wrapper .d-flex > .field-label')).getText() == 'Your USD Tether receiving address'); }); }); diff --git a/test/package-lock.json b/test/package-lock.json index e4554b0c2a..7187b18a18 100644 --- a/test/package-lock.json +++ b/test/package-lock.json @@ -16,6 +16,7 @@ "package.json": "^2.0.1", "randomstring": "^1.2.1", "selenium-webdriver": "4.0.0-beta.3", + "time-stamp": "^2.2.0", "tokenize-file": "^0.1.7", "url-regex-safe": "^1.0.2" }, @@ -5488,6 +5489,14 @@ "node": ">=0.8" } }, + "node_modules/time-stamp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", + "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/timed-out": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", @@ -10298,6 +10307,11 @@ "yauzl": "2.7.0" } }, + "time-stamp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", + "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==" + }, "timed-out": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", diff --git a/test/package.json b/test/package.json index 393e08e271..923a30b998 100644 --- a/test/package.json +++ b/test/package.json @@ -17,6 +17,7 @@ "package.json": "^2.0.1", "randomstring": "^1.2.1", "selenium-webdriver": "4.0.0-beta.3", + "time-stamp": "^2.2.0", "tokenize-file": "^0.1.7", "url-regex-safe": "^1.0.2" }, diff --git a/test/scratch/NewUser b/test/scratch/NewUser index 1b97932287..e69de29bb2 100644 --- a/test/scratch/NewUser +++ b/test/scratch/NewUser @@ -1 +0,0 @@ -K4I5@testsae.com \ No newline at end of file diff --git a/test/scratch/Timestampe b/test/scratch/Timestampe new file mode 100644 index 0000000000..e69de29bb2 From 8b29ddabe97464124cc2b39fc24011114c26a7e9 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Sun, 4 Jul 2021 13:33:52 +0800 Subject: [PATCH 019/222] Roles testing is added --- test/Onboarding/LogIn.js | 4 +- test/Onboarding/LogOut.js | 4 +- test/Onboarding/ResendVerificationEmail.js | 5 +- test/Onboarding/ResetPassword.js | 4 +- test/Onboarding/Roles/communicator.js | 94 ++++++++++++++ test/Onboarding/Roles/kyc.js | 113 +++++++++++++++++ test/Onboarding/Roles/supervisor.js | 136 +++++++++++++++++++++ test/Onboarding/Roles/support.js | 105 ++++++++++++++++ test/Onboarding/SignUp.js | 4 +- test/Onboarding/newUser.js | 4 +- test/Trade/CancelOrders.js | 5 +- test/Trade/elems.js | 114 +++++++++++++++++ test/Trade/smartTrade.js | 15 ++- test/Trade/trade.js | 30 ++--- test/Trade/tradeWithStop.js | 4 +- test/Wallet/DW_flow.js | 4 +- test/Wallet/wallet.js | 4 +- test/scratch/NewUser | 1 + test/scratch/Timestampe | 1 + 19 files changed, 598 insertions(+), 53 deletions(-) create mode 100644 test/Onboarding/Roles/communicator.js create mode 100644 test/Onboarding/Roles/kyc.js create mode 100644 test/Onboarding/Roles/supervisor.js create mode 100644 test/Onboarding/Roles/support.js create mode 100644 test/Trade/elems.js diff --git a/test/Onboarding/LogIn.js b/test/Onboarding/LogIn.js index ac5146b61d..5b2671546f 100644 --- a/test/Onboarding/LogIn.js +++ b/test/Onboarding/LogIn.js @@ -4,8 +4,8 @@ const { Builder, By, until } = require('selenium-webdriver'); const { expect } = require('chai'); const { Console } = require('console'); -const dotenv = require('dotenv'); -dotenv.config(); +const path = require('path') +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) let userName = process.env.USER_NAME; let passWord = process.env.PASSWORD; let logInPage = process.env.LOGIN_PAGE; diff --git a/test/Onboarding/LogOut.js b/test/Onboarding/LogOut.js index 67a5fbfcda..f2313ad71e 100644 --- a/test/Onboarding/LogOut.js +++ b/test/Onboarding/LogOut.js @@ -5,8 +5,8 @@ const { Builder, By, Key, until } = require('selenium-webdriver'); const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); -const dotenv = require('dotenv'); -dotenv.config(); +const path = require('path') +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) let userName = process.env.USER_NAME; let passWord = process.env.PASSWORD; let logInPage = process.env.LOGIN_PAGE; diff --git a/test/Onboarding/ResendVerificationEmail.js b/test/Onboarding/ResendVerificationEmail.js index 01b2a8997a..fa428558fa 100644 --- a/test/Onboarding/ResendVerificationEmail.js +++ b/test/Onboarding/ResendVerificationEmail.js @@ -8,9 +8,8 @@ const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); var randomstring = require('randomstring'); -const dotenv = require('dotenv'); -dotenv.config(); - +const path = require('path') +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) let userName = defNewUser.getNewUser(); //let userName = process.env.USER_NAME; let passWord = process.env.PASSWORD; diff --git a/test/Onboarding/ResetPassword.js b/test/Onboarding/ResetPassword.js index 370387bd19..5dde133e66 100644 --- a/test/Onboarding/ResetPassword.js +++ b/test/Onboarding/ResetPassword.js @@ -7,8 +7,8 @@ const { Builder, By, until } = require('selenium-webdriver'); const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); -const dotenv = require('dotenv'); -dotenv.config(); +const path = require('path') +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) let userName = defNewUser.getNewUser(); //let userName = process.env.USER_NAME; diff --git a/test/Onboarding/Roles/communicator.js b/test/Onboarding/Roles/communicator.js new file mode 100644 index 0000000000..cf2d22e420 --- /dev/null +++ b/test/Onboarding/Roles/communicator.js @@ -0,0 +1,94 @@ +// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const path = require('path'); +require('dotenv').config({ path: path.resolve(__dirname, './../../.env') }); +let communicator = process.env.CUMMUNICATOR; +let password = process.env.PASSWORD; +let logInPage = process.env.LOGIN_PAGE; + +describe('communicator', function() { + this.timeout(3000000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + driver.manage().window().maximize(); + + }); + afterEach(async function() { + await driver.quit(); + }); + it('communicator', async function() { + console.log('Communicator can access to website direct editing for content management and communications'); + console.log(' Test name: communicator'); + console.log(' Step # | name | target | value'); + console.log(' 1 | open | /login | '); + await driver.get(logInPage); + await sleep(5000); + console.log(' 2 | type | name=email |'+communicator); + await driver.findElement(By.name('email')).sendKeys(communicator); + console.log(' 3 | type | name=password | password'); + await driver.findElement(By.name('password')).sendKeys(password); + console.log(' 4 | click | css=.holla-button | '); + await sleep(5000); + await driver.findElement(By.css('.holla-button')).click(); + await sleep(5000); + console.log(' 5 | click | css=a > .pl-1 | '); + await driver.findElement(By.css('a > .pl-1')).click(); + await sleep(5000); + console.log(' 6 | click | linkText=Users | '); + await driver.findElement(By.linkText('Users')).click(); + await sleep(5000); + console.log(' 7 | click | id=rc-tabs-0-tab-userVerification | '); + await driver.findElement(By.id('rc-tabs-0-tab-userVerification')).click(); + console.log(' 8 | click | css=.ant-empty-description | '); + await sleep(5000); + await driver.findElement(By.css('.ant-empty-description')).click(); + console.log(' 9 | assertText | css=.ant-empty-description | No Data'); + assert(await driver.findElement(By.css('.ant-empty-description')).getText() == 'No Data'); + console.log(' 10 | click | id=rc-tabs-0-tab-users | '); + await driver.findElement(By.id('rc-tabs-0-tab-users')).click(); + console.log(' 11 | assertText | xpath=//*[@id=\'rc-tabs-0-panel-users\']/div/div/div[2]/div/div/div/div/div/table/tbody/tr/td/div/p | No Data'); + await sleep(5000); + assert(await driver.findElement(By.xpath('//*[@id="rc-tabs-0-panel-users"]/div/div/div[2]/div/div/div/div/div/table/tbody/tr/td/div/p')).getText() == 'No Data'); + console.log(' 12 | click | linkText=Financials | '); + await driver.findElement(By.linkText('Financials')).click(); + console.log(' 13 | click | css=.content-wrapper | '); + await driver.findElement(By.css('.content-wrapper')).click(); + console.log(' 14 | assertText | css=p | -Access denied: User is not authorized to access this endpoint-'); + await sleep(5000); + assert(await driver.findElement(By.css('p')).getText() == '-Access denied: User is not authorized to access this endpoint-'); + console.log(' 15 | click | css=.ant-card-body > .ant-alert | '); + await driver.findElement(By.css('.ant-card-body > .ant-alert')).click(); + console.log(' 16 | assertText | css=.ant-card-body .ant-alert-description | Access denied: User is not authorized to access this endpoint'); + await sleep(5000); + assert(await driver.findElement(By.css('.ant-card-body .ant-alert-description')).getText() == 'Access denied: User is not authorized to access this endpoint'); + console.log(' 17 | click | id=rc-tabs-1-tab-assets | '); + await driver.findElement(By.id('rc-tabs-1-tab-assets')).click(); + console.log(' 18 | click | css=.content | '); + await driver.findElement(By.css('.content')).click(); + console.log(' 19 | assertText | css=.content | To view this page you must go back to Holla Dash'); + await sleep(5000); + assert(await driver.findElement(By.css('.content')).getText() == 'To view this page you must go back to Holla Dash'); + console.log(' 20 | click | id=rc-tabs-1-tab-deposits | '); + await driver.findElement(By.id('rc-tabs-1-tab-deposits')).click(); + console.log(' 21 | click | css=.ant-alert-closable | '); + await sleep(5000); + await driver.findElement(By.css('.ant-alert-closable')).click(); + console.log(' 22 | assertText | css=.ant-alert-closable > .ant-alert-message | Access denied: User is not authorized to access this endpoint'); + assert(await driver.findElement(By.css('.ant-alert-closable > .ant-alert-message')).getText() == 'Access denied: User is not authorized to access this endpoint'); + console.log(' 23 | click | id=rc-tabs-1-tab-withdrawals | '); + await driver.findElement(By.id('rc-tabs-1-tab-withdrawals')).click(); + await sleep(5000); + console.log(' 24 | click | css=#rc-tabs-1-panel-withdrawals .app-wrapper > .ant-alert | '); + await driver.findElement(By.css('#rc-tabs-1-panel-withdrawals .app-wrapper > .ant-alert')).click(); + console.log(' 25 | assertText | css=#rc-tabs-1-panel-withdrawals .app-wrapper > .ant-alert > .ant-alert-message | Access denied: User is not authorized to access this endpoint'); + assert(await driver.findElement(By.css('#rc-tabs-1-panel-withdrawals .app-wrapper > .ant-alert > .ant-alert-message')).getText() == 'Access denied: User is not authorized to access this endpoint'); + }); +}); diff --git a/test/Onboarding/Roles/kyc.js b/test/Onboarding/Roles/kyc.js new file mode 100644 index 0000000000..3c27792138 --- /dev/null +++ b/test/Onboarding/Roles/kyc.js @@ -0,0 +1,113 @@ +// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const path = require('path'); +require('dotenv').config({ path: path.resolve(__dirname, './../../.env') }); +let KYC = process.env.KYC; +let password = process.env.PASSWORD; +let logInPage = process.env.LOGIN_PAGE; + +describe('KYC', function() { + this.timeout(3000000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + driver.manage().window().maximize(); + vars = {}; + }); + afterEach(async function() { + await driver.quit(); + }); + it('KYC', async function() { + console.log(' KYC role can access some user data to review KYC requirements'); + console.log(' Test name: KYC'); + console.log(' Step # | name | target | value'); + console.log(' 1 | open | /login | '); + await driver.get(logInPage); + await sleep(5000); + console.log(' 2 | type | name=email |'+KYC); + await driver.findElement(By.name('email')).sendKeys(KYC); + console.log(' 3 | type | name=password | Password'); + await driver.findElement(By.name('password')).sendKeys(password); + console.log(' 4 | click | css=.holla-button | '); + await sleep(5000); + await driver.findElement(By.css('.holla-button')).click(); + await sleep(5000); + console.log(' 5 | click | css=a > .pl-1 | '); + await driver.findElement(By.css('a > .pl-1')).click(); + await sleep(5000); + console.log(' 6 | click | css=.role-section > div:nth-child(2) | '); + await driver.findElement(By.css('.role-section > div:nth-child(2)')).click(); + console.log(' 7 | assertText | css=.sub-label | KYC'); + assert(await driver.findElement(By.css('.sub-label')).getText() == 'KYC'); + console.log(' 8 | click | css=.active-side-menu | '); + await sleep(5000); + // await driver.findElement(By.css(".active-side-menu")).click() + await driver.findElement(By.linkText('Users')).click(); + console.log(' 9 | click | name=id | '); + await driver.findElement(By.name('id')).click(); + console.log(' 10 | type | name=id | 1'); + await driver.findElement(By.name('id')).sendKeys('1'); + console.log(' 11 | sendKeys | name=id | ${KEY_ENTER}'); + await driver.findElement(By.name('id')).sendKeys(Key.ENTER); + console.log(' 12 | click | css=.ant-btn | '); + await driver.findElement(By.css('.ant-btn')).click(); + console.log(' 13 | click | id=rc-tabs-8-tab-bank | '); + await sleep(5000); + await driver.findElement(By.id('rc-tabs-1-tab-bank')).click(); + console.log(' 14 | click | css=.ant-col:nth-child(1) .ant-card-head-wrapper | '); + await driver.findElement(By.css('.ant-col:nth-child(1) .ant-card-head-wrapper')).click(); + console.log(' 15 | | assertElementPresent | css=.ant-col:nth-child(1) .ant-card-head-title | |'); + { + const elements = await driver.findElements(By.css('.ant-col:nth-child(1) .ant-card-head-title')); + assert(elements.length); + } + + await sleep(5000); + await driver.findElement(By.linkText('Financials')).click(); + console.log(' 17 | runScript | window.scrollTo(0,0) | '); + await driver.executeScript('window.scrollTo(0,0)'); + console.log(' 18 | click | css=p | '); + await sleep(5000); + await driver.findElement(By.css('p')).click(); + console.log(' 19 | assertElementPresent | css=p | '); + { + const elements = await driver.findElements(By.css('p')); + assert(elements.length); + } + console.log(' 20 | click | css=.ant-card-body > .ant-alert | '); + await driver.findElement(By.css('.ant-card-body > .ant-alert')).click(); + console.log(' 21 | assertElementPresent | css=.ant-card-body .ant-alert-description | '); + { + const elements = await driver.findElements(By.css('.ant-card-body .ant-alert-description')); + assert(elements.length); + } + console.log(' 22 | click | id=rc-tabs-2-tab-assets | '); + await sleep(5000); + await driver.findElement(By.id('rc-tabs-2-tab-assets')).click(); + console.log(' 23 | click | css=.content | '); + await driver.findElement(By.css('.content')).click(); + console.log(' 24 | assertText | css=.content | To view this page you must go back to Holla Dash'); + assert(await driver.findElement(By.css('.content')).getText() == 'To view this page you must go back to Holla Dash'); + console.log(' 25 | click | css=.ant-tabs-tab:nth-child(3) | '); + await driver.findElement(By.css('.ant-tabs-tab:nth-child(3)')).click(); + console.log(' 26 | click | id =rc-tabs-2-tab-deposits | '); + await driver.findElement(By.id('rc-tabs-2-tab-deposits')).click(); + console.log(' 27 | assertText | css=.ant-alert-closable > .ant-alert-message | Access denied: User is not authorized to access this endpoint'); + await sleep(5000); + assert(await driver.findElement(By.css('.ant-alert-closable > .ant-alert-message')).getText() == 'Access denied: User is not authorized to access this endpoint'); + console.log(' 28 | click | id=rc-tabs-2-tab-withdrawals | '); + await driver.findElement(By.id('rc-tabs-2-tab-withdrawals')).click(); + console.log(' 29 | click | css=#rc-tabs-2-panel-withdrawals .app-wrapper | '); + await sleep(5000); + await driver.findElement(By.css('#rc-tabs-2-panel-withdrawals .app-wrapper')).click(); + console.log(' 30 | assertText | css=#rc-tabs-2-panel-withdrawals .app-wrapper > .ant-alert > .ant-alert-message | Access denied: User is not authorized to access this endpoint'); + assert(await driver.findElement(By.css('#rc-tabs-2-panel-withdrawals .app-wrapper > .ant-alert > .ant-alert-message')).getText() == 'Access denied: User is not authorized to access this endpoint'); + }); +}); diff --git a/test/Onboarding/Roles/supervisor.js b/test/Onboarding/Roles/supervisor.js new file mode 100644 index 0000000000..efecea812c --- /dev/null +++ b/test/Onboarding/Roles/supervisor.js @@ -0,0 +1,136 @@ +// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const path = require('path'); +require('dotenv').config({ path: path.resolve(__dirname, './../../.env') }); +let supervisor = process.env.SUPERVISOR; +let password = process.env.PASSWORD; +let logInPage = process.env.LOGIN_PAGE; + +describe('Supervisor', function() { + this.timeout(3000000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + driver.manage().window().maximize(); + vars = {}; + }); + afterEach(async function() { + await driver.quit(); + }); + it('Supervisor', async function() { + console.log('Supervisor can access all deposit, withdrawals and approval settings'); + console.log(' Test name: Supervisor'); + console.log(' Step # | name | target | value'); + console.log(' 1 | open | /login | '); + await driver.get(logInPage); + await sleep(5000); + console.log(' 2 | echo | \'Supervisor can access all deposit, withdrawals and approval settings\' |'); + console.log('\'Supervisor can access all deposit, withdrawals and approval settings\''); + console.log(' 3 | type | name=email |'+supervisor); + await driver.findElement(By.name('email')).sendKeys(supervisor); + console.log(' 4 | type | name=password | password'); + await driver.findElement(By.name('password')).sendKeys(password); + console.log(' 5 | click | css=.holla-button | '); + await sleep(5000); + await driver.findElement(By.css('.holla-button')).click(); + console.log(' 6 | click | css=a > .pl-1 | '); + await sleep(5000); + await driver.findElement(By.css('a > .pl-1')).click(); + console.log(' 7 | click | linkText=Users | '); + await sleep(5000); + await driver.findElement(By.linkText('Users')).click(); + console.log(' 8 | click | name=id | '); + await driver.findElement(By.name('id')).click(); + console.log(' 9 | type | name=id | 1'); + await driver.findElement(By.name('id')).sendKeys('1'); + console.log(' 10 | sendKeys | name=id | ${KEY_ENTER}'); + await driver.findElement(By.name('id')).sendKeys(Key.ENTER); + console.log(' 11 | click | css=.ant-btn | '); + await driver.findElement(By.css('.ant-btn')).click(); + console.log(' 12 | click | id=rc-tabs-1-tab-balance | '); + await sleep(5000); + await driver.findElement(By.id('rc-tabs-1-tab-balance')).click(); + console.log(' 13 | click | css=.ant-table-row:nth-child(1) > .ant-table-cell:nth-child(5) | '); + await sleep(5000); + await driver.findElement(By.css('.ant-table-row:nth-child(1) > .ant-table-cell:nth-child(5)')).click(); + console.log(' 14 | assertElementPresent | css=.ant-table-row:nth-child(1) > .ant-table-cell:nth-child(5) |'); + { + const elements = await driver.findElements(By.css('.ant-table-row:nth-child(1) > .ant-table-cell:nth-child(5)')); + assert(elements.length); + } + console.log(' 15 | assertElementPresent | css=.ant-table-row:nth-child(2) > .ant-table-cell:nth-child(5) | '); + { + const elements = await driver.findElements(By.css('.ant-table-row:nth-child(2) > .ant-table-cell:nth-child(5)')); + assert(elements.length); + } + console.log(' 16 | click | id=rc-tabs-1-tab-orders | '); + await driver.findElement(By.id('rc-tabs-1-tab-orders')).click(); + await sleep(5000); + console.log(' 17 | assertText | xpath=//*[@id=rc-tabs-3-panel-buy]/div/div/div/div/div/div/div/div/div/table/tbody/tr/td/div/p | No Data'); + assert(await driver.findElement(By.xpath('//*[@id="rc-tabs-3-panel-buy"]/div/div/div/div/div/div/div/div/div/table/tbody/tr/td/div/p')).getText() == 'No Data'); + console.log(' 18 | click | id=rc-tabs-3-tab-sell | '); + await driver.findElement(By.id('rc-tabs-3-tab-sell')).click(); + console.log(' 19 | assertText | xpath=//*[@id=rc-tabs-3-panel-sell]/div/div/div/div/div/div/div/div/div/table/tbody/tr/td/div/p | No Data'); + assert(await driver.findElement(By.xpath('//*[@id="rc-tabs-3-panel-sell"]/div/div/div/div/div/div/div/div/div/table/tbody/tr/td/div/p')).getText() == 'No Data'); + console.log(' 20 | click | id=rc-tabs-1-tab-trade | '); + await driver.findElement(By.id('rc-tabs-1-tab-trade')).click(); + console.log(' 21 | click | css=.ant-table-row:nth-child(1) > .ant-table-cell:nth-child(6) | '); + await sleep(5000); + await driver.findElement(By.css('.ant-table-row:nth-child(1) > .ant-table-cell:nth-child(6)')).click(); + console.log(' 22 | assertElementPresent | css=.ant-table-row:nth-child(1) > .ant-table-cell:nth-child(6) > time | '); + { + const elements = await driver.findElements(By.css('.ant-table-row:nth-child(1) > .ant-table-cell:nth-child(6) > time')); + assert(elements.length); + } + console.log(' 23 | click | id=rc-tabs-1-tab-deposits | '); + await driver.findElement(By.id('rc-tabs-1-tab-deposits')).click(); + console.log(' 24 | click | css=.app-wrapper:nth-child(2) .ant-table-row:nth-child(1) > .ant-table-cell:nth-child(5) | '); + await sleep(5000); + await driver.findElement(By.css('.app-wrapper:nth-child(2) .ant-table-row:nth-child(1) > .ant-table-cell:nth-child(5)')).click(); + console.log(' 25 | assertElementPresent | css=.app-wrapper:nth-child(2) .ant-table-row:nth-child(1) > .ant-table-cell:nth-child(5) | '); + { + const elements = await driver.findElements(By.css('.app-wrapper:nth-child(2) .ant-table-row:nth-child(1) > .ant-table-cell:nth-child(5)')); + assert(elements.length); + } + console.log(' 26 | click | id=rc-tabs-1-tab-withdrawals | '); + await driver.findElement(By.id('rc-tabs-1-tab-withdrawals')).click(); + console.log(' 27 | assertElementPresent | css=.app-wrapper:nth-child(2) .ant-table-row:nth-child(1) > .ant-table-cell:nth-child(5) | '); + { + const elements = await driver.findElements(By.css('.app-wrapper:nth-child(2) .ant-table-row:nth-child(1) > .ant-table-cell:nth-child(5)')); + assert(elements.length); + } + console.log(' 28 | click | linkText=Financials | '); + await driver.findElement(By.linkText('Financials')).click(); + console.log(' 31 | click | css=.app_container-content > .ant-alert | '); + await sleep(5000); + await driver.findElement(By.css('.app_container-content > .ant-alert')).click(); + console.log(' 32 | assertText | css=.app_container-content > .ant-alert > .ant-alert-description | Access denied: User is not authorized to access this endpoint'); + assert(await driver.findElement(By.css('.app_container-content > .ant-alert > .ant-alert-description')).getText() == 'Access denied: User is not authorized to access this endpoint'); + console.log(' 33 | click | css=.ant-card-body > .ant-alert | '); + await driver.findElement(By.css('.ant-card-body > .ant-alert')).click(); + console.log(' 34 | assertText | css=.ant-card-body .ant-alert-description | Access denied: User is not authorized to access this endpoint'); + assert(await driver.findElement(By.css('.ant-card-body .ant-alert-description')).getText() == 'Access denied: User is not authorized to access this endpoint'); + console.log(' 35 | click | id=rc-tabs-4-tab-assets | '); + await driver.findElement(By.id('rc-tabs-4-tab-assets')).click(); + console.log(' 36 | click | css=.content | '); + await driver.findElement(By.css('.content')).click(); + console.log(' 37 | assertText | css=.content | To view this page you must go back to Holla Dash'); + assert(await driver.findElement(By.css('.content')).getText() == 'To view this page you must go back to Holla Dash'); + console.log(' 38 | click | id=rc-tabs-4-tab-deposits | '); + await driver.findElement(By.id('rc-tabs-4-tab-deposits')).click(); + console.log(' 39 | click | css=.ant-table-row:nth-child(1) .d-flex | '); + await sleep(5000); + await driver.findElement(By.css('.ant-table-row:nth-child(1) .d-flex')).click(); + console.log(' 40 | assertText | css=.ant-table-row:nth-child(1) .d-flex | Validated'); + assert(await driver.findElement(By.css('.ant-table-row:nth-child(1) .d-flex')).getText() == 'Validated'); + console.log(' 41 | click | id=rc-tabs-4-tab-withdrawals | '); + await driver.findElement(By.id('rc-tabs-4-tab-withdrawals')).click(); + }); +}); diff --git a/test/Onboarding/Roles/support.js b/test/Onboarding/Roles/support.js new file mode 100644 index 0000000000..dd5c9c3c67 --- /dev/null +++ b/test/Onboarding/Roles/support.js @@ -0,0 +1,105 @@ +// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const path = require('path'); +require('dotenv').config({ path: path.resolve(__dirname, './../../.env') }); +let support = process.env.SUPPORT; +let password = process.env.PASSWORD; +let logInPage = process.env.LOGIN_PAGE; + +describe('support', function() { + this.timeout(300000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + driver.manage().window().maximize(); + vars = {}; + }); + afterEach(async function() { + await driver.quit(); + }); + it('support', async function() { + console.log('Support can access some user information for user verification'); + console.log('Test name: support'); + console.log('Step # | name | target | value'); + console.log('1 | open | /login | '); + await driver.get(logInPage); + console.log(' 2 | echo | \'Supervisor can access all deposit, withdrawals and approval settings\' |'); + await sleep(5000); + console.log(' 3 | type | name=email |'+support); + await driver.findElement(By.name('email')).sendKeys(support); + console.log(' 4 | type | name=password | password!'); + await driver.findElement(By.name('password')).sendKeys(password); + await sleep(5000); + console.log(' 5 | click | css=.holla-button | '); + await driver.findElement(By.css('.holla-button')).click(); + await sleep(5000); + + console.log('6 | click | css=a > .pl-1 | '); + await driver.findElement(By.css('a > .pl-1')).click(); + console.log('7 | click | css=.role-section > div:nth-child(2) | '); + await driver.findElement(By.css('.role-section > div:nth-child(2)')).click(); + console.log('8 | assertText | css=.sub-label | Support'); + assert(await driver.findElement(By.css('.sub-label')).getText() == 'Support'); + console.log('9 | click | linkText=Users | '); + await driver.findElement(By.linkText('Users')).click(); + console.log('10 | click | name=id | '); + await driver.findElement(By.name('id')).click(); + console.log('11 | type | name=id | 1'); + await driver.findElement(By.name('id')).sendKeys('1'); + console.log('12 | sendKeys | name=id | ${KEY_ENTER}'); + await driver.findElement(By.name('id')).sendKeys(Key.ENTER); + console.log('13 | click | css=.ant-btn | '); + await driver.findElement(By.css('.ant-btn')).click(); + console.log('14 | click | css=div:nth-child(2) > .ant-btn-sm > span | '); + await sleep(5000); + await driver.findElement(By.css('div:nth-child(2) > .ant-btn-sm > span')).click(); + console.log('15 | assertNotEditable | name=email | '); + { + const element = await driver.findElement(By.name('email')); + assert(!await element.isEnabled()); + } + console.log('16 | click | closing| '); + await sleep(5000); + await driver.findElement(By.xpath('/html/body/div[4]/div/div[2]/div/div[2]/button')).click(); + console.log('17 | click | linkText=Financials | '); + await driver.findElement(By.linkText('Financials')).click(); + console.log('18 | click | css=.app_container-content > .ant-alert | '); + await sleep(5000); + await driver.findElement(By.css('.app_container-content > .ant-alert')).click(); + console.log('19 | assertText | css=.app_container-content > .ant-alert > .ant-alert-description | Access denied: User is not authorized to access this endpoint'); + assert(await driver.findElement(By.css('.app_container-content > .ant-alert > .ant-alert-description')).getText() == 'Access denied: User is not authorized to access this endpoint'); + console.log('20 | click | css=.ant-card-body > .ant-alert | '); + await driver.findElement(By.css('.ant-card-body > .ant-alert')).click(); + console.log('21 | assertText | css=.ant-card-body .ant-alert-description | Access denied: User is not authorized to access this endpoint'); + assert(await driver.findElement(By.css('.ant-card-body .ant-alert-description')).getText() == 'Access denied: User is not authorized to access this endpoint'); + console.log('22 | click | css=#rc-tabs-3-panel-summary > .app_container-content | '); + await sleep(5000); + console.log('23 | click | id=rc-tabs-2-tab-assets | '); + await driver.findElement(By.id('rc-tabs-2-tab-assets')).click(); + console.log('24 | assertText | css=.content | To view this page you must go back to Holla Dash'); + assert(await driver.findElement(By.css('.content')).getText() == 'To view this page you must go back to Holla Dash'); + console.log('25 | click | id=rc-tabs-2-tab-deposits | '); + //await sleep(5000) + await driver.findElement(By.id('rc-tabs-2-tab-deposits')).click(); + console.log('26 | click | css=.ant-alert-closable | '); + // await driver.findElement(By.css(".ant-alert-closable")).click() + console.log('27 | assertText | css=.ant-alert-closable > .ant-alert-message | Access denied: User is not authorized to access this endpoint'); + await sleep(5000); + assert(await driver.findElement(By.css('.ant-alert-closable > .ant-alert-message')).getText() == 'Access denied: User is not authorized to access this endpoint'); + console.log('28 | click | id=rc-tabs-2-tab-withdrawals | '); + await driver.findElement(By.id('rc-tabs-2-tab-withdrawals')).click(); + console.log('29 | click | css=#rc-tabs-2-panel-withdrawals .app-wrapper > .ant-alert | '); + // await driver.findElement(By.css("#rc-tabs-2-panel-withdrawals .app-wrapper > .ant-alert")).click() + console.log('30 | assertText | css=.ant-alert-closable > .ant-alert-message | Access denied: User is not authorized to access this endpoint'); + await sleep(5000); + //*[@id="rc-tabs-2-panel-withdrawals"]/div/div/div/div[2]/span[2] + assert(await driver.findElement(By.xpath('//*[@id=\'rc-tabs-2-panel-withdrawals\']/div/div/div/div[2]/span[2]')).getText() == 'Access denied: User is not authorized to access this endpoint'); + }); +}); diff --git a/test/Onboarding/SignUp.js b/test/Onboarding/SignUp.js index b6fc67acf4..fc2085bf58 100644 --- a/test/Onboarding/SignUp.js +++ b/test/Onboarding/SignUp.js @@ -8,8 +8,8 @@ const { Builder, By, until } = require('selenium-webdriver'); const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); -const dotenv = require('dotenv'); -dotenv.config(); +const path = require('path') +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) let User = process.env.NEW_USER; let passWord = process.env.PASSWORD; let signUpPage = process.env.SIGN_UP_PAGE; diff --git a/test/Onboarding/newUser.js b/test/Onboarding/newUser.js index f6ee2721f7..1fc484c140 100644 --- a/test/Onboarding/newUser.js +++ b/test/Onboarding/newUser.js @@ -5,8 +5,8 @@ const { Builder, By, until } = require('selenium-webdriver'); const { expect } = require('chai'); const { Console } = require('console'); -const dotenv = require('dotenv'); -dotenv.config(); +const path = require('path') +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) const assert = require('assert'); let logInPage = process.env.LOGIN_PAGE; let emailPage =process.env.EMAIL_PAGE; diff --git a/test/Trade/CancelOrders.js b/test/Trade/CancelOrders.js index 7bc17bdc46..416a4a9fd9 100644 --- a/test/Trade/CancelOrders.js +++ b/test/Trade/CancelOrders.js @@ -5,9 +5,8 @@ const { Builder, By, Key, until } = require('selenium-webdriver'); const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); -const dotenv = require('dotenv'); -const { addConsoleHandler } = require('selenium-webdriver/lib/logging'); -dotenv.config(); +const path = require('path') +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) let userName = process.env.ADMIN_USER; let passWord = process.env.ADMIN_PASS; let logInPage = process.env.LOGIN_PAGE; diff --git a/test/Trade/elems.js b/test/Trade/elems.js new file mode 100644 index 0000000000..b0c6abbb97 --- /dev/null +++ b/test/Trade/elems.js @@ -0,0 +1,114 @@ + +// Generated by Selenium IDE +//testing the login function of Hollaex Kit +//Using Selenium webderiver and Mocha/Chai +//given, when and then +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const { expect } = require('chai'); +const { Console } = require('console'); +const path = require('path') +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) +let userName = process.env.ADMIN_USER; +let passWord = process.env.ADMIN_PASS; +let logInPage = process.env.LOGIN_PAGE; +describe('Orders', function() { + this.timeout(300000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + driver = await new Builder().forBrowser('chrome').build(); + vars = {}; + // Test name: Untitled + // Step # | name | target | value + // 1 | open | /account | + await driver.get(logInPage); + await sleep(10000); + // 2 | type | name=email | USER@bitholla.com + // await driver.wait(until.elementLocated(await driver.findElement(By.name("email"))), 5000); + await driver.findElement(By.name('email')).sendKeys(userName); + // 3 | type | name=password | bitholla@bitholla.com + //await driver.wait(until.elementLocated(await driver.findElement(By.name("password"))),5000); + await driver.findElement(By.name('password')).sendKeys(passWord); + // 4 | click | name=email | + + await sleep(4000); + await driver.findElement(By.name('email')).click(); + // 5 | click | css=.holla-button | + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.holla-button'))), 50000); + await driver.findElement(By.css('.holla-button')).click(); + await driver.manage().window().maximize(); + }); + afterEach(async function() { + // await driver.quit(); + }); + it('Untitled', async function() { + // Test name: Untitled + // Step # | name | target | value + // 1 | open | /login | + // await driver.get("https://sandbox.hollaex.com/login") + // // 2 | setWindowSize | 1280x680 | + // await driver.manage().window().setRect(1280, 680) + // // 3 | type | name=email | tech@bitholla.com + // await driver.findElement(By.name("email")).sendKeys("tech@bitholla.com") + // // 4 | type | name=password | bitHolla1 + // await driver.findElement(By.name("password")).sendKeys("bitHolla1") + // // 5 | click | name=email | + // await driver.findElement(By.name("email")).click() + // // 6 | click | name=password | + // await driver.findElement(By.name("password")).click() + // // 7 | click | css=.holla-button | + // await driver.findElement(By.css(".holla-button")).click() + // 8 | open | https://sandbox.hollaex.com/trade/xht-usdt | + await sleep(5000) + await driver.get("https://sandbox.hollaex.com/trade/xht-usdt") + // 9 | click | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | + await sleep(5000) + + let links = await driver.findElements(By.className("trade_block-content"))//('table_body-row')) + for(let link of links) { + text = await link.getText(); + console.log("objec :"+ String(link)) + console.log("this is text:"+text); + } + // await driver.findElement(By.css(".trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)")).click() + // // 10 | storeText | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | d1 + // vars["d1"] = await driver.findElement(By.css(".trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)")).getText() + // // 11 | click | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(2) > td:nth-child(4) | + // await driver.findElement(By.css(".trade_block-wrapper:nth-child(1) .table_body-row:nth-child(2) > td:nth-child(4)")).click() + // // 12 | storeText | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(2) > td:nth-child(4) | d2 + // vars["d2"] = await driver.findElement(By.css(".trade_block-wrapper:nth-child(1) .table_body-row:nth-child(2) > td:nth-child(4)")).getText() + // // // 13 | click | css=.table_body-row:nth-child(1) > .px-2 | + // await driver.findElement(By.css(".table_body-row:nth-child(1) > .px-2")).click() + // // 14 | click | css=.table_body-row:nth-child(2) > .px-2 | + // await driver.findElement(By.css(".table_body-row:nth-child(2) > .px-2")).click() + // // 15 | click | css=.price-row-wrapper:nth-child(4) .trade_orderbook-cell-price | + // await driver.findElement(By.css(".price-row-wrapper:nth-child(4) .trade_orderbook-cell-price")).click() + // // 16 | click | css=.price-row-wrapper:nth-child(3) .trade_orderbook-cell-price | + // await driver.findElement(By.css(".price-row-wrapper:nth-child(3) .trade_orderbook-cell-price")).click() + // // 17 | click | css=.fill-ask:nth-child(2) .trade_orderbook-cell-price | + // await driver.findElement(By.css(".fill-ask:nth-child(2) .trade_orderbook-cell-price")).click() + let linkss = await driver.findElements(By.className("trade-col_side_wrapper flex-column d-flex apply_rtl"))//('table_body-row')) + for(let link of linkss) { + text = await link.getText(); + console.log("objec :"+ String(link)) + console.log("this is text:"+text); + } + await sleep(10000) + + await driver.get("https://sandbox.hollaex.com/wallet") + let linksss = await driver.findElements(By.)//('table_body-row')) + console.log("wallet"+linksss+"n") + // let linkss = await driver.findElements(By.className("trade-col_side_wrapper flex-column d-flex apply_rtl"))//('table_body-row')) + for(let link of linksss) { + text = await link.getText(); + console.log("objec :"+ String(link)) + console.log("this is text:"+text); + } + }) +}) diff --git a/test/Trade/smartTrade.js b/test/Trade/smartTrade.js index 937c2d10b8..edaf908f93 100644 --- a/test/Trade/smartTrade.js +++ b/test/Trade/smartTrade.js @@ -3,10 +3,9 @@ const { Builder, By, Key, until } = require('selenium-webdriver'); const assert = require('assert'); const hollaTime = require('./time') const defNewUser = require('./../Onboarding/newUser.js'); -const dotenv = require('dotenv'); const { expect } = require('chai'); - -dotenv.config(); +const path = require('path') +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) let adminUser = process.env.ADMIN_USER; let passWord = process.env.ADMIN_PASS; let website = process.env.WEBSITE; @@ -75,7 +74,7 @@ describe('smartTrade', function() { vars['EstimatedPrice'] = await driver.findElement(By.css('.d-flex:nth-child(1) > .text-price')).getText(); let estimatedSize = parseInt(vars['EstimatedPrice'] ,10); while (estimatedSize < walletBalance) { - coinSize = coinSize+(walletBalance*0.1); + coinSize = coinSize+(10); await driver.findElement(By.name('size')).clear(); await driver.findElement(By.name('size')).sendKeys(String(coinSize)); @@ -86,10 +85,10 @@ describe('smartTrade', function() { estimatedSize = parseInt(vars['EstimatedPrice'] ,10); console.log('Wallet Balance: '+vars['Balance']); console.log('Estimated Price: '+vars['EstimatedPrice']); - { - const elements = await driver.findElements(By.css('.form-error')); - assert(!elements.length); - } + // { + // const elements = await driver.findElements(By.css('.form-error')); + // assert(!elements.length); + // } //console.log(' 21 | verifyNotText | css=.form-error | Insufficient balance'); // { // const text = await driver.findElement(By.css(".form-error")).getText() diff --git a/test/Trade/trade.js b/test/Trade/trade.js index c392a27c54..a370756fa4 100644 --- a/test/Trade/trade.js +++ b/test/Trade/trade.js @@ -3,19 +3,19 @@ //given, when and then const { Builder, By, Key, until } = require('selenium-webdriver'); const assert = require('assert'); +const testContext = require ('./../onboarding/Newuser') const { expect } = require('chai'); const { Console } = require('console'); -const dotenv = require('dotenv'); const hollaTime = require('./time'); const { addConsoleHandler } = require('selenium-webdriver/lib/logging'); -dotenv.config(); +const path = require('path') +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) let userName = process.env.ADMIN_USER; let passWord = process.env.ADMIN_PASS; let logInPage = process.env.LOGIN_PAGE; let website = process.env.WEBSITE; - describe('Trade', function() { this.timeout(300000); let driver; @@ -28,27 +28,11 @@ describe('Trade', function() { beforeEach(async function() { driver = await new Builder().forBrowser('chrome').build(); vars = {}; - // Test name: Untitled - // Step # | name | target | value - // 1 | open | /account | - await driver.get(logInPage); - await sleep(10000); - // 2 | type | name=email | USER@bitholla.com - // await driver.wait(until.elementLocated(await driver.findElement(By.name("email"))), 5000); - await driver.findElement(By.name('email')).sendKeys(userName); - // 3 | type | name=password | bitholla@bitholla.com - //await driver.wait(until.elementLocated(await driver.findElement(By.name("password"))),5000); - await driver.findElement(By.name('password')).sendKeys(passWord); - // 4 | click | name=email | - - await sleep(4000); - // await driver.findElement(By.name("email")).click(); - // // 5 | click | css=.holla-button | - await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.holla-button'))), 50000); - await driver.findElement(By.css('.holla-button')).click(); + await testContext.kitLogIn(driver, userName,passWord); + }); afterEach(async function() { - await driver.quit(); + //await driver.quit(); }); it('limit buy', async function() { @@ -165,7 +149,7 @@ describe('Trade', function() { console.log(vars['timestamp']+" should be "+hollaTime.GetHollatimestampe()); expect(vars['timestamp']).to.equal(hollaTime.GetHollatimestampe()); - await sleep(2000); + await sleep(2000); // 1 | open | /trade/xht-usdt | await driver.get(website+"trade/xht-usdt"); await sleep (5000); diff --git a/test/Trade/tradeWithStop.js b/test/Trade/tradeWithStop.js index 9c82031cc4..4198a6561d 100644 --- a/test/Trade/tradeWithStop.js +++ b/test/Trade/tradeWithStop.js @@ -5,10 +5,10 @@ const { Builder, By, Key, until } = require('selenium-webdriver'); const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); -const dotenv = require('dotenv'); const hollaTime = require('./time'); const { addConsoleHandler } = require('selenium-webdriver/lib/logging'); -dotenv.config(); +const path = require('path') +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) let userName = process.env.ADMIN_USER; let passWord = process.env.ADMIN_PASS; let logInPage = process.env.LOGIN_PAGE; diff --git a/test/Wallet/DW_flow.js b/test/Wallet/DW_flow.js index 3b55117db2..781ca72f24 100644 --- a/test/Wallet/DW_flow.js +++ b/test/Wallet/DW_flow.js @@ -5,9 +5,9 @@ const { Builder, By, Key, until } = require('selenium-webdriver'); const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); -const dotenv = require('dotenv'); const { addConsoleHandler } = require('selenium-webdriver/lib/logging'); -dotenv.config(); +const path = require('path') +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) let bob = process.env.BOB; let passWord = process.env.PASSWORD; let alice = process.env.ALICE; diff --git a/test/Wallet/wallet.js b/test/Wallet/wallet.js index a0bd489453..d7cc1b133b 100644 --- a/test/Wallet/wallet.js +++ b/test/Wallet/wallet.js @@ -6,9 +6,9 @@ const defNewUser = require('./../Onboarding/newUser.js'); const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); -const dotenv = require('dotenv'); const { addConsoleHandler } = require('selenium-webdriver/lib/logging'); -dotenv.config(); +const path = require('path') +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) //let bob = process.env.BOB; let userName = defNewUser.getNewUser(); diff --git a/test/scratch/NewUser b/test/scratch/NewUser index e69de29bb2..6c5046895a 100644 --- a/test/scratch/NewUser +++ b/test/scratch/NewUser @@ -0,0 +1 @@ +za02@testsae.com \ No newline at end of file diff --git a/test/scratch/Timestampe b/test/scratch/Timestampe index e69de29bb2..c7a60eb742 100644 --- a/test/scratch/Timestampe +++ b/test/scratch/Timestampe @@ -0,0 +1 @@ +2021/07/04 13:28:08 \ No newline at end of file From 545159641d8591391e963b6d670ec20fb9222560 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Tue, 20 Jul 2021 13:42:02 +0800 Subject: [PATCH 020/222] grid testing --- test/Onboarding/chatBox.js | 138 +++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 test/Onboarding/chatBox.js diff --git a/test/Onboarding/chatBox.js b/test/Onboarding/chatBox.js new file mode 100644 index 0000000000..49fc9a0454 --- /dev/null +++ b/test/Onboarding/chatBox.js @@ -0,0 +1,138 @@ + +// Generated by Selenium IDE +//testing the login function of Hollaex Kit +//Using Selenium webderiver and Mocha/Chai +//given, when and then +const { Builder, By, Key, until } = require('selenium-webdriver'); +const assert = require('assert'); +const { expect } = require('chai'); +const { Console } = require('console'); +const path = require('path') +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) +let userName = process.env.ADMIN_USER; +let passWord = process.env.ADMIN_PASS; +let logInPage = process.env.LOGIN_PAGE; +let Remot = process.env.SELENIUM_REMOTE_URL; +describe('Orders', function() { + this.timeout(300000); + let driver; + let vars; + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + beforeEach(async function() { + + }); + afterEach(async function() { + // await driver.quit(); + }); + + it('firefox', async function() { + // driver = await new Builder().forBrowser('chrome').build(); + driver = await new Builder().forBrowser('firefox').usingServer(Remot).build(); + + + //driver = await new RemoteWebDriver(new URL("https://3.37.238.142:4444/wd/hub"), capability); + + driver.manage().window().maximize(); + + vars = {}; + + // Test name: Untitled + // Step # | name | target | value + // 1 | open | /account | + await driver.get(logInPage); + await sleep(10000); + // 2 | type | name=email | USER@bitholla.com + // await driver.wait(until.elementLocated(await driver.findElement(By.name("email"))), 5000); + await driver.findElement(By.name('email')).sendKeys(userName); + // 3 | type | name=password | bitholla@bitholla.com + //await driver.wait(until.elementLocated(await driver.findElement(By.name("password"))),5000); + await driver.findElement(By.name('password')).sendKeys(passWord); + // 4 | click | name=email | + + await sleep(3000); + await driver.findElement(By.name('email')).click(); + // 5 | click | css=.holla-button | + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.holla-button'))), 50000); + await driver.findElement(By.css('.holla-button')).click(); + await sleep(10000) + { + const elements = await driver.findElements(By.xpath('/html/body/div[10]/div[1]/img')) + assert(elements.length) + } + }) + it('chrome', async function() { + // driver = await new Builder().forBrowser('chrome').build(); + driver = await new Builder().forBrowser('chrome').usingServer(Remot).build(); + + + //driver = await new RemoteWebDriver(new URL("https://3.37.238.142:4444/wd/hub"), capability); + + driver.manage().window().maximize(); + + vars = {}; + + // Test name: Untitled + // Step # | name | target | value + // 1 | open | /account | + await driver.get(logInPage); + await sleep(10000); + // 2 | type | name=email | USER@bitholla.com + // await driver.wait(until.elementLocated(await driver.findElement(By.name("email"))), 5000); + await driver.findElement(By.name('email')).sendKeys(userName); + // 3 | type | name=password | bitholla@bitholla.com + //await driver.wait(until.elementLocated(await driver.findElement(By.name("password"))),5000); + await driver.findElement(By.name('password')).sendKeys(passWord); + // 4 | click | name=email | + + await sleep(3000); + await driver.findElement(By.name('email')).click(); + // 5 | click | css=.holla-button | + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.holla-button'))), 50000); + await driver.findElement(By.css('.holla-button')).click(); + await sleep(10000) + //driver.takeScreenshot(); + { + const elements = await driver.findElements(By.xpath('/html/body/div[10]/div[1]/img')) + assert(elements.length) + } + }) + it('Edge', async function() { + // driver = await new Builder().forBrowser('chrome').build(); + driver = await new Builder().forBrowser('MicrosoftEdge').usingServer(Remot).build(); + + + //driver = await new RemoteWebDriver(new URL("https://3.37.238.142:4444/wd/hub"), capability); + + driver.manage().window().maximize(); + + vars = {}; + + // Test name: Untitled + // Step # | name | target | value + // 1 | open | /account | + await driver.get(logInPage); + await sleep(10000); + // 2 | type | name=email | USER@bitholla.com + // await driver.wait(until.elementLocated(await driver.findElement(By.name("email"))), 5000); + await driver.findElement(By.name('email')).sendKeys(userName); + // 3 | type | name=password | bitholla@bitholla.com + //await driver.wait(until.elementLocated(await driver.findElement(By.name("password"))),5000); + await driver.findElement(By.name('password')).sendKeys(passWord); + // 4 | click | name=email | + + await sleep(3000); + await driver.findElement(By.name('email')).click(); + // 5 | click | css=.holla-button | + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.holla-button'))), 50000); + await driver.findElement(By.css('.holla-button')).click(); + await sleep(10000) + { + const elements = await driver.findElements(By.xpath('/html/body/div[10]/div[1]/img')) + assert(elements.length) + } + }) +}) From 325816665873e64822d0d1f48b2c8a6a443162b4 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 14:15:05 +0900 Subject: [PATCH 021/222] add kit version to node --- server/init.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/init.js b/server/init.js index 367cb6a7f6..2daa5ab012 100644 --- a/server/init.js +++ b/server/init.js @@ -3,6 +3,7 @@ const { Network } = require('hollaex-node-lib'); const { all } = require('bluebird'); const rp = require('request-promise'); +const { version } = require('./package.json'); const { loggerInit } = require('./config/logger'); const { User, Status, Tier } = require('./db/models'); @@ -179,7 +180,8 @@ const checkStatus = () => { apiKey: status.api_key, apiSecret: status.api_secret, exchange_id: exchange.id, - activation_code: exchange.activation_code + activation_code: exchange.activation_code, + kit_version: version }); nodeLib = networkNodeLib; From 30582da85cd970b222fbae9577618e132d9f7180 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 14:15:37 +0900 Subject: [PATCH 022/222] get trades x forwarded for --- server/api/controllers/public.js | 7 ++++++- server/api/controllers/trade.js | 12 ++++++++++-- server/api/controllers/user.js | 4 +--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/server/api/controllers/public.js b/server/api/controllers/public.js index 1d7cb843cc..552f98de6e 100644 --- a/server/api/controllers/public.js +++ b/server/api/controllers/public.js @@ -132,7 +132,12 @@ const getTradesHistory = (req, res) => { order_by.value, order.value, start_date.value, - end_date.value + end_date.value, + { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + } ) .then((data) => { return res.json(data); diff --git a/server/api/controllers/trade.js b/server/api/controllers/trade.js index 1faad76857..eaf8c02eb2 100644 --- a/server/api/controllers/trade.js +++ b/server/api/controllers/trade.js @@ -44,9 +44,17 @@ const getAdminTrades = (req, res) => { let promiseQuery; if (user_id.value) { - promiseQuery = toolsLib.order.getAllUserTradesByKitId(user_id.value, symbol.value, limit.value, page.value, order_by.value, order.value, start_date.value, end_date.value, format.value); + promiseQuery = toolsLib.order.getAllUserTradesByKitId(user_id.value, symbol.value, limit.value, page.value, order_by.value, order.value, start_date.value, end_date.value, format.value, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }); } else { - promiseQuery = toolsLib.order.getAllTradesNetwork(symbol.value, limit.value, page.value, order_by.value, order.value, start_date.value, end_date.value, format.value); + promiseQuery = toolsLib.order.getAllTradesNetwork(symbol.value, limit.value, page.value, order_by.value, order.value, start_date.value, end_date.value, format.value, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }); } promiseQuery diff --git a/server/api/controllers/user.js b/server/api/controllers/user.js index f79ae6ef7d..b5b51de211 100644 --- a/server/api/controllers/user.js +++ b/server/api/controllers/user.js @@ -1,6 +1,5 @@ 'use strict'; -const { version } = require('../../package.json'); const { isEmail, isUUID } = require('validator'); const toolsLib = require('hollaex-tools-lib'); const { sendEmail } = require('../../mail'); @@ -108,8 +107,7 @@ const signUpUser = (req, res) => { return all([ toolsLib.user.createUserOnNetwork(email, { additionalHeaders: { - 'x-forwarded-for': req.headers['x-forwarded-for'], - 'kit-version': version + 'x-forwarded-for': req.headers['x-forwarded-for'] } }), user From 468baa77b5c3f7ef0138fd8bee7349cf86122f90 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 14:17:36 +0900 Subject: [PATCH 023/222] creat user crypto address additional headers --- server/api/controllers/user.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/user.js b/server/api/controllers/user.js index b5b51de211..8e373b9d5d 100644 --- a/server/api/controllers/user.js +++ b/server/api/controllers/user.js @@ -603,7 +603,10 @@ const createCryptoAddress = (req, res) => { } toolsLib.user.createUserCryptoAddressByKitId(id, crypto.value, { - network: network.value + network: network.value, + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } }) .then((data) => { return res.status(201).json(data); From 4c6eb37543032e5e50bfd1e8133a208098c446e9 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 14:20:58 +0900 Subject: [PATCH 024/222] performwithdrwal x forwarded for --- server/api/controllers/withdrawal.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/withdrawal.js b/server/api/controllers/withdrawal.js index 6fb1b0ddfa..195668ba8f 100644 --- a/server/api/controllers/withdrawal.js +++ b/server/api/controllers/withdrawal.js @@ -112,7 +112,12 @@ const performWithdrawal = (req, res) => { withdrawal.address, withdrawal.currency, withdrawal.amount, - { network: withdrawal.network } + { + network: withdrawal.network, + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + } ), withdrawal ]); From ae961949c55703bc3e74397515c7c5ca78b6243c Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 14:24:46 +0900 Subject: [PATCH 025/222] cancel withdrawal x forwarded for --- server/api/controllers/withdrawal.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/withdrawal.js b/server/api/controllers/withdrawal.js index 195668ba8f..98d6fb00b1 100644 --- a/server/api/controllers/withdrawal.js +++ b/server/api/controllers/withdrawal.js @@ -270,7 +270,11 @@ const cancelWithdrawal = (req, res) => { const userId = req.auth.sub.id; const id = req.swagger.params.id.value; - toolsLib.wallet.cancelUserWithdrawalByKitId(userId, id) + toolsLib.wallet.cancelUserWithdrawalByKitId(userId, id, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((withdrawal) => { return res.json(withdrawal); }) From d296cd2a6f2f51b73f86de7c7b2c310f987933b4 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 14:44:57 +0900 Subject: [PATCH 026/222] get deposit/withdrwal send wd email x forwarded for --- server/api/controllers/deposit.js | 14 ++++++++++++-- server/api/controllers/withdrawal.js | 17 ++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/server/api/controllers/deposit.js b/server/api/controllers/deposit.js index dd237f69ff..c59f77f327 100644 --- a/server/api/controllers/deposit.js +++ b/server/api/controllers/deposit.js @@ -46,7 +46,12 @@ const getAdminDeposits = (req, res) => { end_date.value, transaction_id.value, address.value, - format.value + format.value, + { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + } ) .then((data) => { if (format.value) { @@ -108,7 +113,12 @@ const getUserDeposits = (req, res) => { end_date.value, transaction_id.value, address.value, - format.value + format.value, + { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + } ) .then((data) => { if (format.value) { diff --git a/server/api/controllers/withdrawal.js b/server/api/controllers/withdrawal.js index 98d6fb00b1..eccbe6f9d1 100644 --- a/server/api/controllers/withdrawal.js +++ b/server/api/controllers/withdrawal.js @@ -65,7 +65,8 @@ const requestWithdrawal = (req, res) => { network, otpCode: otp_code, ip, - domain + domain, + 'x-forwarded-for': req.headers['x-forwarded-for'] }) .then(() => { return res.json({ message: 'Success' }); @@ -181,7 +182,12 @@ const getAdminWithdrawals = (req, res) => { end_date.value, transaction_id.value, address.value, - format.value + format.value, + { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + } ) .then((data) => { if (format.value) { @@ -243,7 +249,12 @@ const getUserWithdrawals = (req, res) => { end_date.value, transaction_id.value, address.value, - format.value + format.value, + { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + } ) .then((data) => { if (format.value) { From 4204e8639d23efa14d4a557de47b40e816c9a35e Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 14:46:16 +0900 Subject: [PATCH 027/222] get admin balance x forwarded for --- server/api/controllers/admin.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index c9bb7a4a53..05b4e45a79 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -314,7 +314,11 @@ const getAdminBalance = (req, res) => { req.auth ); - toolsLib.wallet.getKitBalance() + toolsLib.wallet.getKitBalance({ + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((balance) => { return res.json(balance); }) From 04d62c5e91ce1eb872097846ffbe0202a8dd50af Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 14:49:28 +0900 Subject: [PATCH 028/222] get user balance x forwarded for --- server/api/controllers/admin.js | 6 +++++- server/api/controllers/user.js | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index 05b4e45a79..6bcf67e948 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -260,7 +260,11 @@ const getAdminUserBalance = (req, res) => { ); const user_id = req.swagger.params.user_id.value; - toolsLib.wallet.getUserBalanceByKitId(user_id) + toolsLib.wallet.getUserBalanceByKitId(user_id, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((balance) => { return res.json(balance); }) diff --git a/server/api/controllers/user.js b/server/api/controllers/user.js index 8e373b9d5d..e235d6dc6a 100644 --- a/server/api/controllers/user.js +++ b/server/api/controllers/user.js @@ -542,7 +542,11 @@ const getUserBalance = (req, res) => { loggerUser.debug(req.uuid, 'controllers/user/getUserBalance auth', req.auth.sub); const user_id = req.auth.sub.id; - toolsLib.wallet.getUserBalanceByKitId(user_id) + toolsLib.wallet.getUserBalanceByKitId(user_id, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((balance) => { return res.json(balance); }) From 3e2b4e33532dfe07c4f9833e7ad00353b2ac2023 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 15:16:25 +0900 Subject: [PATCH 029/222] get user order x forwarded fro --- server/api/controllers/order.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/order.js b/server/api/controllers/order.js index 15c33da6ed..b49ddf65d4 100644 --- a/server/api/controllers/order.js +++ b/server/api/controllers/order.js @@ -58,7 +58,11 @@ const getUserOrder = (req, res) => { const user_id = req.auth.sub.id; const order_id = req.swagger.params.order_id.value; - toolsLib.order.getUserOrderByKitId(user_id, order_id) + toolsLib.order.getUserOrderByKitId(user_id, order_id, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((order) => { return res.json(order); }) From adb56b42ef83b2655a33abebaf0b467ddd168047 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 15:18:21 +0900 Subject: [PATCH 030/222] x forwarded for create order --- server/api/controllers/order.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/order.js b/server/api/controllers/order.js index b49ddf65d4..e559f6ee21 100644 --- a/server/api/controllers/order.js +++ b/server/api/controllers/order.js @@ -20,7 +20,9 @@ const createOrder = (req, res) => { const user_id = req.auth.sub.id; let order = req.swagger.params.order.value; - const opts = {}; + const opts = { + 'x-forwarded-for': req.headers['x-forwarded-for'] + }; if (isPlainObject(order.meta)) { opts.meta = order.meta; From dd83c2e7dcb0ac8e2055e4e6945d12fbfee0b4a1 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 15:19:52 +0900 Subject: [PATCH 031/222] cancel order x forwareded for --- server/api/controllers/order.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/server/api/controllers/order.js b/server/api/controllers/order.js index e559f6ee21..06da4b3338 100644 --- a/server/api/controllers/order.js +++ b/server/api/controllers/order.js @@ -84,7 +84,11 @@ const cancelUserOrder = (req, res) => { const user_id = req.auth.sub.id; const order_id = req.swagger.params.order_id.value; - toolsLib.order.cancelUserOrderByKitId(user_id, order_id) + toolsLib.order.cancelUserOrderByKitId(user_id, order_id, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((order) => { return res.json(order); }) @@ -187,7 +191,11 @@ const adminCancelOrder = (req, res) => { const userId = req.swagger.params.user_id.value; const orderId = req.swagger.params.order_id.value; - toolsLib.order.cancelUserOrderByKitId(userId, orderId) + toolsLib.order.cancelUserOrderByKitId(userId, orderId, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((data) => { return res.json(data); }) From 6af0bdbd4b1780ca468bb3b13f88eb9456cd9e19 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 15:22:15 +0900 Subject: [PATCH 032/222] get orders x forwarded fo --- server/api/controllers/order.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/server/api/controllers/order.js b/server/api/controllers/order.js index 06da4b3338..aaea8cf357 100644 --- a/server/api/controllers/order.js +++ b/server/api/controllers/order.js @@ -114,7 +114,12 @@ const getAllUserOrders = (req, res) => { order_by.value, order.value, start_date.value, - end_date.value + end_date.value, + { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + } ) .then((order) => { return res.json(order); @@ -158,7 +163,12 @@ const getAdminOrders = (req, res) => { order_by.value, order.value, start_date.value, - end_date.value + end_date.value, + { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + } ); } else { promiseQuery = toolsLib.order.getAllExchangeOrders( @@ -171,7 +181,12 @@ const getAdminOrders = (req, res) => { order_by.value, order.value, start_date.value, - end_date.value + end_date.value, + { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + } ); } From 134dd52b95236f40c180170f5b6e45fc81d6911b Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 15:23:51 +0900 Subject: [PATCH 033/222] cancel all orders x forwarded for --- server/api/controllers/order.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/order.js b/server/api/controllers/order.js index aaea8cf357..d4f0b74898 100644 --- a/server/api/controllers/order.js +++ b/server/api/controllers/order.js @@ -135,7 +135,11 @@ const cancelAllUserOrders = (req, res) => { const user_id = req.auth.sub.id; const symbol = req.swagger.params.symbol.value; - toolsLib.order.cancelAllUserOrdersByKitId(user_id, symbol) + toolsLib.order.cancelAllUserOrdersByKitId(user_id, symbol, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((order) => { return res.json(order); }) From b0217cdfd4fabd92479b3853f975192e0c4d76fe Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 15:25:26 +0900 Subject: [PATCH 034/222] get user stats x forwarded for --- server/api/controllers/user.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/user.js b/server/api/controllers/user.js index e235d6dc6a..b8c946c756 100644 --- a/server/api/controllers/user.js +++ b/server/api/controllers/user.js @@ -701,7 +701,11 @@ const getUserStats = (req, res) => { ); const user_id = req.auth.sub.id; - toolsLib.user.getUserStatsByKitId(user_id) + toolsLib.user.getUserStatsByKitId(user_id, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((stats) => { return res.json(stats); }) From 9b6ab544c63152f31be4f352e723bebcc47c0697 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 15:26:35 +0900 Subject: [PATCH 035/222] user check transaction x forwarded for --- server/api/controllers/user.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/user.js b/server/api/controllers/user.js index b8c946c756..fac226047d 100644 --- a/server/api/controllers/user.js +++ b/server/api/controllers/user.js @@ -730,7 +730,11 @@ const userCheckTransaction = (req, res) => { is_testnet } = req.swagger.params; - toolsLib.wallet.checkTransaction(currency.value, transaction_id.value, address.value, network.value, is_testnet.value) + toolsLib.wallet.checkTransaction(currency.value, transaction_id.value, address.value, network.value, is_testnet.value, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((transaction) => { return res.json({ message: 'Success', transaction }); }) From f1809b259c48bcb798c3b9f20a8dc28918d1ad11 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 15:28:00 +0900 Subject: [PATCH 036/222] transfer assets x forwarded for --- server/api/controllers/admin.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index 6bcf67e948..54bedaa493 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -556,7 +556,11 @@ const transferFund = (req, res) => { const data = req.swagger.params.data.value; - toolsLib.wallet.transferAssetByKitIds(data.sender_id, data.receiver_id, data.currency, data.amount, data.description, data.email) + toolsLib.wallet.transferAssetByKitIds(data.sender_id, data.receiver_id, data.currency, data.amount, data.description, data.email, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then(() => { return res.json({ message: 'Success' }); }) From feedec82bc1d0f242c4e1432dc8044e742783b8b Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 15:32:21 +0900 Subject: [PATCH 037/222] get public trades, OB x forwarded for --- server/api/controllers/public.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/server/api/controllers/public.js b/server/api/controllers/public.js index 552f98de6e..a338e41caa 100644 --- a/server/api/controllers/public.js +++ b/server/api/controllers/public.js @@ -57,7 +57,11 @@ const sendSupportEmail = (req, res) => { const getTopOrderbook = (req, res) => { const symbol = req.swagger.params.symbol.value; - toolsLib.getOrderbook(symbol) + toolsLib.getOrderbook(symbol, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((data) => { return res.json(data); }) @@ -72,7 +76,11 @@ const getTopOrderbook = (req, res) => { }; const getTopOrderbooks = (req, res) => { - toolsLib.getOrderbooks() + toolsLib.getOrderbooks({ + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((data) => { return res.json(data); }) @@ -98,7 +106,11 @@ const getTrades = (req, res) => { return res.status(400).json({ message: 'Invalid symbol' }); } - toolsLib.getPublicTrades(symbol) + toolsLib.getPublicTrades(symbol, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((data) => { return res.json(data); }) From 3ebae8b1668531b2e4a933cfa8a1bf5905fd4ac9 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 15:35:34 +0900 Subject: [PATCH 038/222] get chart x forwarded for --- server/api/controllers/public.js | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/server/api/controllers/public.js b/server/api/controllers/public.js index a338e41caa..117304b79f 100644 --- a/server/api/controllers/public.js +++ b/server/api/controllers/public.js @@ -208,7 +208,11 @@ const getChart = (req, res) => { return res.status(400).json({ message: 'Invalid symbol' }); } - toolsLib.getChart(from.value, to.value, symbol.value, resolution.value) + toolsLib.getChart(from.value, to.value, symbol.value, resolution.value, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((data) => { return res.json(data); }) @@ -225,7 +229,11 @@ const getChart = (req, res) => { const getCharts = (req, res) => { const { from, to, resolution } = req.swagger.params; - toolsLib.getCharts(from.value, to.value, resolution.value) + toolsLib.getCharts(from.value, to.value, resolution.value, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((data) => { return res.json(data); }) @@ -240,7 +248,11 @@ const getCharts = (req, res) => { }; const getConfig = (req, res) => { - toolsLib.getUdfConfig() + toolsLib.getUdfConfig({ + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((data) => { return res.json(data); }) @@ -266,7 +278,11 @@ const getHistory = (req, res) => { return res.status(400).json({ message: 'Invalid symbol' }); } - toolsLib.getUdfHistory(from.value, to.value, symbol.value, resolution.value) + toolsLib.getUdfHistory(from.value, to.value, symbol.value, resolution.value, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((data) => { return res.json(data); }) @@ -292,7 +308,11 @@ const getSymbols = (req, res) => { return res.status(400).json({ message: 'Invalid symbol' }); } - toolsLib.getUdfSymbols(symbol) + toolsLib.getUdfSymbols(symbol, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((data) => { return res.json(data); }) From 99d20ae640a624b95ceba9b83d5945c990215645 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 15:37:13 +0900 Subject: [PATCH 039/222] get ticker x forwarded for --- server/api/controllers/public.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/server/api/controllers/public.js b/server/api/controllers/public.js index 117304b79f..042a9a4ec0 100644 --- a/server/api/controllers/public.js +++ b/server/api/controllers/public.js @@ -167,7 +167,11 @@ const getTradesHistory = (req, res) => { const getTicker = (req, res) => { const symbol = req.swagger.params.symbol.value; - toolsLib.getTicker(symbol) + toolsLib.getTicker(symbol, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((data) => { return res.json(data); }) @@ -182,7 +186,11 @@ const getTicker = (req, res) => { }; const getAllTicker = (req, res) => { - toolsLib.getTickers() + toolsLib.getTickers({ + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((data) => { return res.json(data); }) From f6796e6c5cbff475896b000480b96c68b30a8f8d Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 15:41:38 +0900 Subject: [PATCH 040/222] mint/burn x forwarded for --- server/api/controllers/admin.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index 54bedaa493..ce57ee1b4d 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -763,7 +763,10 @@ const mintAsset = (req, res) => { description, transactionId: transaction_id, status, - email + email, + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } } ); }) @@ -831,7 +834,10 @@ const putMint = (req, res) => { waiting, updatedTransactionId: updated_transaction_id, email, - updatedDescription: updated_description + updatedDescription: updated_description, + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } }) .then((data) => { loggerAdmin.info( @@ -898,7 +904,10 @@ const burnAsset = (req, res) => { transactionId: transaction_id, status, email, - fee + fee, + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } } ); }) @@ -966,7 +975,10 @@ const putBurn = (req, res) => { waiting, updatedTransactionId: updated_transaction_id, email, - updatedDescription: updated_description + updatedDescription: updated_description, + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } }) .then((data) => { loggerAdmin.info( From 8d5392d25178b6378c6551a714c980a751baf4e1 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 15:42:56 +0900 Subject: [PATCH 041/222] get generated fees x forwarded for --- server/api/controllers/admin.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index ce57ee1b4d..6a387d7dab 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -680,7 +680,11 @@ const getExchangeGeneratedFees = (req, res) => { const { start_date, end_date } = req.swagger.params; - toolsLib.order.getGeneratedFees(start_date.value, end_date.value) + toolsLib.order.getGeneratedFees(start_date.value, end_date.value, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((data) => { return res.json(data); }) From 3c2eeafab0c6073a60d18062ba149300c44e007f Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 15:43:54 +0900 Subject: [PATCH 042/222] settle fees x forwarded for --- server/api/controllers/admin.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index 6a387d7dab..d789bfbcff 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -705,7 +705,11 @@ const settleFees = (req, res) => { req.auth ); - toolsLib.order.settleFees() + toolsLib.order.settleFees({ + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((data) => { return res.json(data); }) From 50054906ddf9339eb17e003821e4d894f212245f Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 15:45:35 +0900 Subject: [PATCH 043/222] get assets prices x forwarded for --- server/api/controllers/public.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/public.js b/server/api/controllers/public.js index 042a9a4ec0..6943351cb9 100644 --- a/server/api/controllers/public.js +++ b/server/api/controllers/public.js @@ -339,7 +339,11 @@ const getAssetsPrices = (req, res) => { loggerPublic.info(req.uuid, 'controllers/public/getAssetsPrices assets', assets.value, 'quote', quote.value, 'amount', amount.value); - toolsLib.getAssetsPrices(assets.value, quote.value, amount.value) + toolsLib.getAssetsPrices(assets.value, quote.value, amount.value, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((data) => { return res.json(data); }) From b16e7d0136d272583caa86490a058a26f2c98db4 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Wed, 21 Jul 2021 15:33:39 +0800 Subject: [PATCH 044/222] resetPassword updated --- test/Onboarding/ResetPassword.js | 73 ++++++++++++++------------------ 1 file changed, 32 insertions(+), 41 deletions(-) diff --git a/test/Onboarding/ResetPassword.js b/test/Onboarding/ResetPassword.js index 5dde133e66..97fdbc1430 100644 --- a/test/Onboarding/ResetPassword.js +++ b/test/Onboarding/ResetPassword.js @@ -37,30 +37,30 @@ describe('NewUserRequest', function() { afterEach(async function() { await driver.quit(); }); - // it('Rest Password', async function() { - // console.log('// Test name: Reset Password'); - // console.log(' Step # | name | target | value'); - // console.log(' 1 | open | https://sandbox.hollaex.com/reset-password | '); - // await driver.get(webSite+'reset-password'); - // console.log(' 2 | setWindowSize | 1050x660 | '); - // await driver.manage().window().setRect(1050, 660); - // console.log(' 3 | click | name=email | '); - // await sleep(5000); - // await driver.findElement(By.name('email')).click(); - // console.log(' 4 | type | name=email | bob@gmail.com'); - // await driver.findElement(By.name('email')).sendKeys(userName); - // console.log(' 5 | click | css=.holla-button | '); - // await sleep(5000); - // await driver.findElement(By.css('.holla-button')).click(); - // console.log(' 6 | click | css=.icon_title-wrapper | '); - // await sleep(5000); - // //console.log("await driver.findElement(By.css(".icon_title-wrapper")).click()"); - // console.log(' 7 | assertText | css=.icon_title-text | Password Reset Sent'); - // assert(await driver.findElement(By.css('.icon_title-text')).getText() == 'Password Reset Sent'); - // console.log(' 8 | click | css=.holla-button:nth-child(1) | '); - // driver.close(); - // await sleep(10000); - // }); + it('Rest Password', async function() { + console.log('// Test name: Reset Password'); + console.log(' Step # | name | target | value'); + console.log(' 1 | open | https://sandbox.hollaex.com/reset-password | '); + await driver.get(webSite+'reset-password'); + console.log(' 2 | setWindowSize | 1050x660 | '); + await driver.manage().window().setRect(1050, 660); + console.log(' 3 | click | name=email | '); + await sleep(5000); + await driver.findElement(By.name('email')).click(); + console.log(' 4 | type | name=email |'+userName); + await driver.findElement(By.name('email')).sendKeys(userName); + console.log(' 5 | click | css=.holla-button | '); + await sleep(5000); + await driver.findElement(By.css('.holla-button')).click(); + console.log(' 6 | click | css=.icon_title-wrapper | '); + await sleep(5000); + //console.log("await driver.findElement(By.css(".icon_title-wrapper")).click()"); + console.log(' 7 | assertText | css=.icon_title-text | Password Reset Sent'); + assert(await driver.findElement(By.css('.icon_title-text')).getText() == 'Password Reset Sent'); + console.log(' 8 | click | css=.holla-button:nth-child(1) | '); + driver.close(); + await sleep(10000); + }); it('Email Confirmation', async function() { console.log('Test name: Confirmation'); @@ -91,7 +91,7 @@ describe('NewUserRequest', function() { } console.log('16 | echo | ${mytextlink} | '); console.log(vars['mytextlink']); - console.log('link starts with'+ webSite+'reset-password'); + console.log('17 |link starts with'+ webSite+'reset-password'); console.log(webSite+'reset-password'); console.log('18 | open | ${mytextlink} | '); @@ -99,26 +99,17 @@ describe('NewUserRequest', function() { await console.log(completedLink); await driver.get(completedLink); console.log('19 | selectFrame | relative=parent | '); - await sleep(1000); - // await driver.switchTo().defaultContent(); - // console.log('20 | click | css=.icon_title-wrapper | '); - // await driver.findElement(By.css('.icon_title-wrapper')).click(); - // console.log('21 | assertNotText | css=.icon_title-text | Error'); - // { - // const text = await driver.findElement(By.css('.icon_title-text')).getText(); - // assert(text !== 'Error'); - // } - - console.log(' 9 | type | name=password | password!'); + await sleep(10000); + console.log(' 20 | type | name=password | password!'); await driver.findElement(By.name('password')).sendKeys(passWord); - console.log(' 10 | type | name=password_repeat | password'); + console.log(' 21 | type | name=password_repeat | password'); await driver.findElement(By.name('password_repeat')).sendKeys(passWord); await sleep(2000); - console.log(' 11 | click | css=.holla-button | '); + console.log(' 22 | click | css=.holla-button | '); await driver.findElement(By.css('.holla-button')).click(); await sleep(4000); - await driver.findElement(By.css(".icon_title-wrapper")).click() - console.log("12 | assertText | css=.icon_title-text | Success"); - assert(await driver.findElement(By.css(".icon_title-text")).getText() == "Success") + await driver.findElement(By.css('.icon_title-wrapper')).click() + console.log('23 | assertText | css=.icon_title-text | Success'); + assert(await driver.findElement(By.css('.icon_title-text')).getText() == 'Success') }); }); From 3a796b5285546a7d3b327077f1bedb277d5d03a7 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Wed, 21 Jul 2021 16:05:47 +0800 Subject: [PATCH 045/222] ResendVerificationEmail is updated --- test/Onboarding/ResendVerificationEmail.js | 53 ++++++++++++++++++++-- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/test/Onboarding/ResendVerificationEmail.js b/test/Onboarding/ResendVerificationEmail.js index fa428558fa..29dafe6c31 100644 --- a/test/Onboarding/ResendVerificationEmail.js +++ b/test/Onboarding/ResendVerificationEmail.js @@ -10,10 +10,13 @@ const { Console } = require('console'); var randomstring = require('randomstring'); const path = require('path') require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) -let userName = defNewUser.getNewUser(); +let User = process.env.NEW_USER; +const newUser = defNewUser.defineNewUser(User,4) ; +console.log(newUser); //let userName = process.env.USER_NAME; let passWord = process.env.PASSWORD; let webSite = process.env.WEBSITE; +let signUpPage = process.env.SIGN_UP_PAGE; let emailAdmin =process.env.Email_ADMIN_USERNAME; if (process.env.NODE_ENV == 'test') { console.log('Variables are defined'); @@ -43,10 +46,49 @@ describe('NewUserRequest', function() { vars = {}; }); afterEach(async function() { - // await driver.quit(); + await driver.quit(); + }); + it('NewUserRequestSignUp', async function() { + await sleep(5000) + console.log('Test name: NewUserRequest'); + console.log(' Step # | name | target | value'); + console.log('1 | open | ',signUpPage); + await driver.get(signUpPage); + const title = await driver.getTitle(); + console.log(title); + expect(title).to.equal(title); + console.log('entring sand box'); + console.log(' Step # | action | target | value'); + console.log('2 | setWindowSize | 1050x660 | '); + await driver.manage().window().setRect(1050, 660); + + console.log('3 | type | name=email |',newUser); + await driver.wait(until.elementLocated(By.name('email')), 5000); + await driver.findElement(By.name('email')).clear(); + await driver.findElement(By.name('email')).sendKeys(newUser); + + console.log('4 | type | name=password | password!'); + await driver.findElement(By.name('password')).clear(); + await driver.findElement(By.name('password')).sendKeys(passWord); + + + console.log('5 | type | name=password_repeat | your password again!'); + await driver.findElement(By.name('password_repeat')).clear(); + await driver.findElement(By.name('password_repeat')).sendKeys(passWord); + await sleep(2000); + console.log('6 | click | name=terms |'); + await driver.findElement(By.name('terms')).click(); + await sleep(10000); + console.log('7 | click | css=.holla-button |'); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.holla-button'))), 50000); + await driver.findElement(By.css('.holla-button')).click(); + await driver.executeScript('window.scrollTo(0,0)'); + + }); it('ResendRequest', async function() { + let reuserName = defNewUser.getNewUser(); console.log('Test name: NewUserRequest'); console.log(' Step # | name | target | value'); console.log('1 | open | https://yourwebsite/verify | '); @@ -58,9 +100,9 @@ describe('NewUserRequest', function() { console.log(' Step # | action | target | value'); console.log('2 | setWindowSize | 1050x660 | '); - console.log('1| type | name=email | bob@gmail.com'); + console.log('1| type | name=email |'+reuserName); await sleep(4000); - await driver.findElement(By.name('email')).sendKeys(userName); + await driver.findElement(By.name('email')).sendKeys(reuserName); console.log('2| click | css=.holla-button |'); await sleep(4000); await driver.findElement(By.css('.holla-button')).click(); @@ -70,6 +112,7 @@ describe('NewUserRequest', function() { }); it('Email Confirmation', async function() { + let reuserName = defNewUser.getNewUser(); console.log('Test name: Confirmation'); console.log('Step # | name | target | value'); await defNewUser.emailLogIn(driver,emailAdmin,passWord); @@ -89,7 +132,7 @@ describe('NewUserRequest', function() { console.log('13 | echo | ${content} | '); console.log(vars['content']); console.log('14 | assertText | xpath=/html/body/pre/a[22] | ${content}'); - expect(vars['content']).to.equal(userName.toLowerCase()); + expect(vars['content']).to.equal(reuserName.toLowerCase()); console.log('15 | storeAttribute | xpath=/html/body/pre/a[26]@href | mytextlink'); { From 57d5cb6b8a01c00cc36e9bb4114c02aae8d0b5c8 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Wed, 21 Jul 2021 16:33:29 +0800 Subject: [PATCH 046/222] communicatore.js updated --- test/Onboarding/Roles/communicator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Onboarding/Roles/communicator.js b/test/Onboarding/Roles/communicator.js index cf2d22e420..9e76b5fcd4 100644 --- a/test/Onboarding/Roles/communicator.js +++ b/test/Onboarding/Roles/communicator.js @@ -3,7 +3,7 @@ const { Builder, By, Key, until } = require('selenium-webdriver'); const assert = require('assert'); const path = require('path'); require('dotenv').config({ path: path.resolve(__dirname, './../../.env') }); -let communicator = process.env.CUMMUNICATOR; +let communicator = process.env.COMMUNICATOR; let password = process.env.PASSWORD; let logInPage = process.env.LOGIN_PAGE; From c47a05328131aced7b7bdc938b6248261c09d664 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 17:42:54 +0900 Subject: [PATCH 047/222] get user x forwarded for --- server/api/controllers/admin.js | 5 ++++- server/api/controllers/user.js | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index d789bfbcff..72a12a22c6 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -110,7 +110,10 @@ const getUsersAdmin = (req, res) => { order: order.value, start_date: start_date.value, end_date: end_date.value, - format: format.value + format: format.value, + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } }) .then((data) => { if (format.value) { diff --git a/server/api/controllers/user.js b/server/api/controllers/user.js index fac226047d..1a3bf61a7f 100644 --- a/server/api/controllers/user.js +++ b/server/api/controllers/user.js @@ -429,7 +429,11 @@ const getUser = (req, res) => { loggerUser.debug(req.uuid, 'controllers/user/getUser', req.auth.sub); const email = req.auth.sub.email; - toolsLib.user.getUserByEmail(email, true, true) + toolsLib.user.getUserByEmail(email, true, true, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((user) => { if (!user) { throw new Error(USER_NOT_FOUND); From 3932e14e3c9c722820f6183506cc59f741ba88ad Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Wed, 21 Jul 2021 17:48:00 +0900 Subject: [PATCH 048/222] invite operator x forwarded for --- server/api/controllers/admin.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index 72a12a22c6..6bb58656cf 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -660,7 +660,11 @@ const inviteNewOperator = (req, res) => { const invitingEmail = req.auth.sub.email; const { email, role } = req.swagger.params; - toolsLib.user.inviteExchangeOperator(invitingEmail, email.value, role.value) + toolsLib.user.inviteExchangeOperator(invitingEmail, email.value, role.value, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then(() => { return res.json({ message: 'Success' }); }) From 39348aa3768fcdaf3c59f616df5bc3e51d94ee93 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Wed, 21 Jul 2021 22:20:28 +0800 Subject: [PATCH 049/222] supervisor.js updated --- test/Onboarding/Roles/supervisor.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/Onboarding/Roles/supervisor.js b/test/Onboarding/Roles/supervisor.js index efecea812c..7ae94e6430 100644 --- a/test/Onboarding/Roles/supervisor.js +++ b/test/Onboarding/Roles/supervisor.js @@ -74,16 +74,17 @@ describe('Supervisor', function() { await driver.findElement(By.id('rc-tabs-1-tab-orders')).click(); await sleep(5000); console.log(' 17 | assertText | xpath=//*[@id=rc-tabs-3-panel-buy]/div/div/div/div/div/div/div/div/div/table/tbody/tr/td/div/p | No Data'); - assert(await driver.findElement(By.xpath('//*[@id="rc-tabs-3-panel-buy"]/div/div/div/div/div/div/div/div/div/table/tbody/tr/td/div/p')).getText() == 'No Data'); + // assert(await driver.findElement(By.xpath('//*[@id="rc-tabs-3-panel-buy"]/div/div/div/div/div/div/div/div/div/table/tbody/tr/td/div/p')).getText() == 'No Data'); console.log(' 18 | click | id=rc-tabs-3-tab-sell | '); await driver.findElement(By.id('rc-tabs-3-tab-sell')).click(); + await sleep(5000); console.log(' 19 | assertText | xpath=//*[@id=rc-tabs-3-panel-sell]/div/div/div/div/div/div/div/div/div/table/tbody/tr/td/div/p | No Data'); assert(await driver.findElement(By.xpath('//*[@id="rc-tabs-3-panel-sell"]/div/div/div/div/div/div/div/div/div/table/tbody/tr/td/div/p')).getText() == 'No Data'); console.log(' 20 | click | id=rc-tabs-1-tab-trade | '); await driver.findElement(By.id('rc-tabs-1-tab-trade')).click(); console.log(' 21 | click | css=.ant-table-row:nth-child(1) > .ant-table-cell:nth-child(6) | '); await sleep(5000); - await driver.findElement(By.css('.ant-table-row:nth-child(1) > .ant-table-cell:nth-child(6)')).click(); + // await driver.findElement(By.css('.ant-table-row:nth-child(1) > .ant-table-cell:nth-child(6)')).click(); console.log(' 22 | assertElementPresent | css=.ant-table-row:nth-child(1) > .ant-table-cell:nth-child(6) > time | '); { const elements = await driver.findElements(By.css('.ant-table-row:nth-child(1) > .ant-table-cell:nth-child(6) > time')); From f2f36f521c584c7428b91a99749261948f3de110 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Thu, 22 Jul 2021 12:15:56 +0900 Subject: [PATCH 050/222] get user trades x-forwarded-for --- server/api/controllers/trade.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/trade.js b/server/api/controllers/trade.js index eaf8c02eb2..ac4ef0098b 100644 --- a/server/api/controllers/trade.js +++ b/server/api/controllers/trade.js @@ -20,7 +20,11 @@ const getUserTrades = (req, res) => { return res.status(400).json({ message: 'Invalid symbol' }); } - toolsLib.order.getAllUserTradesByKitId(user_id, symbol, limit.value, page.value, order_by.value, order.value, start_date.value, end_date.value, format.value) + toolsLib.order.getAllUserTradesByKitId(user_id, symbol, limit.value, page.value, order_by.value, order.value, start_date.value, end_date.value, format.value, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((data) => { if (format.value) { res.setHeader('Content-disposition', `attachment; filename=${toolsLib.getKitConfig().api_name}-trades.csv`); From 3f9c96186c9b25e9a1b0dfef912fa5e9ae80b867 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Thu, 22 Jul 2021 11:30:07 +0800 Subject: [PATCH 051/222] DW_flow.js updated --- test/Wallet/DW_flow.js | 153 ++++++++++++++++++++++++++--------------- 1 file changed, 99 insertions(+), 54 deletions(-) diff --git a/test/Wallet/DW_flow.js b/test/Wallet/DW_flow.js index 781ca72f24..a2021e6cf2 100644 --- a/test/Wallet/DW_flow.js +++ b/test/Wallet/DW_flow.js @@ -6,15 +6,18 @@ const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); const { addConsoleHandler } = require('selenium-webdriver/lib/logging'); +const defNewUser = require ('./../onboarding/Newuser'); +const scrap = require('./../onboarding/scraper'); const path = require('path') require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) let bob = process.env.BOB; let passWord = process.env.PASSWORD; let alice = process.env.ALICE; let logInPage = process.env.LOGIN_PAGE; +let admin = process.env.Email_ADMIN_USERNAME; describe('Internal D/W Flow', function() { - this.timeout(30000); + this.timeout(300000); let driver; let vars; function sleep(ms) { @@ -36,7 +39,52 @@ describe('Internal D/W Flow', function() { vars = {}; }); afterEach(async function() { - // await driver.quit(); + await driver.quit(); + }); + it('BobLoginFirstTime', async function() { + console.log(' Test name: BobLogIn'); + await driver.get(logInPage); + await driver.sleep(5000); + const title = await driver.getTitle(); + console.log(title); + expect(title).to.equal(title); + console.log('entring sand box'); + console.log(' Step # | action | target | value'); + + console.log(' 1 | type | name=email | bob@gmail.com'); + await driver.wait(until.elementLocated(By.name('email')), 5000); + await driver.findElement(By.name('email')).sendKeys(bob); + + console.log(' 2 | type | name=password | Holla!'); + await driver.wait(until.elementLocated(By.name('password')), 5000); + await driver.findElement(By.name('password')).sendKeys(passWord); + + console.log(' 3 | click | css=.auth_wrapper | '); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.auth_wrapper'))), 5000); + await driver.findElement(By.css('.auth_wrapper')).click(); + console.log(' 4 | verifyElementPresent | css=.holla-button |'); + { + const elements = await driver.findElements(By.css('.holla-button')); + // assert(elements.length); + expect(elements.length); + } + + console.log(' 5 | click | css=.holla-button | '); + await driver.findElement(By.css('.holla-button')).click(); + await sleep(5000); + // 8 | click | css=.d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container | + await driver.findElement(By.css('.d-flex:nth-child(2) > .side-bar-txt > .edit-wrapper__container')).click(); + // 9 | click | name=search-assets | + await driver.findElement(By.name('search-assets')).click(); + // 10 | type | name=search-assets | hollaex + await driver.findElement(By.name('search-assets')).sendKeys('hollaex'); + // 11 | sendKeys | name=search-assets | ${KEY_ENTER} + await driver.findElement(By.name('search-assets')).sendKeys(Key.ENTER); + // 12 | click | css=.td-amount > .d-flex | + await driver.findElement(By.linkText('HollaEx')).click() + // 6 | storeText | css=.with_price-block_amount-value | before + vars['before'] = await driver.findElement(By.css('.with_price-block_amount-value')).getText() + console.log(vars['before']) }); it('From Alice to Bob', async function() { @@ -49,7 +97,7 @@ describe('Internal D/W Flow', function() { console.log('entring sand box'); console.log(' Step # | action | target | value'); - console.log(' 1 | type | name=email | alice@gmail.com'); + console.log(' 1 | type | name=email | alice'); await driver.wait(until.elementLocated(By.name('email')), 5000); await driver.findElement(By.name('email')).sendKeys(alice); @@ -83,14 +131,14 @@ describe('Internal D/W Flow', function() { await driver.findElement(By.css('.csv-action:nth-child(2) > .action_notification-text')).click(); // 16 | click | name=address | await driver.findElement(By.name('address')).click(); - // 17 | type | name=address | 0xef8a8e2053523fc989feb884f052726db5568ff6 - await driver.findElement(By.name('address')).sendKeys('0xef8a8e2053523fc989feb884f052726db5568ff6'); + // 17 | type | name=address | 0xe8a3b3a9d72b7b4d7e2f0ae33b23e36fcabfd88f + await driver.findElement(By.name('address')).sendKeys('0xe8a3b3a9d72b7b4d7e2f0ae33b23e36fcabfd88f'); // 18 | click | css=.with-notification .field-label-wrapper:nth-child(1) | await driver.findElement(By.css('.with-notification .field-label-wrapper:nth-child(1)')).click(); // 19 | click | name=amount | await driver.findElement(By.name('amount')).click(); // 20 | type | name=amount | 1 - await driver.findElement(By.name('amount')).sendKeys('1'); + await driver.findElement(By.name('amount')).sendKeys('0.0001'); // 21 | click | css=.holla-button | await driver.findElement(By.css('.holla-button')).click(); // 22 | click | css=.button-fail | @@ -109,54 +157,50 @@ describe('Internal D/W Flow', function() { await driver.findElement(By.css('.holla-button:nth-child(3)')).click(); }); - it('Gmailcheck', async function() { - console.log('1 | open | /ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin |'); - await driver.get('https://accounts.google.com/ServiceLogin/signinchooser?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fh%2Fwcro9khk6y0j%2F&ss=1&scc=1<mpl=default<mplcache=2&emr=1&osid=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin'); - - console.log('2 | setWindowSize | 1050x660 | '); - await driver.manage().window().setRect(1050, 660); - - console.log('3 | type&Enter | id=identifierId | youremail@gmail.com'); - await driver.findElement(By.id('identifierId')).sendKeys(alice); - await driver.findElement(By.id('identifierId')).sendKeys(Key.ENTER); - - console.log('4 | wait | name=password | Holla!'); - await driver.wait(until.elementsLocated(By.name('password'),30000,'wait', 5000)); - console.log('sleep well for 10'); - await sleep(5000); - - console.log('5 | type&Enter | id=password| your password!'); - await driver.findElement(By.name('password')).sendKeys('Holla!'); - await driver.findElement(By.name('password')).sendKeys(Key.ENTER); - - console.log('sleep well for 5'); + it('CheckMail', async function() { + console.log('Test name: Confirmation'); + console.log('Step # | name | target | value'); + await defNewUser.emailLogIn(driver,admin,passWord); + await driver.wait(until.elementIsEnabled(await driver.findElement(By.css('.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1)'))), 50000); + await driver.findElement(By.css('.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1)')).click(); + console.log('9 | doubleClick | css=.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1) | '); + { + const element = await driver.findElement(By.css('.x-grid3-row:nth-child(1) .subject:nth-child(1) > .grid_compact:nth-child(1)')); + await driver.actions({ bridge: true}).doubleClick(element).perform(); + } + console.log('10 | selectFrame | index=1 | '); + await driver.switchTo().frame(1); await sleep(5000); - - console.log('6 | click | linkText=Refresh | '); - await driver.findElement(By.linkText('Refresh')).click(); - await driver.findElement(By.css('h3:nth-child(4) font')).click(); - // 4 | click | css=.ts > b | - await driver.findElement(By.css('.ts > b')).click(); - // 5 | click | css=td:nth-child(2) > table > tbody:nth-child(1) > tr > td:nth-child(2) | - await driver.findElement(By.css('td:nth-child(2) > table > tbody:nth-child(1) > tr > td:nth-child(2)')).click(); - // 6 | assertText | css=h2 b | sandbox XHT Withdrawal Request - assert(await driver.findElement(By.css('h2 b')).getText() == 'sandbox XHT Withdrawal Request'); - // 7 | click | css=div:nth-child(4) button | - vars['windowHandles'] = await driver.getAllWindowHandles(); - // 8 | selectWindow | handle=${win4296} | - await driver.findElement(By.css('div:nth-child(4) button')).click(); - // 9 | click | css=.app-bar-account-content > div:nth-child(2) | - vars['win4296'] = await waitForWindow(2000); - // 10 | click | css=.withdrawal-confirm-warpper | - await driver.switchTo().window(vars['win4296']); - // 11 | click | css=.app-bar-account-content > div:nth-child(2) | - await driver.findElement(By.css('.app-bar-account-content > div:nth-child(2)')).click(); - // 12 | click | css=.app-bar-account-menu-list:nth-child(11) > .edit-wrapper__container:nth-child(3) | - await driver.findElement(By.css('.withdrawal-confirm-warpper')).click(); - await driver.findElement(By.css('.icon_title-text')).click(); + console.log('12 | storeText | xpath=/html/body/pre/a[22] | content'); + vars['content'] = await driver.findElement(By.xpath('/html/body/pre/a[22]')).getText(); + const emailCont = await driver.findElement(By.css('pre')).getText(); + console.log('13 | echo | ${content} | '); + console.log(vars['content']); + console.log('14 | assertText | xpath=/html/body/pre/a[22] | ${content}'); + expect(vars['content']).to.equal(alice.toLowerCase()); + + console.log('15 | storeAttribute | xpath=/html/body/pre/a[26]@href | mytextlink'); + { + const attribute = await driver.findElement(By.xpath('/html/body/pre/a[23]')).getAttribute('href'); + vars['mytextlink'] = attribute; + } + console.log('16 | echo | ${mytextlink} | '); + console.log(vars['mytextlink']); + console.log('17 | echo | \'xpath=/html/body/pre/a[23]\' | '); + console.log('\'xpath=/html/body/pre/a[23]\''); + console.log('18 | open | ${mytextlink} | '); + + const completedLink = await scrap.addRest(emailCont,vars['mytextlink']); + await console.log(completedLink); + await driver.get(completedLink); + await sleep(10000); + console.log('19 | click | css=.icon_title-wrapper | '); + await driver.findElement(By.css('.icon_title-wrapper')).click(); + console.log('20 | assertNotText | css=.icon_title-text | Error'); assert(await driver.findElement(By.css('.icon_title-text')).getText() == 'Success'); }); - it('BobLogin', async function() { + + it('BobLoginSecondTime', async function() { console.log(' Test name: BobLogIn'); await driver.get(logInPage); await driver.sleep(5000); @@ -196,8 +240,9 @@ describe('Internal D/W Flow', function() { // 11 | sendKeys | name=search-assets | ${KEY_ENTER} await driver.findElement(By.name('search-assets')).sendKeys(Key.ENTER); // 12 | click | css=.td-amount > .d-flex | - await driver.findElement(By.css('.td-amount > .d-flex')).click(); - // 13 | assertText | css=.mr-4 | 1 XHT - assert(await driver.findElement(By.css('.mr-4')).getText() == '1 XHT'); + await driver.findElement(By.linkText('HollaEx')).click() + // 6 | storeText | css=.with_price-block_amount-value | before + vars['after'] = await driver.findElement(By.css('.with_price-block_amount-value')).getText() + expect(parseFloat(vars['after'])- parseFloat(vars['before'])).to.equal(0.0001); }); }); \ No newline at end of file From 2d2690c6e695a834919f53e239949eeb3b6b153b Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Thu, 22 Jul 2021 12:33:59 +0900 Subject: [PATCH 052/222] request withdrawal fix --- server/api/controllers/withdrawal.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/withdrawal.js b/server/api/controllers/withdrawal.js index eccbe6f9d1..4a190de8f3 100644 --- a/server/api/controllers/withdrawal.js +++ b/server/api/controllers/withdrawal.js @@ -66,7 +66,9 @@ const requestWithdrawal = (req, res) => { otpCode: otp_code, ip, domain, - 'x-forwarded-for': req.headers['x-forwarded-for'] + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } }) .then(() => { return res.json({ message: 'Success' }); From 4b94ca3f528947f611cc6686a030816ebbd19317 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Thu, 22 Jul 2021 12:45:58 +0900 Subject: [PATCH 053/222] x-forwarded-for admin upload --- server/api/controllers/admin.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index 6bb58656cf..2b30f2891f 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -608,7 +608,11 @@ const uploadImage = (req, res) => { const name = req.swagger.params.name.value; const file = req.swagger.params.file.value; - toolsLib.storeImageOnNetwork(file, name) + toolsLib.storeImageOnNetwork(file, name, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) .then((result) => { return res.json(result); }) From 9b633e12ab234e8ef29f3e21c77274a9952f3afd Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Thu, 22 Jul 2021 12:52:35 +0900 Subject: [PATCH 054/222] admin signup x forwarded for --- server/api/controllers/admin.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index 2b30f2891f..5c87b335a2 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -59,7 +59,10 @@ const createInitialAdmin = (req, res) => { } return toolsLib.user.createUser(email, password, { role: 'admin', - id: 1 + id: 1, + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } }); }) .then(() => { From b4efbeecf36b40d31f1ea279df47290a548ad489 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Thu, 22 Jul 2021 13:15:44 +0900 Subject: [PATCH 055/222] create order x forwarded for added --- server/api/controllers/order.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/order.js b/server/api/controllers/order.js index d4f0b74898..4e3da67881 100644 --- a/server/api/controllers/order.js +++ b/server/api/controllers/order.js @@ -21,7 +21,9 @@ const createOrder = (req, res) => { let order = req.swagger.params.order.value; const opts = { - 'x-forwarded-for': req.headers['x-forwarded-for'] + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } }; if (isPlainObject(order.meta)) { From 4b9a9cc717fcd74c68765a46755747352981650e Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Thu, 22 Jul 2021 13:37:10 +0800 Subject: [PATCH 056/222] wallet updated for USDT blockchain --- test/Wallet/scratch/NewUser | 1 + test/Wallet/wallet.js | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 test/Wallet/scratch/NewUser diff --git a/test/Wallet/scratch/NewUser b/test/Wallet/scratch/NewUser new file mode 100644 index 0000000000..02ce3eb863 --- /dev/null +++ b/test/Wallet/scratch/NewUser @@ -0,0 +1 @@ +jgzn@testsae.com \ No newline at end of file diff --git a/test/Wallet/wallet.js b/test/Wallet/wallet.js index d7cc1b133b..3a6d752fde 100644 --- a/test/Wallet/wallet.js +++ b/test/Wallet/wallet.js @@ -2,20 +2,21 @@ //Using Selenium webderiver and Mocha/Chai //given, when and then const { Builder, By, Key, until } = require('selenium-webdriver'); -const defNewUser = require('./../Onboarding/newUser.js'); +const defNewUser = require ('./../Onboarding/newUser'); const assert = require('assert'); const { expect } = require('chai'); const { Console } = require('console'); const { addConsoleHandler } = require('selenium-webdriver/lib/logging'); const path = require('path') require('dotenv').config({ path: path.resolve(__dirname, '../.env') }) +const fs = require('fs'); //let bob = process.env.BOB; let userName = defNewUser.getNewUser(); let passWord = process.env.PASSWORD; let logInPage = process.env.LOGIN_PAGE; let webSite = process.env.WEBSITE; -describe('LogIn', function() { +describe('Wallet', function() { this.timeout(30000); let driver; let vars; @@ -27,7 +28,7 @@ describe('LogIn', function() { beforeEach(async function() { driver = await new Builder().forBrowser('chrome').build(); vars = {}; - console.log(' Test name: BobLogIn'); + console.log(' Test name: LogIn'); await driver.get(logInPage); await driver.sleep(5000); const title = await driver.getTitle(); @@ -36,7 +37,7 @@ describe('LogIn', function() { console.log('entring sand box/your weibste'); console.log(' Step # | action | target | value'); - console.log(' 1 | type | name=email |newuser@gmail.com'); + console.log(' 1 | type | name=email |'+userName); await driver.wait(until.elementLocated(By.name('email')), 5000); await driver.findElement(By.name('email')).sendKeys(userName); From 0e1c6ecc1d604fc374cab4b9e4d26d5aab3f782a Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Thu, 22 Jul 2021 15:10:17 +0900 Subject: [PATCH 057/222] set kit version based on db --- server/init.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/init.js b/server/init.js index 2daa5ab012..776f6d0d47 100644 --- a/server/init.js +++ b/server/init.js @@ -3,7 +3,6 @@ const { Network } = require('hollaex-node-lib'); const { all } = require('bluebird'); const rp = require('request-promise'); -const { version } = require('./package.json'); const { loggerInit } = require('./config/logger'); const { User, Status, Tier } = require('./db/models'); @@ -181,7 +180,7 @@ const checkStatus = () => { apiSecret: status.api_secret, exchange_id: exchange.id, activation_code: exchange.activation_code, - kit_version: version + kit_version: status.kit_version }); nodeLib = networkNodeLib; From ec36d497a413bc407a5a8f76878b9dcec0bad001 Mon Sep 17 00:00:00 2001 From: sahlabadi Date: Thu, 22 Jul 2021 15:19:43 +0800 Subject: [PATCH 058/222] trades are updated --- test/Trade/elems.js | 48 ++------------------------------------------- test/Trade/trade.js | 2 +- 2 files changed, 3 insertions(+), 47 deletions(-) diff --git a/test/Trade/elems.js b/test/Trade/elems.js index b0c6abbb97..02486d09eb 100644 --- a/test/Trade/elems.js +++ b/test/Trade/elems.js @@ -48,51 +48,7 @@ describe('Orders', function() { // await driver.quit(); }); it('Untitled', async function() { - // Test name: Untitled - // Step # | name | target | value - // 1 | open | /login | - // await driver.get("https://sandbox.hollaex.com/login") - // // 2 | setWindowSize | 1280x680 | - // await driver.manage().window().setRect(1280, 680) - // // 3 | type | name=email | tech@bitholla.com - // await driver.findElement(By.name("email")).sendKeys("tech@bitholla.com") - // // 4 | type | name=password | bitHolla1 - // await driver.findElement(By.name("password")).sendKeys("bitHolla1") - // // 5 | click | name=email | - // await driver.findElement(By.name("email")).click() - // // 6 | click | name=password | - // await driver.findElement(By.name("password")).click() - // // 7 | click | css=.holla-button | - // await driver.findElement(By.css(".holla-button")).click() - // 8 | open | https://sandbox.hollaex.com/trade/xht-usdt | - await sleep(5000) - await driver.get("https://sandbox.hollaex.com/trade/xht-usdt") - // 9 | click | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | - await sleep(5000) - - let links = await driver.findElements(By.className("trade_block-content"))//('table_body-row')) - for(let link of links) { - text = await link.getText(); - console.log("objec :"+ String(link)) - console.log("this is text:"+text); - } - // await driver.findElement(By.css(".trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)")).click() - // // 10 | storeText | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4) | d1 - // vars["d1"] = await driver.findElement(By.css(".trade_block-wrapper:nth-child(1) .table_body-row:nth-child(1) > td:nth-child(4)")).getText() - // // 11 | click | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(2) > td:nth-child(4) | - // await driver.findElement(By.css(".trade_block-wrapper:nth-child(1) .table_body-row:nth-child(2) > td:nth-child(4)")).click() - // // 12 | storeText | css=.trade_block-wrapper:nth-child(1) .table_body-row:nth-child(2) > td:nth-child(4) | d2 - // vars["d2"] = await driver.findElement(By.css(".trade_block-wrapper:nth-child(1) .table_body-row:nth-child(2) > td:nth-child(4)")).getText() - // // // 13 | click | css=.table_body-row:nth-child(1) > .px-2 | - // await driver.findElement(By.css(".table_body-row:nth-child(1) > .px-2")).click() - // // 14 | click | css=.table_body-row:nth-child(2) > .px-2 | - // await driver.findElement(By.css(".table_body-row:nth-child(2) > .px-2")).click() - // // 15 | click | css=.price-row-wrapper:nth-child(4) .trade_orderbook-cell-price | - // await driver.findElement(By.css(".price-row-wrapper:nth-child(4) .trade_orderbook-cell-price")).click() - // // 16 | click | css=.price-row-wrapper:nth-child(3) .trade_orderbook-cell-price | - // await driver.findElement(By.css(".price-row-wrapper:nth-child(3) .trade_orderbook-cell-price")).click() - // // 17 | click | css=.fill-ask:nth-child(2) .trade_orderbook-cell-price | - // await driver.findElement(By.css(".fill-ask:nth-child(2) .trade_orderbook-cell-price")).click() + let linkss = await driver.findElements(By.className("trade-col_side_wrapper flex-column d-flex apply_rtl"))//('table_body-row')) for(let link of linkss) { text = await link.getText(); @@ -102,7 +58,7 @@ describe('Orders', function() { await sleep(10000) await driver.get("https://sandbox.hollaex.com/wallet") - let linksss = await driver.findElements(By.)//('table_body-row')) + let linksss = await driver.findElements(By.id('table_body-row')) console.log("wallet"+linksss+"n") // let linkss = await driver.findElements(By.className("trade-col_side_wrapper flex-column d-flex apply_rtl"))//('table_body-row')) for(let link of linksss) { diff --git a/test/Trade/trade.js b/test/Trade/trade.js index a370756fa4..6c91888b57 100644 --- a/test/Trade/trade.js +++ b/test/Trade/trade.js @@ -32,7 +32,7 @@ describe('Trade', function() { }); afterEach(async function() { - //await driver.quit(); + await driver.quit(); }); it('limit buy', async function() { From 8c7b9e1370f394af3068ed34531ba656caf14d26 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Tue, 27 Jul 2021 17:41:40 +0900 Subject: [PATCH 059/222] dont send x forwarded for on request withdrawal --- server/api/controllers/withdrawal.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/server/api/controllers/withdrawal.js b/server/api/controllers/withdrawal.js index 4a190de8f3..e491edb8ba 100644 --- a/server/api/controllers/withdrawal.js +++ b/server/api/controllers/withdrawal.js @@ -65,10 +65,7 @@ const requestWithdrawal = (req, res) => { network, otpCode: otp_code, ip, - domain, - additionalHeaders: { - 'x-forwarded-for': req.headers['x-forwarded-for'] - } + domain }) .then(() => { return res.json({ message: 'Success' }); From 1128a9e7a465f0393f169bb0a4c87ad6efa9838b Mon Sep 17 00:00:00 2001 From: Hoan Ng Date: Mon, 2 Aug 2021 11:56:44 +0700 Subject: [PATCH 060/222] send email confirmation when request change password add confirm password API --- server/api/controllers/user.js | 61 +++++++++++++++++++++++++++------ server/api/swagger/swagger.yaml | 31 ++++++++++++++++- 2 files changed, 81 insertions(+), 11 deletions(-) diff --git a/server/api/controllers/user.js b/server/api/controllers/user.js index f79ae6ef7d..ffe5cce286 100644 --- a/server/api/controllers/user.js +++ b/server/api/controllers/user.js @@ -27,9 +27,10 @@ const { USER_EMAIL_IS_VERIFIED, INVALID_VERIFICATION_CODE } = require('../../messages'); -const { DEFAULT_ORDER_RISK_PERCENTAGE } = require('../../constants'); +const { DEFAULT_ORDER_RISK_PERCENTAGE, EVENTS_CHANNEL } = require('../../constants'); const { all } = require('bluebird'); const { isString } = require('lodash'); +const { publisher } = require('../../db/pubsub'); const INITIAL_SETTINGS = () => { return { notification: { @@ -115,7 +116,7 @@ const signUpUser = (req, res) => { user ]); }) - .then(([ networkUser, user ]) => { + .then(([networkUser, user]) => { return user.update( { network_id: networkUser.id }, { fields: ['network_id'], returning: true, transaction } @@ -129,7 +130,15 @@ const signUpUser = (req, res) => { user ]); }) - .then(([ verificationCode, user ]) => { + .then(([verificationCode, user]) => { + publisher.publish(EVENTS_CHANNEL, JSON.stringify({ + type: 'user', + data: { + action: 'signup', + user_id: user.id + } + })); + sendEmail( MAILTYPE.SIGNUP, email, @@ -232,7 +241,7 @@ const verifyUser = (req, res) => { user ]); }) - .then(([ verificationCode, user ]) => { + .then(([verificationCode, user]) => { if (verificationCode.verified) { throw new Error(USER_EMAIL_IS_VERIFIED); } @@ -249,7 +258,14 @@ const verifyUser = (req, res) => { ) ]); }) - .then(([ user ]) => { + .then(([user]) => { + publisher.publish(EVENTS_CHANNEL, JSON.stringify({ + type: 'user', + data: { + action: 'verify', + user_id: user.id + } + })); sendEmail( MAILTYPE.WELCOME, user.email, @@ -309,13 +325,13 @@ const loginPost = (req, res) => { toolsLib.security.validatePassword(user.password, password) ]); }) - .then(([ user, passwordIsValid ]) => { + .then(([user, passwordIsValid]) => { if (!passwordIsValid) { throw new Error(INVALID_CREDENTIALS); } if (!user.otp_enabled) { - return all([ user, toolsLib.security.checkCaptcha(captcha, ip) ]); + return all([user, toolsLib.security.checkCaptcha(captcha, ip)]); } else { return all([ user, @@ -329,7 +345,7 @@ const loginPost = (req, res) => { ]); } }) - .then(([ user ]) => { + .then(([user]) => { if (ip) { toolsLib.user.registerUserLogin(user.id, ip, { device, @@ -343,6 +359,15 @@ const loginPost = (req, res) => { time, device }; + + publisher.publish(EVENTS_CHANNEL, JSON.stringify({ + type: 'user', + data: { + action: 'login', + user_id: user.id + } + })); + if (!service) { sendEmail(MAILTYPE.LOGIN, email, data, {}, domain); } @@ -466,20 +491,35 @@ const changePassword = (req, res) => { loggerUser.debug(req.uuid, 'controllers/user/changePassword', req.auth.sub); const email = req.auth.sub.email; const { old_password, new_password } = req.swagger.params.data.value; + const ip = req.headers['x-real-ip']; + const domain = req.headers['x-real-origin']; + loggerUser.debug( req.uuid, 'controllers/user/changePassword', req.swagger.params.data.value ); - toolsLib.security.changeUserPassword(email, old_password, new_password) - .then(() => res.json({ message: 'Success' })) + toolsLib.security.changeUserPassword(email, old_password, new_password, ip, domain) + .then(() => res.json({ message: `Change password email confirmation sent to: ${email}` })) .catch((err) => { loggerUser.error(req.uuid, 'controllers/user/changePassword', err.message); return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); }); }; +const confirmChangePassword = (req, res) => { + const { code } = req.swagger.params.data.value; + const domain = req.headers['x-real-origin']; + + toolsLib.security.confirmChangeUserPassword(code, domain) + .then(() => res.json({ message: 'Password updated.' })) + .catch((err) => { + loggerUser.error(req.uuid, 'controllers/user/confirmChangeUserPassword', err.message); + return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); + }); +}; + const setUsername = (req, res) => { loggerUser.debug(req.uuid, 'controllers/user/setUsername auth', req.auth.sub); @@ -746,6 +786,7 @@ module.exports = { getUser, updateSettings, changePassword, + confirmChangePassword, setUsername, getUserLogins, affiliationCount, diff --git a/server/api/swagger/swagger.yaml b/server/api/swagger/swagger.yaml index 6916162038..fa0d79accd 100644 --- a/server/api/swagger/swagger.yaml +++ b/server/api/swagger/swagger.yaml @@ -297,6 +297,28 @@ paths: description: Error schema: $ref: "#/definitions/MessageResponse" + /confirm-change-password: + x-swagger-router-controller: user + post: + operationId: confirmChangePassword + description: Confirm a change password request + tags: + - Public + parameters: + - name: data + in: body + required: true + schema: + $ref: "#/definitions/ConfirmChangePassword" + responses: + 200: + description: Success + schema: + $ref: "#/definitions/MessageResponse" + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" /notification/deposit: x-swagger-router-controller: notification post: @@ -3586,6 +3608,13 @@ definitions: type: string code: type: string + ConfirmChangePassword: + type: object + required: + - code + properties: + code: + type: string OperatorResponse: type: object required: @@ -4689,4 +4718,4 @@ definitions: email: type: boolean updated_description: - type: string \ No newline at end of file + type: string From 639d10f36ea61ddec1a7fd270f91fc911caa8b13 Mon Sep 17 00:00:00 2001 From: Hoan Ng Date: Mon, 2 Aug 2021 11:56:53 +0700 Subject: [PATCH 061/222] update email strings and template --- server/mail/index.js | 2 + server/mail/strings/en.js | 25 +++++++++++ server/mail/strings/index.js | 2 + server/mail/templates/changePassword.js | 53 ++++++++++++++++++++++++ server/mail/templates/passwordChanged.js | 40 ++++++++++++++++++ 5 files changed, 122 insertions(+) create mode 100644 server/mail/templates/changePassword.js create mode 100644 server/mail/templates/passwordChanged.js diff --git a/server/mail/index.js b/server/mail/index.js index 1f5cc8f959..ea61337a3b 100644 --- a/server/mail/index.js +++ b/server/mail/index.js @@ -44,6 +44,8 @@ const sendEmail = ( } case MAILTYPE.SIGNUP: case MAILTYPE.RESET_PASSWORD: + case MAILTYPE.CHANGE_PASSWORD: + case MAILTYPE.PASSWORD_CHANGED: case MAILTYPE.USER_VERIFICATION_REJECT: case MAILTYPE.ACCOUNT_UPGRADE: case MAILTYPE.ACCOUNT_VERIFY: diff --git a/server/mail/strings/en.js b/server/mail/strings/en.js index 89f0eab2e4..0aef38cae2 100644 --- a/server/mail/strings/en.js +++ b/server/mail/strings/en.js @@ -91,6 +91,29 @@ const RESETPASSWORD = { CLOSING: COMMON.CLOSING }; +const CHANGEPASSWORD = { + TITLE: 'Change Password Confirmation', + GREETING: (name) => COMMON.GREETING(name), + BODY: { + 1: 'You have made a request to change the password for your account.', + 2: 'To confirm your password changed, click on the link below.', + 3: 'Confirm Change My Password', + 4: COMMON.ERROR_REQUEST, + 5: (ip) => COMMON.IP_REQUEST_FROM(ip) + }, + CLOSING: COMMON.CLOSING +}; + +const PASSWORDCHANGED = { + TITLE: 'Password Changed', + GREETING: (name) => COMMON.GREETING(name), + BODY: { + 1: 'This email confirms that you recently changed the password for your account. No further action is required.', + 2: 'If you did not authorize this change please contact us immediately.', + }, + CLOSING: COMMON.CLOSING +}; + const DEPOSIT = { TITLE: (currency) => `${currency.toUpperCase()} ${COMMON.DEPOSIT}`, GREETING: (name) => COMMON.GREETING(name), @@ -325,6 +348,8 @@ module.exports = { WELCOME, LOGIN, RESETPASSWORD, + CHANGEPASSWORD, + PASSWORDCHANGED, DEPOSIT, ACCOUNTVERIFY, ACCOUNTUPGRADE, diff --git a/server/mail/strings/index.js b/server/mail/strings/index.js index 68adf77320..5cf2715d6f 100644 --- a/server/mail/strings/index.js +++ b/server/mail/strings/index.js @@ -7,6 +7,8 @@ const MAILTYPE = { LOGIN: 'login', SIGNUP: 'signup', RESET_PASSWORD: 'resetPassword', + CHANGE_PASSWORD: 'changePassword', + PASSWORD_CHANGED: 'passwordChanged', USER_VERIFICATION_REJECT: 'userVerificationReject', ACCOUNT_UPGRADE: 'accountUpgrade', ACCOUNT_VERIFY: 'accountVerify', diff --git a/server/mail/templates/changePassword.js b/server/mail/templates/changePassword.js new file mode 100644 index 0000000000..364ad25ce3 --- /dev/null +++ b/server/mail/templates/changePassword.js @@ -0,0 +1,53 @@ +'use strict'; + +const { Button } = require('./helpers/common'); +const fetchMessage = (email, data, language, domain) => { + return { + html: html(email, data, language, domain), + text: text(email, data, language, domain) + }; +}; + +const html = (email, data, language, domain) => { + const link = `${domain}/change-password-confirm/${data.code}`; + const CHANGEPASSWORD = require('../strings').getStringObject(language, 'CHANGEPASSWORD'); + return ` +
+

+ ${CHANGEPASSWORD.GREETING(email)} +

+

+ ${CHANGEPASSWORD.BODY[1]}
+ ${CHANGEPASSWORD.BODY[2]}
+

+ ${Button(link, CHANGEPASSWORD.BODY[3])} +

+ ${CHANGEPASSWORD.BODY[4]} +

+

+ ${CHANGEPASSWORD.BODY[5](data.ip)} +

+

+ ${CHANGEPASSWORD.CLOSING[1]}
+ ${CHANGEPASSWORD.CLOSING[2]()} +

+
+ `; +}; + +const text = (email, data, language, domain) => { + const link = `${domain}/change-password-confirm/${data.code}`; + const CHANGEPASSWORD = require('../strings').getStringObject(language, 'CHANGEPASSWORD'); + return ` + ${CHANGEPASSWORD.GREETING(email)}. + ${CHANGEPASSWORD.BODY[1]} + ${CHANGEPASSWORD.BODY[2]} + ${CHANGEPASSWORD.BODY[3]}(${link}) + ${CHANGEPASSWORD.BODY[4]} + ${CHANGEPASSWORD.BODY[5](data.ip)} + ${CHANGEPASSWORD.CLOSING[1]} + ${CHANGEPASSWORD.CLOSING[2]()} + `; +}; + +module.exports = fetchMessage; diff --git a/server/mail/templates/passwordChanged.js b/server/mail/templates/passwordChanged.js new file mode 100644 index 0000000000..3da035ed0c --- /dev/null +++ b/server/mail/templates/passwordChanged.js @@ -0,0 +1,40 @@ +'use strict'; + +const fetchMessage = (email, data, language, domain) => { + return { + html: html(email, data, language, domain), + text: text(email, data, language, domain) + }; +}; + +const html = (email, data, language, domain) => { + const PASSWORDCHANGED = require('../strings').getStringObject(language, 'PASSWORDCHANGED'); + return ` +
+

+ ${PASSWORDCHANGED.GREETING(email)} +

+

+ ${PASSWORDCHANGED.BODY[1]}
+ ${PASSWORDCHANGED.BODY[2]}
+

+

+ ${PASSWORDCHANGED.CLOSING[1]}
+ ${PASSWORDCHANGED.CLOSING[2]()} +

+
+ `; +}; + +const text = (email, data, language, domain) => { + const PASSWORDCHANGED = require('../strings').getStringObject(language, 'PASSWORDCHANGED'); + return ` + ${PASSWORDCHANGED.GREETING(email)}. + ${PASSWORDCHANGED.BODY[1]} + ${PASSWORDCHANGED.BODY[2]} + ${PASSWORDCHANGED.CLOSING[1]} + ${PASSWORDCHANGED.CLOSING[2]()} + `; +}; + +module.exports = fetchMessage; From c1f6342748181aacc2aa10c5bac9dda3c0e96caf Mon Sep 17 00:00:00 2001 From: Hoan Ng Date: Mon, 2 Aug 2021 11:56:59 +0700 Subject: [PATCH 062/222] remove hash password on beforeUpdate hoook --- server/db/models/user.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/db/models/user.js b/server/db/models/user.js index 248defe9a7..b708ecf893 100644 --- a/server/db/models/user.js +++ b/server/db/models/user.js @@ -188,10 +188,10 @@ module.exports = function(sequelize, DataTypes) { if (user.email) { user.email = user.email.toLowerCase(); } - if (user._changed.password) - return generateHash(user.password).then((hash) => { - user.password = hash; - }); + // if (user._changed.password) + // return generateHash(user.password).then((hash) => { + // user.password = hash; + // }); }); User.associate = (models) => { From ee9c0f4fc30b41a2879729766dc6fefe96109f8f Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Mon, 2 Aug 2021 16:18:50 +0900 Subject: [PATCH 063/222] admin check transaction --- server/api/controllers/admin.js | 36 ++++++++++++++++++++++++- server/api/swagger/swagger.yaml | 47 +++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index 5c87b335a2..5260210666 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -1097,6 +1097,39 @@ const deleteKitUserMeta = (req, res) => { }); }; +const adminCheckTransaction = (req, res) => { + loggerAdmin.verbose( + req.uuid, + 'controllers/user/adminCheckTransaction auth', + req.auth + ); + + const { + currency, + transaction_id, + address, + network, + is_testnet + } = req.swagger.params; + + toolsLib.wallet.checkTransaction(currency.value, transaction_id.value, address.value, network.value, is_testnet.value, { + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) + .then((transaction) => { + return res.json({ message: 'Success', transaction }); + }) + .catch((err) => { + loggerAdmin.error( + req.uuid, + 'controllers/user/adminCheckTransaction catch', + err.message + ); + return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); + }); +}; + module.exports = { createInitialAdmin, getAdminKit, @@ -1130,5 +1163,6 @@ module.exports = { deleteKitUserMeta, postKitUserMeta, putKitUserMeta, - putUserMeta + putUserMeta, + adminCheckTransaction }; diff --git a/server/api/swagger/swagger.yaml b/server/api/swagger/swagger.yaml index 6916162038..11f9c74d9e 100644 --- a/server/api/swagger/swagger.yaml +++ b/server/api/swagger/swagger.yaml @@ -1298,6 +1298,53 @@ paths: - Bearer: [] x-security-scopes: - admin + /admin/check-transaction: + x-swagger-router-controller: admin + get: + operationId: adminCheckTransaction + description: Check a blockchain transaction to add create/update deposit + tags: + - Admin + parameters: + - in: query + name: currency + description: Currency of the transaction + required: true + type: string + - in: query + name: transaction_id + description: Blockchain transaction id + required: true + type: string + - in: query + name: address + description: crypto address receiving the deposit + required: true + type: string + - in: query + name: network + description: Blockchain network of transaction + required: true + type: string + - in: query + name: is_testnet + description: specify whether or not transaction was on tesntet + required: false + type: boolean + default: false + responses: + 200: + description: Success + schema: + $ref: "#/definitions/MessageResponse" + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" + security: + - Bearer: [] + x-security-scopes: + - admin /orders: x-swagger-router-controller: order get: From f92bccc89f416dfe4871657eebe0fd50a647150b Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Mon, 2 Aug 2021 16:30:33 +0900 Subject: [PATCH 064/222] upload image fix --- server/api/controllers/admin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index 5260210666..7bab3fe813 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -611,7 +611,7 @@ const uploadImage = (req, res) => { const name = req.swagger.params.name.value; const file = req.swagger.params.file.value; - toolsLib.storeImageOnNetwork(file, name, { + toolsLib.storeImageOnNetwork(file.buffer, name, { additionalHeaders: { 'x-forwarded-for': req.headers['x-forwarded-for'] } From 718f2d31ae1f9f1e3044ac980dacbe4dfd62cfb1 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Mon, 2 Aug 2021 16:32:45 +0900 Subject: [PATCH 065/222] add GET /network/constants --- server/api/controllers/public.js | 18 +++++++++++++++++- server/api/swagger/swagger.yaml | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/public.js b/server/api/controllers/public.js index 6943351cb9..aec0b7eedb 100644 --- a/server/api/controllers/public.js +++ b/server/api/controllers/public.js @@ -33,6 +33,21 @@ const getConstants = (req, res) => { } }; +const getNetworkConstants = (req, res) => { + toolsLib.getNetworkConstants({ + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) + .then((data) => { + return res.json(data); + }) + .catch((err) => { + loggerPublic.verbose('controller/public/getNetworkConstants', err.message); + return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); + }); +}; + const getKitConfigurations = (req, res) => { try { return res.json(toolsLib.getKitConfig()); @@ -373,5 +388,6 @@ module.exports = { getHistory, getSymbols, getAssetsPrices, - getTradesHistory + getTradesHistory, + getNetworkConstants }; diff --git a/server/api/swagger/swagger.yaml b/server/api/swagger/swagger.yaml index 11f9c74d9e..3cdc1bbfd5 100644 --- a/server/api/swagger/swagger.yaml +++ b/server/api/swagger/swagger.yaml @@ -59,6 +59,24 @@ paths: description: Error schema: $ref: "#/definitions/MessageResponse" + /network/constants: + x-swagger-router-controller: public + get: + get: + operationId: getNetworkConstants + description: Get network constants such as pairs and currencies + tags: + - Public + responses: + 200: + description: Success + schema: + type: object + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" + /network/constants: /kit: x-swagger-router-controller: public get: From 41cc458d9f4d565e129acf806f31213acf3fd95a Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Mon, 2 Aug 2021 16:37:21 +0900 Subject: [PATCH 066/222] GET /network/coins/all, GET /network/pairs/all --- server/api/controllers/public.js | 42 +++++++++++++++++++++++++++++++- server/api/swagger/swagger.yaml | 34 ++++++++++++++++++++++++-- 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/server/api/controllers/public.js b/server/api/controllers/public.js index aec0b7eedb..c559d09c0a 100644 --- a/server/api/controllers/public.js +++ b/server/api/controllers/public.js @@ -372,6 +372,44 @@ const getAssetsPrices = (req, res) => { }); }; +const getAllCoins = (req, res) => { + return toolsLib.coin.getNetworkCoins({ + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) + .then((data) => { + return res.json(data); + }) + .catch((err) => { + loggerPublic.error( + req.uuid, + 'controller/public/getAllCoins', + err.message + ); + return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); + }); +}; + +const getAllPairs = (req, res) => { + return toolsLib.pair.getNetworkPairs({ + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + }) + .then((data) => { + return res.json(data); + }) + .catch((err) => { + loggerPublic.error( + req.uuid, + 'controller/public/getAllPairs', + err.message + ); + return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); + }); +}; + module.exports = { getHealth, getConstants, @@ -389,5 +427,7 @@ module.exports = { getSymbols, getAssetsPrices, getTradesHistory, - getNetworkConstants + getNetworkConstants, + getAllCoins, + getAllPairs }; diff --git a/server/api/swagger/swagger.yaml b/server/api/swagger/swagger.yaml index 3cdc1bbfd5..d135cb69a0 100644 --- a/server/api/swagger/swagger.yaml +++ b/server/api/swagger/swagger.yaml @@ -62,7 +62,6 @@ paths: /network/constants: x-swagger-router-controller: public get: - get: operationId: getNetworkConstants description: Get network constants such as pairs and currencies tags: @@ -76,7 +75,38 @@ paths: description: Error schema: $ref: "#/definitions/MessageResponse" - /network/constants: + /network/coins/all: + x-swagger-router-controller: public + get: + description: View all coins on network + operationId: getAllCoins + tags: + - Public + responses: + 200: + description: Success + schema: + type: object + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" + /network/pairs/all: + x-swagger-router-controller: public + get: + description: View all pairs on network + operationId: getAllPairs + tags: + - Public + responses: + 200: + description: Success + schema: + type: object + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" /kit: x-swagger-router-controller: public get: From 9fffebd3a11691825327160116c08cad1a0da953 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Mon, 2 Aug 2021 17:20:01 +0900 Subject: [PATCH 067/222] update, create coin/pair --- server/api/controllers/admin.js | 370 +++++++++++++++++++++++++++++++- server/api/swagger/swagger.yaml | 254 +++++++++++++++++++++- 2 files changed, 620 insertions(+), 4 deletions(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index 7bab3fe813..fa7fa31843 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -1100,7 +1100,7 @@ const deleteKitUserMeta = (req, res) => { const adminCheckTransaction = (req, res) => { loggerAdmin.verbose( req.uuid, - 'controllers/user/adminCheckTransaction auth', + 'controllers/admin/adminCheckTransaction auth', req.auth ); @@ -1123,7 +1123,367 @@ const adminCheckTransaction = (req, res) => { .catch((err) => { loggerAdmin.error( req.uuid, - 'controllers/user/adminCheckTransaction catch', + 'controllers/admin/adminCheckTransaction catch', + err.message + ); + return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); + }); +}; + +const createPair = (req, res) => { + loggerAdmin.verbose( + req.uuid, + 'controllers/admin/createPair auth', + req.auth + ); + + const { + name, + pair_base, + pair_2, + code, + active, + min_size: minSize, + max_size: maxSize, + min_price: minPrice, + max_price: maxPrice, + increment_size: incrementSize, + increment_price: incrementPrice, + estimated_price: estimatedPrice, + is_public: isPublic + } = req.swagger.params.data.vaue; + + loggerAdmin.info( + req.uuid, + 'controllers/admin/createPair', + 'name:', + name, + 'pair_base:', + pair_base, + 'pair_2:', + pair_2, + 'code:', + code, + 'active:', + active, + 'min_size:', + minSize, + 'max_size:', + maxSize, + 'min_price:', + minPrice, + 'max_price:', + maxPrice, + 'increment_size:', + incrementSize, + 'increment_price:', + incrementPrice, + 'estimated_price:', + estimatedPrice, + 'is_public:', + isPublic + ); + + toolsLib.pair.createPair( + name, + pair_base, + pair_2, + { + code, + active, + minSize, + maxSize, + minPrice, + maxPrice, + incrementSize, + incrementPrice, + estimatedPrice, + isPublic, + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + } + ) + .then((data) => { + return res.json(data); + }) + .catch((err) => { + loggerAdmin.error( + req.uuid, + 'controllers/admin/createPair catch', + err.message + ); + return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); + }); +}; + +const updatePair = (req, res) => { + loggerAdmin.verbose( + req.uuid, + 'controllers/admin/updatePair auth', + req.auth + ); + + const { + name, + pair_base, + pair_2, + code, + active, + min_size: minSize, + max_size: maxSize, + min_price: minPrice, + max_price: maxPrice, + increment_size: incrementSize, + increment_price: incrementPrice, + estimated_price: estimatedPrice, + is_public: isPublic + } = req.swagger.params.data.vaue; + + loggerAdmin.info( + req.uuid, + 'controllers/admin/updatePair', + 'name:', + name, + 'pair_base:', + pair_base, + 'pair_2:', + pair_2, + 'code:', + code, + 'active:', + active, + 'min_size:', + minSize, + 'max_size:', + maxSize, + 'min_price:', + minPrice, + 'max_price:', + maxPrice, + 'increment_size:', + incrementSize, + 'increment_price:', + incrementPrice, + 'estimated_price:', + estimatedPrice, + 'is_public:', + isPublic + ); + + toolsLib.pair.updatePair( + name, + pair_base, + pair_2, + { + code, + active, + minSize, + maxSize, + minPrice, + maxPrice, + incrementSize, + incrementPrice, + estimatedPrice, + isPublic, + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + } + ) + .then((data) => { + return res.json(data); + }) + .catch((err) => { + loggerAdmin.error( + req.uuid, + 'controllers/admin/updatePair catch', + err.message + ); + return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); + }); +}; + +const createCoin = (req, res) => { + loggerAdmin.verbose( + req.uuid, + 'controllers/admin/createCoin auth', + req.auth + ); + + const { + symbol, + fullname, + code, + withdrawal_fee: withdrawalFee, + min, + max, + increment_unit: incrementUnit, + logo, + meta, + estimated_price: estimatedPrice, + type, + network, + standard, + allow_deposit: allowDeposit, + allow_withdrawal: allowWithdrawal + } = req.swagger.params.data.vaue; + + loggerAdmin.info( + req.uuid, + 'controllers/admin/createCoin', + 'symbol:', + symbol, + 'fullname:', + fullname, + 'withdrawal_fee:', + withdrawalFee, + 'min:', + min, + 'max:', + max, + 'increment_unit:', + incrementUnit, + 'logo:', + logo, + 'meta:', + meta, + 'estimated_price:', + estimatedPrice, + 'type:', + type, + 'network:', + network, + 'standard:', + standard, + 'allow_deposit:', + allowDeposit, + 'allow_withdrawal:', + allowWithdrawal + ); + + toolsLib.coin.createCoin( + symbol, + fullname, + { + code, + withdrawalFee, + min, + max, + incrementUnit, + logo, + meta, + estimatedPrice, + type, + network, + standard, + allowDeposit, + allowWithdrawal, + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + } + ) + .then((data) => { + return res.json(data); + }) + .catch((err) => { + loggerAdmin.error( + req.uuid, + 'controllers/admin/createCoin catch', + err.message + ); + return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); + }); +}; + +const updateCoin = (req, res) => { + loggerAdmin.verbose( + req.uuid, + 'controllers/admin/updateCoin auth', + req.auth + ); + + const { + symbol, + fullname, + code, + withdrawal_fee: withdrawalFee, + min, + max, + increment_unit: incrementUnit, + logo, + meta, + estimated_price: estimatedPrice, + type, + network, + standard, + allow_deposit: allowDeposit, + allow_withdrawal: allowWithdrawal + } = req.swagger.params.data.vaue; + + loggerAdmin.info( + req.uuid, + 'controllers/admin/updateCoin', + 'symbol:', + symbol, + 'fullname:', + fullname, + 'withdrawal_fee:', + withdrawalFee, + 'min:', + min, + 'max:', + max, + 'increment_unit:', + incrementUnit, + 'logo:', + logo, + 'meta:', + meta, + 'estimated_price:', + estimatedPrice, + 'type:', + type, + 'network:', + network, + 'standard:', + standard, + 'allow_deposit:', + allowDeposit, + 'allow_withdrawal:', + allowWithdrawal + ); + + toolsLib.coin.updateCoin( + symbol, + fullname, + { + code, + withdrawalFee, + min, + max, + incrementUnit, + logo, + meta, + estimatedPrice, + type, + network, + standard, + allowDeposit, + allowWithdrawal, + additionalHeaders: { + 'x-forwarded-for': req.headers['x-forwarded-for'] + } + } + ) + .then((data) => { + return res.json(data); + }) + .catch((err) => { + loggerAdmin.error( + req.uuid, + 'controllers/admin/updateCoin catch', err.message ); return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); @@ -1164,5 +1524,9 @@ module.exports = { postKitUserMeta, putKitUserMeta, putUserMeta, - adminCheckTransaction + adminCheckTransaction, + createPair, + updatePair, + createCoin, + updateCoin }; diff --git a/server/api/swagger/swagger.yaml b/server/api/swagger/swagger.yaml index d135cb69a0..d0c4c14be6 100644 --- a/server/api/swagger/swagger.yaml +++ b/server/api/swagger/swagger.yaml @@ -2367,6 +2367,56 @@ paths: x-security-scopes: - admin - communicator + /admin/pair: + x-swagger-router-controller: admin + post: + description: Create pair on network + operationId: createPair + tags: + - Admin + parameters: + - name: data + in: body + required: true + schema: + $ref: "#/definitions/PairPutPostRequest" + responses: + 200: + description: Success + schema: + $ref: "#/definitions/PairResponse" + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" + security: + - Bearer: [] + x-security-scopes: + - admin + put: + description: Update pair on network + operationId: updatePair + tags: + - Admin + parameters: + - name: data + in: body + required: true + schema: + $ref: "#/definitions/PairPutPostRequest" + responses: + 200: + description: Success + schema: + $ref: "#/definitions/PairResponse" + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" + security: + - Bearer: [] + x-security-scopes: + - admin /admin/pairs: x-swagger-router-controller: admin get: @@ -2444,6 +2494,56 @@ paths: - Bearer: [] x-security-scopes: - admin + /admin/coin: + x-swagger-router-controller: admin + post: + description: Create coin on network + operationId: createCoin + tags: + - Admin + parameters: + - name: data + in: body + required: true + schema: + $ref: "#/definitions/CoinPutPostRequest" + responses: + 200: + description: Success + schema: + $ref: "#/definitions/CoinResponse" + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" + security: + - Bearer: [] + x-security-scopes: + - admin + put: + description: Update coin on network + operationId: updateCoin + tags: + - Admin + parameters: + - name: data + in: body + required: true + schema: + $ref: "#/definitions/CoinPutPostRequest" + responses: + 200: + description: Success + schema: + $ref: "#/definitions/CoinResponse" + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" + security: + - Bearer: [] + x-security-scopes: + - admin /admin/coins: x-swagger-router-controller: admin get: @@ -4784,4 +4884,156 @@ definitions: email: type: boolean updated_description: - type: string \ No newline at end of file + type: string + CoinPutPostRequest: + type: object + required: + - symbol + - fullname + properties: + symbol: + type: string + code: + type: string + fullname: + type: string + withdrawal_fee: + type: number + format: double + min: + type: number + format: double + max: + type: number + format: double + increment_unit: + type: number + format: double + logo: + type: string + meta: + type: object + estimated_price: + type: number + type: + type: string + enum: + - blockchain + - fiat + - other + network: + type: string + standard: + type: string + allow_deposit: + type: boolean + allow_withdrawal: + type: boolean + PairPutPostRequest: + type: object + required: + - name + - pair_base + - pair_2 + properties: + code: + type: string + name: + type: string + pair_base: + type: string + pair_2: + type: string + active: + type: boolean + min_size: + type: number + format: double + max_size: + type: number + format: double + min_price: + type: number + format: double + max_price: + type: number + format: double + increment_size: + type: number + format: double + increment_price: + type: number + format: double + estimated_price: + type: number + is_public: + type: boolean + CoinResponse: + type: object + required: + - id + - symbol + properties: + id: + type: number + format: int32 + fullname: + type: string + symbol: + type: string + active: + type: boolean + allow_deposit: + type: boolean + allow_withdrawal: + type: boolean + withdrawal_fee: + type: number + format: double + min: + type: number + format: double + max: + type: number + format: double + increment_unit: + type: number + format: double + deposit_limits: + type: object + withdrawal_limits: + type: object + PairResponse: + type: object + required: + - name + properties: + id: + type: number + format: int32 + name: + type: string + pair_base: + type: string + pair_2: + type: string + active: + type: boolean + min_size: + type: number + format: double + max_size: + type: number + format: double + min_price: + type: number + format: double + max_price: + type: number + format: double + increment_size: + type: number + format: double + increment_price: + type: number + format: double \ No newline at end of file From b202602b5424a2f20b1d2c7a9e005acb2459bf85 Mon Sep 17 00:00:00 2001 From: brandonkimmmm Date: Mon, 2 Aug 2021 17:44:39 +0900 Subject: [PATCH 068/222] data value naming fix and dont return initial function in controllers --- server/api/controllers/admin.js | 8 ++++---- server/api/controllers/public.js | 6 +++--- server/api/controllers/user.js | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index fa7fa31843..c051e7ec7b 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -1151,7 +1151,7 @@ const createPair = (req, res) => { increment_price: incrementPrice, estimated_price: estimatedPrice, is_public: isPublic - } = req.swagger.params.data.vaue; + } = req.swagger.params.data.value; loggerAdmin.info( req.uuid, @@ -1238,7 +1238,7 @@ const updatePair = (req, res) => { increment_price: incrementPrice, estimated_price: estimatedPrice, is_public: isPublic - } = req.swagger.params.data.vaue; + } = req.swagger.params.data.value; loggerAdmin.info( req.uuid, @@ -1327,7 +1327,7 @@ const createCoin = (req, res) => { standard, allow_deposit: allowDeposit, allow_withdrawal: allowWithdrawal - } = req.swagger.params.data.vaue; + } = req.swagger.params.data.value; loggerAdmin.info( req.uuid, @@ -1420,7 +1420,7 @@ const updateCoin = (req, res) => { standard, allow_deposit: allowDeposit, allow_withdrawal: allowWithdrawal - } = req.swagger.params.data.vaue; + } = req.swagger.params.data.value; loggerAdmin.info( req.uuid, diff --git a/server/api/controllers/public.js b/server/api/controllers/public.js index c559d09c0a..a56d6e337b 100644 --- a/server/api/controllers/public.js +++ b/server/api/controllers/public.js @@ -59,7 +59,7 @@ const getKitConfigurations = (req, res) => { const sendSupportEmail = (req, res) => { const { email, category, subject, description } = req.swagger.params; - return toolsLib.sendEmailToSupport(email.value, category.value, subject.value, description.value) + toolsLib.sendEmailToSupport(email.value, category.value, subject.value, description.value) .then(() => { return res.json({ message: 'Email was sent to support' }); }) @@ -373,7 +373,7 @@ const getAssetsPrices = (req, res) => { }; const getAllCoins = (req, res) => { - return toolsLib.coin.getNetworkCoins({ + toolsLib.coin.getNetworkCoins({ additionalHeaders: { 'x-forwarded-for': req.headers['x-forwarded-for'] } @@ -392,7 +392,7 @@ const getAllCoins = (req, res) => { }; const getAllPairs = (req, res) => { - return toolsLib.pair.getNetworkPairs({ + toolsLib.pair.getNetworkPairs({ additionalHeaders: { 'x-forwarded-for': req.headers['x-forwarded-for'] } diff --git a/server/api/controllers/user.js b/server/api/controllers/user.js index 1a3bf61a7f..faf440c3ee 100644 --- a/server/api/controllers/user.js +++ b/server/api/controllers/user.js @@ -220,7 +220,7 @@ const verifyUser = (req, res) => { return res.status(400).json({ message: 'Invalid Email' }); } - return toolsLib.database.findOne('user', { + toolsLib.database.findOne('user', { where: { email }, attributes: ['id', 'email', 'settings', 'network_id'] }) From c1776240f1cb3ea53b225ad2c70d1c9695b5d8be Mon Sep 17 00:00:00 2001 From: Hoan Ng Date: Tue, 3 Aug 2021 09:43:06 +0700 Subject: [PATCH 069/222] remove swagger config for endpoint /confirm-change-password add ExpressJS handler --- server/api/controllers/user.js | 11 +++++------ server/api/swagger/swagger.yaml | 22 ---------------------- server/app.js | 3 +++ server/mail/templates/changePassword.js | 2 +- 4 files changed, 9 insertions(+), 29 deletions(-) diff --git a/server/api/controllers/user.js b/server/api/controllers/user.js index ffe5cce286..e93870e8d4 100644 --- a/server/api/controllers/user.js +++ b/server/api/controllers/user.js @@ -27,7 +27,7 @@ const { USER_EMAIL_IS_VERIFIED, INVALID_VERIFICATION_CODE } = require('../../messages'); -const { DEFAULT_ORDER_RISK_PERCENTAGE, EVENTS_CHANNEL } = require('../../constants'); +const { DEFAULT_ORDER_RISK_PERCENTAGE, EVENTS_CHANNEL, API_HOST, DOMAIN } = require('../../constants'); const { all } = require('bluebird'); const { isString } = require('lodash'); const { publisher } = require('../../db/pubsub'); @@ -492,7 +492,7 @@ const changePassword = (req, res) => { const email = req.auth.sub.email; const { old_password, new_password } = req.swagger.params.data.value; const ip = req.headers['x-real-ip']; - const domain = req.headers['x-real-origin']; + const domain = `${API_HOST}${req.swagger.swaggerObject.basePath}`; loggerUser.debug( req.uuid, @@ -509,11 +509,10 @@ const changePassword = (req, res) => { }; const confirmChangePassword = (req, res) => { - const { code } = req.swagger.params.data.value; - const domain = req.headers['x-real-origin']; + const code = req.params.code; - toolsLib.security.confirmChangeUserPassword(code, domain) - .then(() => res.json({ message: 'Password updated.' })) + toolsLib.security.confirmChangeUserPassword(code) + .then(() => res.redirect(301, `${DOMAIN}/reset-password/${code}?isSuccess=true`)) .catch((err) => { loggerUser.error(req.uuid, 'controllers/user/confirmChangeUserPassword', err.message); return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); diff --git a/server/api/swagger/swagger.yaml b/server/api/swagger/swagger.yaml index fa0d79accd..6c67be4ed6 100644 --- a/server/api/swagger/swagger.yaml +++ b/server/api/swagger/swagger.yaml @@ -297,28 +297,6 @@ paths: description: Error schema: $ref: "#/definitions/MessageResponse" - /confirm-change-password: - x-swagger-router-controller: user - post: - operationId: confirmChangePassword - description: Confirm a change password request - tags: - - Public - parameters: - - name: data - in: body - required: true - schema: - $ref: "#/definitions/ConfirmChangePassword" - responses: - 200: - description: Success - schema: - $ref: "#/definitions/MessageResponse" - default: - description: Error - schema: - $ref: "#/definitions/MessageResponse" /notification/deposit: x-swagger-router-controller: notification post: diff --git a/server/app.js b/server/app.js index 0a029aefa0..4765193782 100644 --- a/server/app.js +++ b/server/app.js @@ -11,6 +11,7 @@ const { domainMiddleware, helmetMiddleware } = require('./config/middleware'); const toolsLib = require('hollaex-tools-lib'); const { checkStatus } = require('./init'); const { API_HOST, CUSTOM_CSS } = require('./constants'); +const { confirmChangePassword } = require('./api/controllers/user'); checkStatus() .then(() => { @@ -75,6 +76,8 @@ checkStatus() res.redirect('/v2/health'); }); + app.get('/v2/confirm-change-password/:code', confirmChangePassword); + app.use('/explorer', swaggerUi.serve, swaggerUi.setup(swaggerDoc, options)); SwaggerExpress.create(config, function(err, swaggerExpress) { diff --git a/server/mail/templates/changePassword.js b/server/mail/templates/changePassword.js index 364ad25ce3..b657e14065 100644 --- a/server/mail/templates/changePassword.js +++ b/server/mail/templates/changePassword.js @@ -9,7 +9,7 @@ const fetchMessage = (email, data, language, domain) => { }; const html = (email, data, language, domain) => { - const link = `${domain}/change-password-confirm/${data.code}`; + const link = `${domain}/confirm-change-password/${data.code}`; const CHANGEPASSWORD = require('../strings').getStringObject(language, 'CHANGEPASSWORD'); return `
From e5776cdf281c1936e94deec99b8f600540654a42 Mon Sep 17 00:00:00 2001 From: Hoan Ng Date: Tue, 3 Aug 2021 14:04:56 +0700 Subject: [PATCH 070/222] validate email in user endpoints --- server/api/controllers/user.js | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/server/api/controllers/user.js b/server/api/controllers/user.js index f79ae6ef7d..f9fddc40ab 100644 --- a/server/api/controllers/user.js +++ b/server/api/controllers/user.js @@ -80,7 +80,7 @@ const signUpUser = (req, res) => { throw new Error(SIGNUP_NOT_AVAILABLE); } - if (!email || !isEmail(email)) { + if (!email || typeof email !== 'string' || !isEmail(email)) { throw new Error(PROVIDE_VALID_EMAIL); } @@ -115,7 +115,7 @@ const signUpUser = (req, res) => { user ]); }) - .then(([ networkUser, user ]) => { + .then(([networkUser, user]) => { return user.update( { network_id: networkUser.id }, { fields: ['network_id'], returning: true, transaction } @@ -129,7 +129,7 @@ const signUpUser = (req, res) => { user ]); }) - .then(([ verificationCode, user ]) => { + .then(([verificationCode, user]) => { sendEmail( MAILTYPE.SIGNUP, email, @@ -211,9 +211,7 @@ const verifyUser = (req, res) => { let { email } = req.swagger.params.data.value; const domain = req.headers['x-real-origin']; - email = email.toLowerCase(); - - if (!isEmail(email)) { + if (!email || typeof email !== 'string' || !isEmail(email)) { loggerUser.error( req.uuid, 'controllers/user/verifyUser invalid email', @@ -222,6 +220,8 @@ const verifyUser = (req, res) => { return res.status(400).json({ message: 'Invalid Email' }); } + email = email.toLowerCase(); + return toolsLib.database.findOne('user', { where: { email }, attributes: ['id', 'email', 'settings', 'network_id'] @@ -232,7 +232,7 @@ const verifyUser = (req, res) => { user ]); }) - .then(([ verificationCode, user ]) => { + .then(([verificationCode, user]) => { if (verificationCode.verified) { throw new Error(USER_EMAIL_IS_VERIFIED); } @@ -249,7 +249,7 @@ const verifyUser = (req, res) => { ) ]); }) - .then(([ user ]) => { + .then(([user]) => { sendEmail( MAILTYPE.WELCOME, user.email, @@ -280,9 +280,7 @@ const loginPost = (req, res) => { const referer = req.headers.referer; const time = new Date(); - email = email.toLowerCase(); - - if (!isEmail(email)) { + if (!email || typeof email !== 'string' || !isEmail(email)) { loggerUser.error( req.uuid, 'controllers/user/loginPost invalid email', @@ -291,6 +289,8 @@ const loginPost = (req, res) => { return res.status(400).json({ message: 'Invalid Email' }); } + email = email.toLowerCase(); + toolsLib.user.getUserByEmail(email) .then((user) => { if (!user) { @@ -309,13 +309,13 @@ const loginPost = (req, res) => { toolsLib.security.validatePassword(user.password, password) ]); }) - .then(([ user, passwordIsValid ]) => { + .then(([user, passwordIsValid]) => { if (!passwordIsValid) { throw new Error(INVALID_CREDENTIALS); } if (!user.otp_enabled) { - return all([ user, toolsLib.security.checkCaptcha(captcha, ip) ]); + return all([user, toolsLib.security.checkCaptcha(captcha, ip)]); } else { return all([ user, @@ -329,7 +329,7 @@ const loginPost = (req, res) => { ]); } }) - .then(([ user ]) => { + .then(([user]) => { if (ip) { toolsLib.user.registerUserLogin(user.id, ip, { device, @@ -388,7 +388,7 @@ const requestResetPassword = (req, res) => { domain ); - if (typeof email !== 'string' || !isEmail(email)) { + if (!email || typeof email !== 'string' || !isEmail(email)) { loggerUser.error( req.uuid, 'controllers/user/requestResetPassword invalid email', From 310beb98d030e62079dff7232b9665a34b76a9f6 Mon Sep 17 00:00:00 2001 From: Hoan Ng Date: Tue, 3 Aug 2021 14:13:17 +0700 Subject: [PATCH 071/222] validate quote param in getAssetsPrices --- server/api/controllers/public.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/public.js b/server/api/controllers/public.js index 1d7cb843cc..ce572f33b6 100644 --- a/server/api/controllers/public.js +++ b/server/api/controllers/public.js @@ -2,7 +2,7 @@ const packageJson = require('../../package.json'); const { API_HOST } = require('../../constants'); -const { loggerPublic } = require('../../config/logger'); +const { loggerPublic, loggerUser } = require('../../config/logger'); const toolsLib = require('hollaex-tools-lib'); const { errorMessageConverter } = require('../../utils/conversion'); @@ -292,6 +292,15 @@ const getSymbols = (req, res) => { const getAssetsPrices = (req, res) => { const { assets, quote, amount } = req.swagger.params; + if(quote.value && typeof quote.value !== 'string'){ + loggerUser.error( + req.uuid, + 'controllers/public/getAssetsPrices invalid quote', + quote.value + ); + return res.status(400).json({ message: 'Invalid quote' }); + } + loggerPublic.info(req.uuid, 'controllers/public/getAssetsPrices assets', assets.value, 'quote', quote.value, 'amount', amount.value); toolsLib.getAssetsPrices(assets.value, quote.value, amount.value) From 76546145b0ef22fd190c1add1c295945f060117a Mon Sep 17 00:00:00 2001 From: Hoan Ng Date: Tue, 3 Aug 2021 15:17:47 +0700 Subject: [PATCH 072/222] validate start_date, end_date params in getUserLogins --- server/api/controllers/user.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/server/api/controllers/user.js b/server/api/controllers/user.js index f9fddc40ab..aa6f91f600 100644 --- a/server/api/controllers/user.js +++ b/server/api/controllers/user.js @@ -500,6 +500,24 @@ const getUserLogins = (req, res) => { const user_id = req.auth.sub.id; const { limit, page, order_by, order, start_date, end_date, format } = req.swagger.params; + if(start_date.value && typeof start_date.value !== 'string'){ + loggerUser.error( + req.uuid, + 'controllers/public/getUserLogins invalid start_date', + start_date.value + ); + return res.status(400).json({ message: 'Invalid start date' }); + } + + if(end_date.value && typeof end_date.value !== 'string'){ + loggerUser.error( + req.uuid, + 'controllers/public/getUserLogins invalid end_date', + end_date.value + ); + return res.status(400).json({ message: 'Invalid end date' }); + } + toolsLib.user.getUserLogins({ userId: user_id, limit: limit.value, From 2ce8f305fe9697613d3407df2c6f27ca8ce3278d Mon Sep 17 00:00:00 2001 From: Hoan Ng Date: Tue, 3 Aug 2021 16:15:04 +0700 Subject: [PATCH 073/222] validate start_date, end_date, order_by params in getUserLogins --- server/api/controllers/user.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/server/api/controllers/user.js b/server/api/controllers/user.js index aa6f91f600..6a9542a570 100644 --- a/server/api/controllers/user.js +++ b/server/api/controllers/user.js @@ -29,7 +29,7 @@ const { } = require('../../messages'); const { DEFAULT_ORDER_RISK_PERCENTAGE } = require('../../constants'); const { all } = require('bluebird'); -const { isString } = require('lodash'); +const { isDate } = require('moment'); const INITIAL_SETTINGS = () => { return { notification: { @@ -500,7 +500,7 @@ const getUserLogins = (req, res) => { const user_id = req.auth.sub.id; const { limit, page, order_by, order, start_date, end_date, format } = req.swagger.params; - if(start_date.value && typeof start_date.value !== 'string'){ + if (start_date.value && !isDate(start_date.value)) { loggerUser.error( req.uuid, 'controllers/public/getUserLogins invalid start_date', @@ -509,7 +509,7 @@ const getUserLogins = (req, res) => { return res.status(400).json({ message: 'Invalid start date' }); } - if(end_date.value && typeof end_date.value !== 'string'){ + if (end_date.value && !isDate(end_date.value)) { loggerUser.error( req.uuid, 'controllers/public/getUserLogins invalid end_date', @@ -518,6 +518,15 @@ const getUserLogins = (req, res) => { return res.status(400).json({ message: 'Invalid end date' }); } + if (order_by.value && typeof order_by.value !== 'string') { + loggerUser.error( + req.uuid, + 'controllers/public/getUserLogins invalid order_by', + end_date.value + ); + return res.status(400).json({ message: 'Invalid order by' }); + } + toolsLib.user.getUserLogins({ userId: user_id, limit: limit.value, From 962c625533ff500289ce474e0ff0d60e9dbfe56a Mon Sep 17 00:00:00 2001 From: Hoan Ng Date: Tue, 3 Aug 2021 16:15:24 +0700 Subject: [PATCH 074/222] validate order_by params in getUsersAdmin --- server/api/controllers/admin.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index c9bb7a4a53..54b67f9117 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -1,6 +1,6 @@ 'use strict'; -const { loggerAdmin } = require('../../config/logger'); +const { loggerAdmin, loggerUser } = require('../../config/logger'); const toolsLib = require('hollaex-tools-lib'); const { cloneDeep } = require('lodash'); const { all } = require('bluebird'); @@ -100,6 +100,15 @@ const getUsersAdmin = (req, res) => { const { id, search, pending, limit, page, order_by, order, start_date, end_date, format } = req.swagger.params; + if (order_by.value && typeof order_by.value !== 'string') { + loggerUser.error( + req.uuid, + 'controllers/admin/getUsersAdmin invalid order_by', + end_date.value + ); + return res.status(400).json({ message: 'Invalid order by' }); + } + toolsLib.user.getAllUsersAdmin({ id: id.value, search: search.value, From 102254d84c86203a122ff107eba878894b9b99a6 Mon Sep 17 00:00:00 2001 From: Hoan Ng Date: Tue, 3 Aug 2021 16:18:22 +0700 Subject: [PATCH 075/222] validate start_date, end_date, order_by params in getUserLogins --- server/api/controllers/user.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/api/controllers/user.js b/server/api/controllers/user.js index 6a9542a570..c5f343d94a 100644 --- a/server/api/controllers/user.js +++ b/server/api/controllers/user.js @@ -503,7 +503,7 @@ const getUserLogins = (req, res) => { if (start_date.value && !isDate(start_date.value)) { loggerUser.error( req.uuid, - 'controllers/public/getUserLogins invalid start_date', + 'controllers/user/getUserLogins invalid start_date', start_date.value ); return res.status(400).json({ message: 'Invalid start date' }); @@ -512,7 +512,7 @@ const getUserLogins = (req, res) => { if (end_date.value && !isDate(end_date.value)) { loggerUser.error( req.uuid, - 'controllers/public/getUserLogins invalid end_date', + 'controllers/user/getUserLogins invalid end_date', end_date.value ); return res.status(400).json({ message: 'Invalid end date' }); @@ -521,7 +521,7 @@ const getUserLogins = (req, res) => { if (order_by.value && typeof order_by.value !== 'string') { loggerUser.error( req.uuid, - 'controllers/public/getUserLogins invalid order_by', + 'controllers/user/getUserLogins invalid order_by', end_date.value ); return res.status(400).json({ message: 'Invalid order by' }); From 79797404edf7c6bdf97440ef58d7cbc30592a840 Mon Sep 17 00:00:00 2001 From: Hoan Ng Date: Tue, 3 Aug 2021 16:22:09 +0700 Subject: [PATCH 076/222] validate start_date, end_date, order_by params in getUserLogins --- server/api/controllers/user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/api/controllers/user.js b/server/api/controllers/user.js index c5f343d94a..17ad333274 100644 --- a/server/api/controllers/user.js +++ b/server/api/controllers/user.js @@ -522,7 +522,7 @@ const getUserLogins = (req, res) => { loggerUser.error( req.uuid, 'controllers/user/getUserLogins invalid order_by', - end_date.value + order_by.value ); return res.status(400).json({ message: 'Invalid order by' }); } From 4cf132c2cdb2b32878f49e422112cfca84b24ab7 Mon Sep 17 00:00:00 2001 From: Hoan Ng Date: Tue, 3 Aug 2021 16:27:44 +0700 Subject: [PATCH 077/222] validate start_date, end_date, order_by params in getAdminUserLogins, getUserAudits, getOperators --- server/api/controllers/admin.js | 66 ++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index 54b67f9117..7403e23054 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -8,6 +8,7 @@ const { USER_NOT_FOUND } = require('../../messages'); const { sendEmail } = require('../../mail'); const { MAILTYPE } = require('../../mail/strings'); const { errorMessageConverter } = require('../../utils/conversion'); +const { isDate } = require('moment'); const getAdminKit = (req, res) => { loggerAdmin.verbose(req.uuid, 'controllers/admin/getAdminKit', req.auth.sub); @@ -104,7 +105,7 @@ const getUsersAdmin = (req, res) => { loggerUser.error( req.uuid, 'controllers/admin/getUsersAdmin invalid order_by', - end_date.value + order_by.value ); return res.status(400).json({ message: 'Invalid order by' }); } @@ -413,6 +414,33 @@ const getAdminUserLogins = (req, res) => { ); const { user_id, limit, page, start_date, order_by, order, end_date, format } = req.swagger.params; + if (start_date.value && !isDate(start_date.value)) { + loggerUser.error( + req.uuid, + 'controllers/admin/getAdminUserLogins invalid start_date', + start_date.value + ); + return res.status(400).json({ message: 'Invalid start date' }); + } + + if (end_date.value && !isDate(end_date.value)) { + loggerUser.error( + req.uuid, + 'controllers/admin/getAdminUserLogins invalid end_date', + end_date.value + ); + return res.status(400).json({ message: 'Invalid end date' }); + } + + if (order_by.value && typeof order_by.value !== 'string') { + loggerUser.error( + req.uuid, + 'controllers/admin/getAdminUserLogins invalid order_by', + order_by.value + ); + return res.status(400).json({ message: 'Invalid order by' }); + } + toolsLib.user.getUserLogins({ userId: user_id.value, limit: limit.value, @@ -451,6 +479,33 @@ const getUserAudits = (req, res) => { const user_id = req.swagger.params.user_id.value; const { limit, page, order_by, order, start_date, end_date, format } = req.swagger.params; + if (start_date.value && !isDate(start_date.value)) { + loggerUser.error( + req.uuid, + 'controllers/admin/getUserAudits invalid start_date', + start_date.value + ); + return res.status(400).json({ message: 'Invalid start date' }); + } + + if (end_date.value && !isDate(end_date.value)) { + loggerUser.error( + req.uuid, + 'controllers/admin/getUserAudits invalid end_date', + end_date.value + ); + return res.status(400).json({ message: 'Invalid end date' }); + } + + if (order_by.value && typeof order_by.value !== 'string') { + loggerUser.error( + req.uuid, + 'controllers/admin/getUserAudits invalid order_by', + order_by.value + ); + return res.status(400).json({ message: 'Invalid order by' }); + } + toolsLib.user.getUserAudits({ userId: user_id, limit: limit.value, @@ -625,6 +680,15 @@ const getOperators = (req, res) => { const { limit, page, order_by, order } = req.swagger.params; + if (order_by.value && typeof order_by.value !== 'string') { + loggerUser.error( + req.uuid, + 'controllers/admin/getOperators invalid order_by', + order_by.value + ); + return res.status(400).json({ message: 'Invalid order by' }); + } + toolsLib.user.getExchangeOperators({ limit: limit.value, page: page.value, From 31c161d462db9519c681e11184eb98675a2a4505 Mon Sep 17 00:00:00 2001 From: Hoan Ng Date: Tue, 3 Aug 2021 16:57:56 +0700 Subject: [PATCH 078/222] validate order_id params in getUserOrder, cancelUserOrder, adminCancelOrder --- server/api/controllers/order.js | 48 ++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/server/api/controllers/order.js b/server/api/controllers/order.js index 15c33da6ed..ccca226647 100644 --- a/server/api/controllers/order.js +++ b/server/api/controllers/order.js @@ -1,9 +1,10 @@ 'use strict'; -const { loggerOrders } = require('../../config/logger'); +const { loggerOrders, loggerUser } = require('../../config/logger'); const toolsLib = require('hollaex-tools-lib'); const { isPlainObject, isNumber } = require('lodash'); const { errorMessageConverter } = require('../../utils/conversion'); +const { isUUID } = require('validator'); const createOrder = (req, res) => { loggerOrders.verbose( @@ -58,6 +59,15 @@ const getUserOrder = (req, res) => { const user_id = req.auth.sub.id; const order_id = req.swagger.params.order_id.value; + if (!order_id || typeof order_id !== 'string' || !isUUID(order_id)) { + loggerUser.error( + req.uuid, + 'controllers/order/getUserOrder invalid order_id', + order_id + ); + return res.status(400).json({ message: 'Invalid order id' }); + } + toolsLib.order.getUserOrderByKitId(user_id, order_id) .then((order) => { return res.json(order); @@ -78,6 +88,15 @@ const cancelUserOrder = (req, res) => { const user_id = req.auth.sub.id; const order_id = req.swagger.params.order_id.value; + if (!order_id || typeof order_id !== 'string' || !isUUID(order_id)) { + loggerUser.error( + req.uuid, + 'controllers/order/cancelUserOrder invalid order_id', + order_id + ); + return res.status(400).json({ message: 'Invalid order id' }); + } + toolsLib.order.cancelUserOrderByKitId(user_id, order_id) .then((order) => { return res.json(order); @@ -132,7 +151,19 @@ const cancelAllUserOrders = (req, res) => { const getAdminOrders = (req, res) => { loggerOrders.verbose(req.uuid, 'controllers/order/getAdminOrders/auth', req.auth); - const { user_id, symbol, side, status, open, limit, page, order_by, order, start_date, end_date } = req.swagger.params; + const { + user_id, + symbol, + side, + status, + open, + limit, + page, + order_by, + order, + start_date, + end_date + } = req.swagger.params; let promiseQuery; @@ -179,9 +210,18 @@ const adminCancelOrder = (req, res) => { loggerOrders.verbose(req.uuid, 'controllers/order/adminCancelOrder auth', req.auth); const userId = req.swagger.params.user_id.value; - const orderId = req.swagger.params.order_id.value; + const order_id = req.swagger.params.order_id.value; + + if (!order_id || typeof orderId !== 'string' || !isUUID(order_id)) { + loggerUser.error( + req.uuid, + 'controllers/order/adminCancelOrder invalid order_id', + order_id + ); + return res.status(400).json({ message: 'Invalid order id' }); + } - toolsLib.order.cancelUserOrderByKitId(userId, orderId) + toolsLib.order.cancelUserOrderByKitId(userId, order_id) .then((data) => { return res.json(data); }) From f4c69b574449c1efe2eccac478d3afc48147e1f3 Mon Sep 17 00:00:00 2001 From: Hoan Ng Date: Tue, 3 Aug 2021 17:43:37 +0700 Subject: [PATCH 079/222] validate status in /orders and /admin/orders --- server/api/swagger/swagger.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/api/swagger/swagger.yaml b/server/api/swagger/swagger.yaml index ab868746be..e6913b8372 100644 --- a/server/api/swagger/swagger.yaml +++ b/server/api/swagger/swagger.yaml @@ -1320,6 +1320,7 @@ paths: name: status description: Order status e.g. pfilled, filled required: false + enum: ['pfilled', 'filled', 'new', 'canceled'] type: string - in: query name: open @@ -2838,6 +2839,7 @@ paths: name: status description: Order status e.g. pfilled, filled required: false + enum: ['pfilled', 'filled', 'new', 'canceled'] type: string - in: query name: open @@ -4690,4 +4692,4 @@ definitions: email: type: boolean updated_description: - type: string \ No newline at end of file + type: string From 7772f7743092bcff2306118812f275b858810e6d Mon Sep 17 00:00:00 2001 From: Hoan Ng Date: Tue, 3 Aug 2021 17:50:16 +0700 Subject: [PATCH 080/222] validate email and role params in inviteNewOperator --- server/api/controllers/admin.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index 7403e23054..c86bd3f63c 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -9,6 +9,7 @@ const { sendEmail } = require('../../mail'); const { MAILTYPE } = require('../../mail/strings'); const { errorMessageConverter } = require('../../utils/conversion'); const { isDate } = require('moment'); +const { isEmail } = require('validator'); const getAdminKit = (req, res) => { loggerAdmin.verbose(req.uuid, 'controllers/admin/getAdminKit', req.auth.sub); @@ -718,6 +719,24 @@ const inviteNewOperator = (req, res) => { const invitingEmail = req.auth.sub.email; const { email, role } = req.swagger.params; + if (!email.value || typeof email.value !== 'string' || !isEmail(email.value)) { + loggerUser.error( + req.uuid, + 'controllers/admin/inviteNewOperator invalid email', + email.value + ); + return res.status(400).json({ message: 'Invalid Email' }); + } + + if (!role.value || typeof role.value !== 'string') { + loggerUser.error( + req.uuid, + 'controllers/admin/inviteNewOperator invalid role', + role.value + ); + return res.status(400).json({ message: 'Invalid role' }); + } + toolsLib.user.inviteExchangeOperator(invitingEmail, email.value, role.value) .then(() => { return res.json({ message: 'Success' }); From 95c19c872db3f32faca3b2b1bff7930fd07d4c5f Mon Sep 17 00:00:00 2001 From: ram Date: Tue, 3 Aug 2021 17:12:52 +0530 Subject: [PATCH 081/222] Changes for reset password confirmation page --- .../_ConfirmChangePassword.scss | 3 + .../containers/ConfirmChangePassword/index.js | 61 +++++++++++++++++++ .../ResetPassword/ResetPasswordSuccess.js | 21 ++++--- web/src/containers/ResetPassword/index.js | 8 ++- web/src/containers/_containers.scss | 1 + web/src/index.css | 25 ++++---- web/src/routes.js | 6 ++ 7 files changed, 106 insertions(+), 19 deletions(-) create mode 100644 web/src/containers/ConfirmChangePassword/_ConfirmChangePassword.scss create mode 100644 web/src/containers/ConfirmChangePassword/index.js diff --git a/web/src/containers/ConfirmChangePassword/_ConfirmChangePassword.scss b/web/src/containers/ConfirmChangePassword/_ConfirmChangePassword.scss new file mode 100644 index 0000000000..6e475fbbc8 --- /dev/null +++ b/web/src/containers/ConfirmChangePassword/_ConfirmChangePassword.scss @@ -0,0 +1,3 @@ +.confirm-change-pwd-wrapper .auth-wrapper .mdc-button--raised:not(:disabled):not(.mdc-ripple-upgraded), .mdc-button--unelevated:not(:disabled):not(.mdc-ripple-upgraded) { + margin-top: 2rem !important; +}; \ No newline at end of file diff --git a/web/src/containers/ConfirmChangePassword/index.js b/web/src/containers/ConfirmChangePassword/index.js new file mode 100644 index 0000000000..80695bef37 --- /dev/null +++ b/web/src/containers/ConfirmChangePassword/index.js @@ -0,0 +1,61 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; + +import { Dialog } from '../../components'; +import ResetPasswordSuccess from 'containers/ResetPassword/ResetPasswordSuccess'; +import STRINGS from '../../config/localizedStrings'; + +class ConfirmChangePassword extends Component { + state = { + showContactForm: false, + }; + + componentDidMount() { + let paramsString = window.location.search.replace('?', ''); + let paramsData = {} + if (paramsString.length) { + let splitValue = paramsString.split('&') + splitValue.forEach((value) => { + let temp = value.split('='); + paramsData[temp[0]] = temp[1]; + }); + } + if (paramsData && paramsData.isSuccess) { + this.setState({ showContactForm: true }); + } + } + + onCloseDialog = () => { + this.setState({ showContactForm: false }); + this.props.router.replace('/account'); + }; + + render() { + return ( +
+ + {this.state.showContactForm && +
+ +
+ } +
+
+ ) + } +} + +const mapStateToProps = (store) => ({ + activeTheme: store.app.theme, +}); + +export default connect(mapStateToProps)(ConfirmChangePassword); diff --git a/web/src/containers/ResetPassword/ResetPasswordSuccess.js b/web/src/containers/ResetPassword/ResetPasswordSuccess.js index b6498693bd..5422985906 100644 --- a/web/src/containers/ResetPassword/ResetPasswordSuccess.js +++ b/web/src/containers/ResetPassword/ResetPasswordSuccess.js @@ -3,7 +3,7 @@ import { IconTitle, Button } from '../../components'; import STRINGS from '../../config/localizedStrings'; import withConfig from 'components/ConfigProvider/withConfig'; -const ResetPasswordSuccess = ({ onClick, icons: ICONS, ...rest }) => { +const ResetPasswordSuccess = ({ label, onClick, icons: ICONS, is_loginText = true, ...rest }) => { return (
{ textType="title" className="w-100" /> -
- {STRINGS['RESET_PASSWORD_SUCCESS.TEXT_1']} -
- {STRINGS['RESET_PASSWORD_SUCCESS.TEXT_2']} -
+ {is_loginText + ? +
+ {STRINGS['RESET_PASSWORD_SUCCESS.TEXT_1']} +
+ {STRINGS['RESET_PASSWORD_SUCCESS.TEXT_2']} +
+ : +
+ {STRINGS['RESET_PASSWORD_SUCCESS.TEXT_1']} +
+ } +
+
+ ); + } else if (this.state.isPreview) { + return ( +
+
+ {this.renderBreadcrumb()} + +
+ {this.state.selectedAsset.created_by === user.id + ?
+
+ +
+ {this.state.selectedAsset.verified + ? ( + +
+ +
) + : null + } +
+
+ : null + } +
+ ); + } + }; + + handleApply = async () => { + try { + // await requestApplyOnKit(this.state.exchange.id); + message.success('Applied changes successfully'); + this.handleConfirmationClose(); + } catch (error) { + if (error && error.data) { + message.error(error.data.message) + } + } + }; + + handleConfirmationClose = () => { + this.setState({ isPresetConfirm: false }); + }; + + handleFileChange = async (event, name) => { + const file = event.target.files[0]; + if (file) { + const base64Url = await new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve(reader.result); + reader.onerror = error => reject(error); + }); + const coinFormData = { + ...this.state.selectedAsset, + [name]: base64Url, + iconName: file.name + }; + this.handleEditData(coinFormData); + this.updateFormData(name, base64Url) + } + }; + + renderModalContent = () => { + const { + coins, + isOpenAdd, + isEdit, + isConfigureEdit, + editConfigureScreen, + selectedAsset, + isConfirm, + exchangeUsers, + userEmails + } = this.state; + if (isConfirm) { + return ( +
+
Apply changes to live exchange
+
Do you want to apply changes to the live website now?
+
+ +
+ +
+
+ ); + } else if (isOpenAdd || isEdit || isConfigureEdit) { + return ( + + ); + } + return null; + }; + + render() { + const { + isPreview, + isConfigure, + coins, + isOpenAdd, + isEdit, + isConfigureEdit, + width, + isConfirm, + isPresetConfirm, + exchangeBalance + } = this.state; + + return ( +
+ {(isPreview || isConfigure) + ? this.renderPreview() + : +
+ +
+
+ index} + dataSource={coins} + /> + + + } + + {this.renderModalContent()} + + + ) + } +} + +const mapStateToProps = (state) => ({ + user: state.user, + allCoins: state.app.coins +}); + +export default connect(mapStateToProps)(Assets); diff --git a/web/src/containers/Admin/AdminFinancials/action.js b/web/src/containers/Admin/AdminFinancials/action.js new file mode 100644 index 0000000000..addcc465b0 --- /dev/null +++ b/web/src/containers/Admin/AdminFinancials/action.js @@ -0,0 +1,21 @@ +import axios from 'axios'; + +export const requestExchange = (values) => { + return axios.get(`/network/${values.id}/exchange`); +}; + +export const updateExchange = (values) => { + return axios.put(`/network/${values.id}/exchange`); +}; + +export const storeMint = (values) => { + return axios.post(`/network/${values.id}/mint`); +}; + +export const storeBurn = (values) => { + return axios.post(`/network/${values.id}/burn`); +}; + +export const getCoins = (values) => { + return axios.get(`/network/${values.id}/coin/all`); +}; \ No newline at end of file diff --git a/web/src/containers/Admin/AdminFinancials/index.css b/web/src/containers/Admin/AdminFinancials/index.css index 1ef7202c84..5e686c00e4 100644 --- a/web/src/containers/Admin/AdminFinancials/index.css +++ b/web/src/containers/Admin/AdminFinancials/index.css @@ -222,3 +222,245 @@ .admin-earnings-container .ant-picker .anticon-calendar { color: white; } + +.admin-asset-wrapper .main-header { + color: #ffffff; + font-size: 38px; + font-weight: bold; + padding-left: 2rem; + border-bottom: 1px solid #ffffff; +} +.admin-asset-wrapper .filter-header { + display: flex; + justify-content: space-between; + padding: 0rem 1rem; + margin-bottom: 1rem; +} +.admin-asset-wrapper .coin-symbol-wrapper { + display: flex; + align-items: center; +} +.admin-asset-wrapper .coin-symbol-wrapper .coin-wrap { + margin-right: 5px; +} +.admin-asset-wrapper .coin-symbol-wrapper .config-content { + display: flex; + align-items: center; + margin-left: 5px; +} +.admin-asset-wrapper .coin-symbol-wrapper:hover { + cursor: pointer; +} +.admin-asset-wrapper .coin-symbol-wrapper:hover .currency_ball .fullName { + text-decoration: underline; +} +.coin-symbol-wrapper .currency_ball { + display: flex; + align-items: center; +} +.coin-symbol-wrapper .currency_ball .fullName { + margin-left: 10px; +} +.admin-asset-wrapper .balance-column { + width: 18rem; +} +.admin-asset-wrapper .link { + color: #0000FF; + cursor: pointer; + text-decoration: underline; +} +.admin-asset-wrapper .title { + color: #ffffff; + font-size: 24px; + font-weight: bold; +} +.admin-asset-wrapper .sub-title { + color: #ffffff; + font-size: 15px; + font-weight: bold; + margin-top: 5px; +} +.admin-asset-wrapper .preview-container { + width: 30rem; +} +.admin-asset-wrapper .preview-container .preview-detail-container { + width: 100%; +} +.admin-asset-wrapper .preview-coin-container { + display: flex; + margin: 2rem 0rem; +} +.admin-asset-wrapper .preview-coin-container .preview-content { + flex: 1; + align-items: center; + justify-content: center; + display: flex; +} +.admin-asset-wrapper .preview-coin-container .preview-content .currency_ball-wrapper { + width: 80px !important; + height: 80px !important; +} +.admin-asset-wrapper .preview-coin-container .preview-content .line { + position: absolute; + border-top: 1px solid #000; + width: 35px; + top: 12px; + margin-left: 3px; +} +.admin-asset-wrapper .preview-coin-container .preview-content .icon-preview { + width: 94px; + height: 94px; +} +.admin-asset-wrapper .preview-symbol-tip { + position: relative; + left: 35px; + bottom: 22px; +} +.admin-asset-wrapper .preview-symbol-tip .line { + position: absolute; + border-top: 1px solid #000; + width: 50px; + top: 12px; + right: 50px; + margin-right: 3px; +} +.admin-asset-wrapper .preview-name-tip { + position: relative; + top: 8px; + right: 8px; +} +.admin-asset-wrapper .preview-name-tip .line { + position: absolute; + border-top: 1px solid #000; + width: 60px; + top: 12px; + right: 40px; + margin-right: 3px; +} +.admin-asset-wrapper .preview-icon-tip { + position: relative; + left: 30px; +} +.admin-asset-wrapper .preview-icon-tip .line { + position: absolute; + border-top: 1px solid #000; + width: 35px; + top: 12px; + right: 30px; + margin-right: 3px; +} +.admin-asset-wrapper .new-asset-icon { + width: 3rem; +} +.admin-asset-wrapper .preview-detail-container { + border-top: 1px solid #A1A1A1; + color: #ffffff; + padding: 1rem; + width: 65%; +} +.admin-asset-wrapper .type-wrap .warning-container { + position: relative; + display: flex; +} +.admin-asset-wrapper .type-wrap .warning { + position: absolute; + left: 100%; + bottom: 0px; +} +.admin-asset-wrapper .overview-wrap { + display: flex; + justify-content: space-between; + margin-top: 1rem; +} +.admin-asset-wrapper .overview-wrap .configure-btn { + font-size: 32px; + height: auto; +} +.admin-asset-wrapper .overview-wrap .preview-container .preview-content { + flex-direction: column; +} +.admin-asset-wrapper .overview-wrap .preview-container .preview-content .edit-content { + margin-top: 0.25rem; + color: #ffffff; +} +.admin-asset-wrapper .overview-wrap .preview-container .preview-content .description-small { + font-size: 10px; + margin-top: 0.25rem; + text-align: center; + width: 70%; +} +.admin-asset-wrapper .overview-wrap .preview-container .preview-content .remove { + color: #ff4d4f; + text-align: left; + width: 60%; +} +.admin-asset-wrapper .overview-wrap .preview-container .ant-breadcrumb { + margin: 1rem 0rem; +} +.admin-asset-wrapper .overview-wrap .preview-container .ant-breadcrumb .ant-breadcrumb-link, +.admin-asset-wrapper .overview-wrap .preview-container .ant-breadcrumb .ant-breadcrumb-separator { + color: #ffffff; + opacity: 0.6; +} +.admin-asset-wrapper .overview-wrap .preview-container .breadcrumb_active, +.admin-asset-wrapper .overview-wrap .preview-container .ant-breadcrumb .ant-breadcrumb-link:hover { + color: #ffffff; + cursor: pointer; + opacity: 1; +} +.admin-asset-wrapper .overview-wrap .file-container { + border-radius: 4px; + display: block; + padding: 0.25rem; + white-space: nowrap; + position: relative; + width: 105px; +} +.admin-asset-wrapper .overview-wrap .file-container label { + display: block; + padding-bottom: 0; + box-sizing: border-box; +} +.overview-wrap .file-container label .anchor { + color: #0000ff; + text-decoration: underline; + cursor: pointer; +} +.admin-asset-wrapper .overview-wrap .file-container .ant-form-item-control { + line-height: 1; +} +.admin-asset-wrapper .overview-wrap .file-container input { + opacity: 0; + position: fixed; + left: -999px; +} +.admin-asset-wrapper .overview-wrap .icon-upload .file-container { + border: 0px; + width: 105px; + height: 100%; +} +.admin-asset-wrapper .overview-wrap .icon-upload .file-container label { + cursor: pointer; +} +.admin-asset-wrapper .overview-wrap .icon-upload .file-container .upload-box { + background-color: #288500 !important; + color: #ffffff; + font-size: 14px; + font-weight: bold; + padding: 6px; + text-align: center; +} +.admin-asset-wrapper .table-wrapper tr { + height: 4rem; +} +.admin-asset-wrapper .btn-wrapper { + display: flex; + align-items: center; + margin-top: 1rem; +} +.admin-asset-wrapper .btn-wrapper .separator { + margin-left: 1rem; +} +.admin-asset-wrapper .btn-wrapper .apply-btn { + width: 100%; +} \ No newline at end of file diff --git a/web/src/containers/Admin/AdminFinancials/index.js b/web/src/containers/Admin/AdminFinancials/index.js index 3540c9322b..07442e7d60 100644 --- a/web/src/containers/Admin/AdminFinancials/index.js +++ b/web/src/containers/Admin/AdminFinancials/index.js @@ -1,11 +1,11 @@ import React from 'react'; import { Tabs } from 'antd'; -import { MoveToDash } from 'containers'; import Earnings from './Earnings'; import Wallets from '../Wallets'; import DepositPage from '../DepositsPage'; import Transfer from '../Transfers'; +import Assets from './Assets'; import './index.css'; const TabPane = Tabs.TabPane; @@ -18,9 +18,7 @@ const AdminFinancials = ({ router }) => { -
- -
+
diff --git a/web/src/containers/Admin/CreateAsset/AssetConfig.js b/web/src/containers/Admin/CreateAsset/AssetConfig.js new file mode 100644 index 0000000000..8dda40b1c1 --- /dev/null +++ b/web/src/containers/Admin/CreateAsset/AssetConfig.js @@ -0,0 +1,524 @@ +import React, { Fragment, useState } from 'react'; +import { Input, InputNumber, Button, Form, Checkbox, Radio, message } from 'antd'; +import { UploadOutlined } from '@ant-design/icons'; + +import ColorPicker from 'components/ColorPicker'; +import Coins from 'components/Coins'; +// import { getCoinInfo, storeAsset } from '../../common/fetch'; + +const CONTACT_DESCRIPTION_LINK = 'https://metamask.zendesk.com/hc/en-us/articles/360015488811-What-is-a-Token-Contract-Address-'; + +const { Search, TextArea } = Input; + +const radioStyle = { + display: 'flex', + alignItems: 'center', + height: '30px', + lineHeight: '1.2', + padding: '24px 0', + margin: 0, + paddingLeft: '1px', + whiteSpace: 'normal', + letterSpacing: '-0.15px', +}; + +const AssetConfig = (props) => { + const [isSupply, setIsApply] = useState(false); + const [form] = Form.useForm(); + const { + coinFormData = {}, + handleChange, + handleCheckChange, + handleFileChange, + handleMetaChange, + handleNext, + handleBack, + isConfigureEdit, + isEdit + } = props; + const isBlockchainSearch = coinFormData.type === 'blockchain' + && (coinFormData.network === 'eth' || coinFormData.network === 'bnb'); + + const handleSubmit = (values) => { + if (values) { + if (!props.isEdit) { + updateAsset(); + } else { + handleNext(); + } + } + }; + + const updateAsset = async () => { + const body = { + ...props.coinFormData, + } + if (!body.estimated_price) { + body.estimated_price = 1; + } + if (!body.standard) { + body.standard = ""; + } + if (!body.network) { + body.network = ""; + } + if (!body.logo) { + body.logo = ""; + } + if (body.type === 'blockchain' + && body.network === 'eth' + && !isSupply) { + delete body.meta.supply; + } + if (body.decimals) { + body.decimals = parseInt(body.decimals, 10); + } + try { + // const res = {}; + // const res = await storeAsset(body); + // if (props.getCoins) { + // await props.getCoins(); + // } + // if (res && res.data) { + handleNext(); + // } + } catch (error) { + if (error && error.data) { + message.error(error.data.message) + } + } + } + + const handleChangeSupply = (e) => { + if (e.target.value === 'limited') { + props.handleMetaChange(0, 'supply'); + } else { + props.handleMetaChange(e.target.value, 'supply'); + } + }; + + const handleSearch = async (address) => { + const { handleBulkUpdate, handleMetaChange, + // coinFormData + } = props; + // const params = { + // address, + // network: coinFormData.network + // } + try { + // const res = await getCoinInfo(params); + const res = {}; + if (res.data) { + const data = { + ...res.data, + fullname: res.data.name, + symbol: res.data.symbol.toLowerCase() + } + if (res.data && res.data.supply) { + setIsApply(true) + } else { + setIsApply(false) + } + handleBulkUpdate(data); + handleMetaChange(address, 'contract'); + } + } catch (error) { + if (error.data && error.data.message) { + message.error(error.data.message); + } else { + message.error(error.message); + } + } + }; + + const checkCoin = (rule, value, callback) => { + let coinData = props.coins.map(coin => { + return coin.symbol + }) + if (coinData.includes(value)) { + callback('This Asset symbol is already exist'); + } else { + callback(); + } + }; + + const checkLower = (rule, value, callback) => { + if (/[A-Z]/g.test(value)) { + callback('Asset symbol must be in Lower case'); + } else { + callback(); + } + }; + const renderFields = () => { + const { + coinFormData = {}, + handleChange, + } = props; + + if (coinFormData.type === 'blockchain' && (coinFormData.network === 'eth' || coinFormData.network === 'bnb')) { + return ( +
+
+ Contract( + + what's this? + ) +
+ + + +
+ ) + } else if (coinFormData.type === 'blockchain' && coinFormData.network !== 'eth') { + return ( +
+ {coinFormData.network === 'other' ? +
+
Blockchain name
+ + "a"} + /> + +
+ : null + } +
Contract(what's this?)
+ + + +
+ ) + } + } + + return ( + +
Create or add a new coin
+
+
+ {renderFields()} +
Naming and color
+
+ +
+
+ {isBlockchainSearch + ? +
+ Asset name +
+ + {coinFormData.fullname} + +
+ : ( +
+ Asset name{' '} + (required) +
+ + Enter the full name for this asset (example 'Bitcoin') + + + + +
) + } +
+
+ {isBlockchainSearch + ? ( + +
+ Asset symbol +
+ {coinFormData.symbol} +
+ ) : ( + +
+ Asset symbol{' '} + (required) +
+ Enter the shorthand symbol for this asset (example 'BTC') + + + +
+ ) + } +
+
+ Color{' '}(for exchange purposes): +
+ handleMetaChange(val, 'color')} + /> +
+
+
+
+
About
+
+
+
Description
+
Write a short description of this asset
+